我现在已经尝试了这个并且它不起作用。 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);
}
}
}
答案 0 :(得分:6)
您正在以错误的方式合并文档。请参阅MergeForms
以了解如何正确执行此操作。代码中缺少的关键字是:
copy.setMergeFields();
没有它,字段就会消失(正如你所注意到的那样)。
还有一个MergeForms2
示例解释了如何合并两个相同的表单。在这种情况下,您需要重命名字段,因为每个字段都需要具有唯一的名称。我正在添加对第二个示例的引用,因为我看到您也尝试重命名字段。但是,您的代码存在严重缺陷:您创建了一个stamper
对象,但您永远不会stamper.close()
。您对reader
对象的使用也存在问题。总而言之,最好丢弃你的代码,并使用官方iText网站上的两个例子重新开始。
更新:我已将标记itext和itextsharp添加到您的问题中。只有这时我注意到你使用的是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();
}