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

 Dr-xuan_484 发布于 2023-02-09 14:45

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

从现在开始,您可以在PdfCopy中使用addDocument()方法时合并表单并保留标记的PDF结构.与此同时,我们已经弃用了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 个回答
  • 这里有几个问题.

    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查看器在显示文档时需要生成外观.

    PdfCopyNeedAppearances此刻不能正确处理,因此未在输出文档中设置.这需要在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合并所固有的:需要在内存中保留更多信息.这就是为什么必须在PdfCopy使用时明确启用它SetMergeFields().

    2023-02-09 14:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有