2009-02-19 77 views
7

我已经在网上寻找如何做到这一点的例子。我发现了一些似乎更复杂一些的事情,然后他们需要做到。所以我的问题是,使用iTextSharp,是否有一种相当简洁的方式将一个PDF文档附加到另一个PDF文档?是否有直接的方式来使用iTextSharp将一个PDF文档附加到另一个PDF文档?

理想情况下,这不会涉及第三个文件。只需打开第一个PDF文档,将第二个PDF文档附加到第一个PDF文档,然后关闭它们。

回答

5

好的,这不是直接的,但它的工作原理和令人惊讶的快速。 (它使用第三个文件,没有打开和追加的东西。)我在文档/示例中发现了这个。这里的代码:

private void CombineMultiplePDFs(string[] fileNames, string outFile) { 
    int pageOffset = 0; 
    ArrayList master = new ArrayList(); 
    int f = 0; 

    Document document = null; 
    PdfCopy writer = null; 
    while (f < fileNames.Length) { 
     // we create a reader for a certain document 
     PdfReader reader = new PdfReader(fileNames[ f ]); 
     reader.ConsolidateNamedDestinations(); 
     // we retrieve the total number of pages 
     int n = reader.NumberOfPages; 
     ArrayList bookmarks = SimpleBookmark.GetBookmark(reader); 
     if (bookmarks != null) { 
      if (pageOffset != 0) { 
       SimpleBookmark.ShiftPageNumbers(bookmarks, pageOffset, null); 
      } 
      master.AddRange(bookmarks); 
     } 
     pageOffset += n; 

     if (f == 0) { 
      // step 1: creation of a document-object 
      document = new Document(reader.GetPageSizeWithRotation(1)); 
      // step 2: we create a writer that listens to the document 
      writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create)); 
      // step 3: we open the document 
      document.Open(); 
     } 
     // step 4: we add content 
     for (int i = 0; i < n;) { 
      ++i; 
      if (writer != null) { 
       PdfImportedPage page = writer.GetImportedPage(reader, i); 
       writer.AddPage(page); 
      } 
     } 
     PRAcroForm form = reader.AcroForm; 
     if (form != null && writer != null) { 
      writer.CopyAcroForm(reader); 
     } 
     f++; 
    } 
    if (master.Count > 0 && writer != null) { 
     writer.Outlines = master; 
    } 
    // step 5: we close the document 
    if (document != null) { 
     document.Close(); 
    } 
} 
1

是的。我在iText论坛上看到一个名为PdfManipulation的类。但是使用这个类将涉及第三个文件。

该类最初在VB.Net中。我从post on vbforums.com下载它。显然,它没有合并文件功能,所以我根据该类中的代码编写了一个。

这是写在没有iTextSharp的机器上。这可能有错误。我甚至不确定页码是基于0还是1。但给它一个镜头。

public static void MergePdfFiles(IEnumerable<string> files, string output) { 
    iTextSharp.text.Document doc; 
    iTextSharp.text.pdf.PdfCopy pdfCpy; 

    doc = new iTextSharp.text.Document(); 
    pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(output, System.IO.FileMode.Create)); 
    doc.Open(); 

    foreach (string file in files) { 
     // initialize a reader 
     iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(file); 
     int pageCount = reader.NumberOfPages; 

     // set page size for the documents 
     doc.SetPageSize(reader.GetPageSizeWithRotation(1)); 

     for (int pageNum = 1; pageNum <= pageCount; pageNum++) { 
      iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, pageNum); 
      pdfCpy.AddPage(page); 
     } 

     reader.Close(); 
    } 

    doc.Close(); 
} 
+1

页码从1 – 2016-03-01 15:35:16

0

我不知道如何处理PDF文件,但是对于postscript,您只需连接文件。如果你有pdf2ps和PS2PDF安装,下面将做的工作:

pdf2ps file1.pdf file1.ps 
pdf2ps file2.pdf file2.ps 
cat file1.ps file2.ps > combined.ps 
ps2pdf combined.ps combined.pdf 

我不是pdf2ps或PS2PDF专家。我只使用ps2pdf,当我这样做时,它将文本留为文本(我仍然可以从生成的pdf中选择和复制文本)。当我执行上述步骤时(pdf-> ps,combine,ps-> pdf),我最终得到的pdf就像图像一样。不知道为什么。

13

我真的可能会错过一些东西,但我做了更简单的事情。我承认这个解决方案可能不会更新书签(如迄今为止的最佳答案),但它对我来说完美无瑕。由于我将文档与可填写的表单合并,因此我使用了PdfCopyFields而不是PdfCopy。

下面是代码(我已经去除了所有的错误处理,以使实际的代码更明显,加try..finally如果你打算使用的代码,关闭打开的资源):

void MergePdfStreams(List<Stream> Source, Stream Dest) 
    { 
     PdfCopyFields copy = new PdfCopyFields(Dest); 

     foreach (Stream source in Source) 
     { 
      PdfReader reader = new PdfReader(source); 
      copy.AddDocument(reader); 
     } 

     copy.Close(); 
    } 

你可以通过任何流,无论是一个FileStream,一个MemoryStream(读取来自数据库的PDF文件时非常有用,无需临时文件等等)

使用范例:

void TestMergePdfStreams() 
    { 
     List<Stream> sources = new List<Stream>() 
     { 
      new FileStream("template1.pdf", FileMode.Open), 
      new FileStream("template2.pdf", FileMode.Open), 
      new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"]) 
     }; 

     MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create)); 
    } 
+1

这适用于试图合并/附加两个PDF文档与表单域!更简单!谢谢。 – 2012-01-27 18:29:55

相关问题