Javascript iText PDF读卡器打开极慢
我有一些代码组合了几页acro表单(tact中有acrofields),然后在最后将一些JS写入整个文档 添加JS的函数中的Javascript iText PDF读卡器打开极慢,javascript,itextsharp,itext,Javascript,Itextsharp,Itext,我有一些代码组合了几页acro表单(tact中有acrofields),然后在最后将一些JS写入整个文档 添加JS的函数中的PdfReader需要非常长的时间来实例化(对于1MB文件大约12秒) 下面是代码(非常简单): 我已经对以上内容进行了基准测试,速度慢的是第一条线。我尝试从文件而不是内存中读取它,并尝试使用MemoryStream而不是randomAccessFileOrray。没有什么能让它更快 如果我将JS添加到一个单页文档中,速度会非常快。因此,我的想法是,组合页面的代码在某种程度
PdfReader
需要非常长的时间来实例化(对于1MB文件大约12秒)
下面是代码(非常简单):
我已经对以上内容进行了基准测试,速度慢的是第一条线。我尝试从文件而不是内存中读取它,并尝试使用MemoryStream
而不是randomAccessFileOrray
。没有什么能让它更快
如果我将JS添加到一个单页文档中,速度会非常快。因此,我的想法是,组合页面的代码在某种程度上使PdfReader
的PDF阅读速度变慢
以下是联合收割机代码:
public static byte[] CombineFiles(List<byte[]> sourceFiles)
{
MemoryStream output = new MemoryStream();
PdfCopyFields copier = new PdfCopyFields(output);
try
{
output.Position = 0;
foreach (var fileBytes in sourceFiles)
{
PdfReader fileReader = new PdfReader(fileBytes);
copier.AddDocument(fileReader);
}
}
catch (Exception exception)
{
//throw
}
finally
{
copier.Close();
}
byte[] concat = output.GetBuffer();
return concat;
}
公共静态字节[]组合文件(列出源文件)
{
MemoryStream输出=新的MemoryStream();
PdfCopyFields复印机=新的PdfCopyFields(输出);
尝试
{
输出位置=0;
foreach(sourceFiles中的var fileBytes)
{
PdfReader fileReader=新的PdfReader(fileBytes);
复印机。添加文档(文件阅读器);
}
}
捕获(异常)
{
//扔
}
最后
{
复印机关闭();
}
字节[]concat=output.GetBuffer();
返回concat;
}
我正在使用PdfCopyFields
,因为我需要保留表单字段,因此无法使用PdfCopy
或PdfSmartCopy
。这种组合代码非常快(几毫秒)并生成工作文档。上面的AddJS代码在它之后被调用,PdfReader
open是慢段
有什么想法吗?如文件所述,
PdfCopyFields
确实很慢。但是,PdfCopyFields
已弃用或即将弃用,取而代之的是PdfCopy
。沙箱中有两个示例显示了它是如何完成的:(复制表单而不重命名字段)和(重命名字段后复制表单)。这就是MergeForms
的外观:
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
copy.setMergeFields();
document.open();
for (PdfReader reader : readers) {
copy.addDocument(reader);
}
document.close();
for (PdfReader reader : readers) {
reader.close();
}
请注意,您需要最新的iText版本来运行此代码。(注释转换为答案)
在
MemoryStream
上使用GetBuffer()。相反,应始终使用ToArray()
。有关这方面的更多信息,请访问。谢谢你,布鲁诺。但是PdfCopyFields对我来说并不慢。200毫秒合并7页(我同意)。问题在于,在AddJavascript函数中实例化新的PdfReader需要12-14秒才能加载7页的组合文件。这很奇怪,真的很奇怪。不幸的是,我不能复制这个。我只使用Java版本。我对C#port不太熟悉。iText由iText集团公司支付的开发人员持续移植到iTextSharp。因此,您将无法获得iTextSharp的多少免费支持。付费开发者只在付费支持系统上活跃(这是有意义的)。你能分享那个pdf吗?我习惯用iText PdfReader以更快的方式打开几MB大小的文件。因此,您的pdf可能有些特殊,或者与您的环境有关。这与您的问题无关,但如果使用GetBuffer()
,您偶尔会创建损坏的pdf。相反,您应该使用ToArray()
。请看,我无法使用C#重现速度问题。你能发布你的PDF和JavaScript或者两者的代表性样本版本吗?克里斯·哈斯:谢谢!GetBuffer/ToArray就是问题所在!从12秒到4秒!请写一个答案,这样我可以给你信用。
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
copy.setMergeFields();
document.open();
for (PdfReader reader : readers) {
copy.addDocument(reader);
}
document.close();
for (PdfReader reader : readers) {
reader.close();
}