itextsharp将pdf与acrofields合并 - 合并时字段丢失

时间:2014-06-04 08:50:36

标签: c# itextsharp itext

我现在已经尝试了这个并且它不起作用。 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);
        }
    }
}

1 个答案:

答案 0 :(得分:6)

您正在以错误的方式合并文档。请参阅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();
}
相关问题