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
信息将从缓存中检索,而不是从现有文件中检索。
我正在创建一个必须一次生成数千个 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
信息将从缓存中检索,而不是从现有文件中检索。