【问题标题】:copy pdf form with PdfCopy not working in itextsharp 5.4.5.0使用 PdfCopy 复制 pdf 表单在 itextsharp 5.4.5.0 中不起作用
【发布时间】:2014-01-06 12:52:42
【问题描述】:

在 iText 5.4.4 的发行说明中说:

从现在开始,您现在可以合并表单并保留标记的 PDF 在 PdfCopy 中使用 addDocument() 方法时的结构。同时 时间,我们已经弃用了 PdfCopyFields。*

我尝试将多个 pdf 文档合并为一个 pdf 文档。如果这些文档之一是带有 acroFields 的 pdf 表单,则这些字段将在输出文档中不可见。当我在 PdfCopy 中使用 addDocument() 方法时就是这种情况。 当我在 PdfCopyFields 中使用 addDocument() 方法时,它工作正常。 PdfCopyFields 在 iTextSharp 中已弃用,但 PdfCopy 是否正常工作?不使用 PdfCopyFields 的另一个原因(来自“iText in Action”:

不要使用 PdfCopyFields 连接没有表单的 PDF 文档 字段。与使用 PdfCopy 连接文档相反,Pdf- CopyFields 需要将所有文档保存在内存中以更新 组合形式。如果您尝试这样做,这可能会出现问题 连接大型文档。

这是我使用的代码:

public static void MergePdfs4()
{
    var f1 = @"C:\Users\paulusj\Downloads\OoPdfFormExampleFilled.pdf";
    var f2 = @"c:\GEODAN\work\EV_Original.pdf";

    using (
        Stream outputPdfStream = new FileStream("combined4.pdf ", FileMode.Create, FileAccess.Write,
            FileShare.None))
    {
        var document = new Document();
        var copy = new PdfCopy(document, outputPdfStream);
        document.Open();
        copy.AddDocument(new PdfReader(f1));
        copy.AddDocument(new PdfReader(f2));
        copy.Close();
    }
}

奇怪的是,当我使用 Adob​​e Reader“另存为”复制 EV_Original.pdf 时,副本(几乎)正确合并。所以在输出 pdf 中我可以看到表单字段。
当我使用此代码时:

public static void MergePdfs3()
{
    var f1 = @"C:\Users\paulusj\Downloads\OoPdfFormExampleFilled.pdf";
    var f2 = @"c:\GEODAN\work\EV_Original.pdf";

    using (Stream outputPdfStream = new FileStream("combined3.pdf ", FileMode.Create, FileAccess.Write,
            FileShare.None))
    {

        var copy = new PdfCopyFields(outputPdfStream);
        copy.AddDocument(new PdfReader(f1));
        copy.AddDocument(new PdfReader(f2));
        copy.Close();
    }
}

它工作正常。但是在这段代码中使用了 PdfCopyFields。

使用的 pdf 可以在这里找到:
Example.pdf
EV_Original.pdf

是 EV_Original.pdf 有问题,还是 PdfCopy 没有正确实现?

【问题讨论】:

    标签: forms pdf copy itextsharp


    【解决方案1】:

    这里有几个问题。

    1) 您必须为PdfCopy 启用表单域合并:

    // ...
    var copy = new PdfCopy(document, outputPdfStream);
    copy.SetMergeFields();
    document.Open();
    // ...
    

    这适用于 iText 5.4.5 (Java),但对于 iTextSharp Reader/Acrobat,在显示合并文档的第 2 页时会抱怨嵌入字体。这可能是移植问题。

    2) EV_Original.pdf 没有表单域的外观(“可视化”)。相反,它设置了NeedAppearances 标志。这表明 PDF 查看器在显示文档时需要生成外观。

    PdfCopy 目前无法正确处理NeedAppearances,因此未在输出文档中设置。这需要在 iText 中修复。作为一种解决方法,您可以在合并后在输出文档上设置NeedAppearances

    PdfReader postreader = new PdfReader("combined4.pdf");
    PdfStamper poststamper = new PdfStamper(postreader, new FileStream("combined4-needappearances.pdf", FileMode.Create));
    poststamper.AcroFields.GenerateAppearances = true;
    poststamper.Close();
    

    但考虑到 iTextSharp 5.4.5 中的移植错误,我建议使用 PdfCopyFields 直到 PdfCopy 在下一个版本中修复。合并 Acroform 时,PdfCopyFieldsPdfCopy 的内存使用情况相似。这是 Acroform 合并所固有的:需要将更多信息保存在内存中。这就是为什么必须在 PdfCopy 中使用 SetMergeFields() 显式启用它。

    【讨论】:

    • PdfCopy 目前无法正确处理NeedAppearances,因此未在输出文档中设置。 - 我想知道这是否是个好主意如果一个源文件设置了它,只需设置 NeedAppearances (因为它现在已被修复)。这可能会对具有自定义外观的其他来源的字段产生不良影响。不过,只是一种感觉,没有任何失败的样本支持......
    • copy.SetMergeFields();救了我的命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2013-01-08
    相关资源
    最近更新 更多