使用PdfCopy复制pdf表单在itextsharp 5.4.5.0中不起作用

时间:2013-12-18 11:12:00

标签: forms pdf copy itextsharp

在iText 5.4.4的发行说明中,它说:

  

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

我尝试将多个pdf文档合并为一个pdf文档。如果其中一个文档是带有acroFields的pdf表单,那么这些字段在输出文档中将不可见。当我在PdfCopy中使用addDocument()方法时就是这种情况。 当我在PdfCopyFields中使用addDocument()方法时,它工作正常。在iTextSharp中弃用PdfCopyFields,但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();
    }
}

奇怪的是,当我使用Adobe 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没有正确实现?

1 个答案:

答案 0 :(得分:6)

这里有几个问题。

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。合并Acroforms时,PdfCopyFieldsPdfCopy的内存使用情况类似。这是Acroform合并所固有的:需要在内存中保留更多信息。这就是为什么必须使用PdfCopySetMergeFields()中明确启用它。