ItextSharp中的Pdf合并问题(合并Pdfs后不保留其值)

我们正在尝试使用ITextSharp合并三个PDF。 问题是合并后我们只能从第一个PDF获取数据,而其他两个PDF不保留其值。

所有这些PDF都具有相同的结构(即它们使用相同的模板和不同的数据),因此我的假设是它们具有相同的字段(AcroFields),这可能会在合并时产生此问题。

这是合并代码:

public void MergeFiles(string destinationFile, string[] sourceFiles) { try { int f = 0; string outFile = destinationFile; Document document = null; PdfCopy writer = null; while (f < sourceFiles.Length) { // Create a reader for a certain document PdfReader reader = new PdfReader(sourceFiles[f]); // Retrieve the total number of pages int n = reader.NumberOfPages; //Trace.WriteLine("There are " + n + " pages in " + sourceFiles[f]); if (f == 0) { // Step 1: Creation of a document-object document = new Document(reader.GetPageSizeWithRotation(1)); // Step 2: Create a writer that listens to the document writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create)); // Step 3: Open the document document.Open(); } // Step 4: Add content PdfImportedPage page; for (int i = 0; i < n; ) { ++i; if (writer != null) { page = writer.GetImportedPage(reader, i); writer.AddPage(page); } } PRAcroForm form = reader.AcroForm; if (form != null) { if (writer != null) { writer.CopyAcroForm(reader); } } f++; } // Step 5: Close the document if (document != null) { document.Close(); } } catch (Exception) { //handle exception } } 

这称为如下:

  string[] sourcenames = { @"D:\1.pdf", @"D:\2.pdf", @"D:\3.pdf" }; string destinationname = @"D:\pdf\mergeall\merge3.pdf"; MergeFiles(destinationname, sourcenames); 

我经过一番搜索后想出来……以下是解决方案……

我创建了重命名PDF中字段的function,以便在合并后重命名字段。

 private static int counter = 0; private void renameFields(PdfReader pdfReader) { try { string prepend = String.Format("_{0}", counter++); foreach (DictionaryEntry de in pdfReader.AcroFields.Fields) { pdfReader.AcroFields.RenameField(de.Key.ToString(), prepend + de.Key.ToString()); } } catch (Exception ex) { throw ex; } } 

在“MergeFiles”函数中调用此函数如下…

  // Create a reader for a certain document PdfReader reader = new PdfReader(sourceFiles[f]); renameFields(reader); // Retrieve the total number of pages int n = reader.NumberOfPages;