iText的急剧合并PDF文件与acrofields - 场失踪合并时(itext sharp m

2019-09-28 17:33发布

我现在已经尝试这样做,它不工作。 form.GenerateAppearances = true; 我合并我的2个文件,然后保存它。 然后,我再次打开它来填充所有字段。 它说,所有的Acrofields键都没有了,但是当我在硝基打开它亲它的存在。 为什么我不能看到他们的代码? 我一定要添加的东西我之前保存?

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);
        }
    }
}

Answer 1:

要合并的文件错误的方式。 见MergeForms找出如何正确地做到这一点。 那是在你的代码所缺少的关键线,是:

copy.setMergeFields();

没有它,场消失(因为你已经注意到)。

还有一个MergeForms2解释如何合并两个相同的表格的例子。 在这种情况下,你需要重命名字段,因为每个领域都需要有一个唯一的名称。 我加入到这个第二例的参考,因为我看到你也尝试重命名的字段。 然而,有,在代码中的一个严重缺陷:你创建一个stamper的对象,但你永远不会做stamper.close() 您使用的reader对象也存在问题。 总而言之,这将是最好扔掉你的代码,并使用从官方iText站点的两个例子来重新开始。

更新:我已经添加了标签的iText和iTextSharp的你的问题。 只有这样,我注意到您使用iTextSharp的代替的iText的。 移植Java代码到C#应该是容易让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();
}


文章来源: itext sharp merge pdfs with acrofields - fields go missing when merging