Itextsharp PdfReader 很慢

Itextsharp PdfReader is slow

我正在创建一个必须一次生成数千个 PDF 文件的应用程序。我正在使用 ITextSharp 来执行此操作,但 PdfReader 似乎正在减慢该过程。下面是我的代码。

using (MemoryStream foutput = new MemoryStream())  
{
    using (PdfReader pdf = new PdfReader(templateByteArray)) // slow
     {
          using (PdfStamper stamper = new PdfStamper(pdf, foutput))
          {
               AcroFields form = stamper.AcroFields;
               form.SetField(_dic[@"1,1"], "some string1");
               form.SetField(_dic[@"1,2"], "some string2");
               stamper.FormFlattening = true;
           }
           pdf.RemoveUsageRights();
      }
      EnqueueFile(foutput.ToArray());
}

我有一个单独的消费者线程,它获取每个字节数组并将 PDF 文档从队列写入 HDD。把代码弄乱后,貌似瓶颈在PdfReaderclass。是否有替代方法来完成我正在尝试做的事情,或者您有什么建议吗?

您正在一遍又一遍地阅读字段 _dic[@"1,1"]_dic[@"1,1"] 的属性。您应该缓存这些属性。在 Java 中,这样做是这样的:

HashMap<String,TextField> fieldCache = new HashMap<String,TextField>();

此缓存存储有关遇到的每个 TextField 的信息。你用setFieldCache()方法引入它:

public void manipulatePdf(String src, String dest,
    HashMap<String,TextField> cache, String name, String login)
    throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    AcroFields form = stamper.getAcroFields();
    form.setFieldCache(cache);
    form.setField("test", "test");
    stamper.close();
    reader.close();
}

第一次遇到名称为"test"的字段时,将从现有文件中读取信息。下次遇到时,TextField 信息将从缓存中检索,而不是从现有文件中检索。