Forms 在itextsharp 5.4.5.0中无法使用PdfCopy复制pdf表单

Forms 在itextsharp 5.4.5.0中无法使用PdfCopy复制pdf表单,forms,pdf,copy,itextsharp,Forms,Pdf,Copy,Itextsharp,iText 5.4.4的发行说明中指出: 从现在起,您可以合并表单并保留标记的PDF 在PdfCopy中使用addDocument()方法时。同时 时间,我们已经弃用了PdfCopyFields* 我尝试将多个pdf文档合并为一个pdf文档。如果其中一个文档是带有字段的pdf表单,则这些字段在输出文档中不可见。在PdfCopy中使用addDocument()方法时就是这种情况。 当我在PdfCopyFields中使用addDocument()方法时,效果很好。iTextSharp中不推荐使用Pd

iText 5.4.4的发行说明中指出:

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

我尝试将多个pdf文档合并为一个pdf文档。如果其中一个文档是带有字段的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可在此处找到:


EV_Original.pdf是否有问题,或者PdfCopy是否没有正确实施?

这里有几个问题

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没有表单字段的外观(“可视化”)。相反,它设置了
needappearancess
标志。这表示PDF查看器在显示文档时需要生成外观

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

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
。合并表单时,
PdfCopyFields
PdfCopy
的内存使用情况类似。这是Acroform合并的固有特性:需要在内存中保存更多信息。这就是为什么必须在
PdfCopy
中使用
SetMergeFields()

PdfCopy
此时无法正确处理
NeedAppearances
,因此无法在输出文档中设置它的原因。-我想知道如果设置了一个源文件(现在已经修复了),那么简单地设置外观是否是一个好主意。这可能会对来自具有自定义外观的其他源的字段产生不必要的影响。不过,这只是一种感觉,失败的示例并没有支持任何东西…copy.SetMergeFields();救了我的命