2009-02-19 80 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

相關問題