我正在创建一个必须一次生成数千个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类中。有没有其他方法来做我想做的事情,或者你有什么建议吗?
答案 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
信息。