Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript iText PDF读卡器打开极慢_Javascript_Itextsharp_Itext - Fatal编程技术网

Javascript iText PDF读卡器打开极慢

Javascript iText PDF读卡器打开极慢,javascript,itextsharp,itext,Javascript,Itextsharp,Itext,我有一些代码组合了几页acro表单(tact中有acrofields),然后在最后将一些JS写入整个文档 添加JS的函数中的PdfReader需要非常长的时间来实例化(对于1MB文件大约12秒) 下面是代码(非常简单): 我已经对以上内容进行了基准测试,速度慢的是第一条线。我尝试从文件而不是内存中读取它,并尝试使用MemoryStream而不是randomAccessFileOrray。没有什么能让它更快 如果我将JS添加到一个单页文档中,速度会非常快。因此,我的想法是,组合页面的代码在某种程度

我有一些代码组合了几页acro表单(tact中有acrofields),然后在最后将一些JS写入整个文档

添加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();
}