Itextsharp PdfReader很慢

时间:2016-06-22 18:43:11

标签: c# itext

我正在创建一个必须一次生成数千个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。在我搞乱代码之后,似乎瓶颈在PdfReader类中。有没有其他方法来做我想做的事情,或者你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您正在反复阅读字段_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信息。