【问题标题】:itext sharp merge pdfs with acrofields - fields go missing when mergingitext 将 pdf 与 acrofields 锐合并 - 合并时字段丢失
【发布时间】:2014-06-04 08:50:35
【问题描述】:

我现在已经尝试过了,但它不起作用。 form.GenerateAppearances = true; 我合并了我的 2 个文档,然后保存。然后我再次打开它以填充所有字段。它说所有的 Acrofields 键都不见了,但是当我在 Nitro pro 中打开它时,它就在那里。为什么我在代码中看不到它们?在保存之前我必须添加一些东西吗?

private static void CombineAndSavePdf1(string savePath, List<string> lstPdfFiles)
{
    using (Stream outputPdfStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        Document document = new Document();
        PdfSmartCopy copy = new PdfSmartCopy(document, outputPdfStream);
        document.Open();
        PdfReader reader;
        int totalPageCnt;
        PdfStamper stamper;
        string[] fieldNames;
        foreach (string file in lstPdfFiles)
        {
            reader = new PdfReader(file);
            totalPageCnt = reader.NumberOfPages;
            for (int pageCnt = 0; pageCnt < totalPageCnt; )
            {
                //have to create new reader for each page or PdfStamper will throw error
                reader = new PdfReader(file);
                stamper = new PdfStamper(reader, outputPdfStream);
                fieldNames = new string[stamper.AcroFields.Fields.Keys.Count];
                stamper.AcroFields.Fields.Keys.CopyTo(fieldNames, 0);
                foreach (string name in fieldNames)
                {
                    stamper.AcroFields.RenameField(name, name);
                }

                copy.AddPage(copy.GetImportedPage(reader, ++pageCnt));

            }
            copy.FreeReader(reader);
        }
    }
}

【问题讨论】:

    标签: c# itextsharp itext


    【解决方案1】:

    您以错误的方式合并文档。请参阅MergeForms 以了解如何正确执行此操作。您的代码中缺少的关键行是:

    copy.setMergeFields();
    

    没有它,字段就会消失(如您所见)。

    还有一个MergeForms2 示例解释了如何合并两个相同的表单。在这种情况下,您需要重命名字段,因为每个字段都需要有一个唯一的名称。我正在添加对第二个示例的引用,因为我看到您也尝试重命名这些字段。但是,您的代码中有一个严重的缺陷:您创建了一个stamper 对象,但您从未创建stamper.close()。您对reader 对象的使用也存在问题。总而言之,最好扔掉你的代码,并使用 iText 官方网站上的两个示例重新开始。

    更新:我已将标签 添加到您的问题中。直到那时我才注意到您使用的是 iTextSharp 而不是 iText。对于 C# 开发人员来说,将 Java 代码移植到 C# 应该很容易,但我从未编写过 C# 程序,所以请像使用伪代码一样使用 JAVA 示例。 C# 中的代码不会有那么不同。

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        Document document = new Document();
        PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
        copy.setMergeFields();
        document.open();
        List<PdfReader> readers = new ArrayList<PdfReader>();
        for (int i = 0; i < 3; ) {
            PdfReader reader = new PdfReader(renameFields(src, ++i));
            readers.add(reader);
            copy.addDocument(reader);
        }
        document.close();
        for (PdfReader reader : readers) {
            reader.close();
        }
    }
    
    public byte[] renameFields(String src, int i) throws IOException, DocumentException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, baos);
        AcroFields form = stamper.getAcroFields();
        Set<String> keys = new HashSet<String>(form.getFields().keySet());
        for (String key : keys) {
            form.renameField(key, String.format("%s_%d", key, i));
        }
        stamper.close();
        reader.close();
        return baos.toByteArray();
    }
    

    【讨论】:

    • 好的,请采纳;当答案有帮助时,这是习惯。
    • 添加了 stamper.FormFlatening = true;让它为我工作。否则压模在所有页面中填充相同的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2019-01-03
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多