2012-11-02 86 views
2

我在網上查了幾個例子,想出了使用iTextSharp合併pdf的代碼。但是我得到一個錯誤:。合併PDFs iTextSharp

{ 「該文檔沒有頁。」}

它未能在頁= writer.GetImportedPage(讀取器,X);

這裏是堆棧跟蹤:

at iTextSharp.text.pdf.PdfPages.WritePageTree() 
at iTextSharp.text.pdf.PdfWriter.Close() 
at iTextSharp.text.pdf.PdfCopy.Close() 
at iTextSharp.text.Document.Close() 

它有3頁,當我調試它。這裏有什麼問題?

這裏是我的代碼

public static MemoryStream MergePdfs(List<MemoryStream> pdfStreams) 
     { 
     //Create output stream 
      MemoryStream OutStream = new MemoryStream(); 
      Document Document = null; 

      try 
      { 
       //Create Main reader 
       PdfReader Reader = new PdfReader(pdfStreams.ElementAt(0)); 
       //Create Main Doc 
       Document = new Document(Reader.GetPageSizeWithRotation(1)); 
       //Create main writer 
       PdfCopy Writer = new PdfCopy(Document, OutStream); 
       //Open document for writing 
       Document.Open(); 
       //Add pages 
       AddPages(Reader.NumberOfPages, Reader, ref Writer); 

       //For each additional pdf after first combine them into main document 
       foreach (MemoryStream PdfStream in pdfStreams.Skip(1)) 
       { 
        PdfReader Reader2 = new PdfReader(PdfStream); 
        // Add content 
        AddPages(Reader2.NumberOfPages, Reader2, ref Writer); 
       } 
      } 
      finally 
      { 
       // Step 5: Close the document 
       if (Document != null) 
        Document.Close(); 

       foreach (var Strm in pdfStreams) 
       { 
        try { if (null != Strm) Strm.Dispose(); } catch { } 
       } 
      } 

      return OutStream; 
     } 

     private static void AddPages(int Pages, PdfReader reader, ref PdfCopy writer) 
     { 
      PdfImportedPage Page = null; 

      for (int X = 0; X < Pages; X++) 
      { 
       Page = writer.GetImportedPage(reader, X); 
       writer.AddPage(Page); 
      } 

      if (reader.AcroForm != null) 
       writer.CopyAcroForm(reader); 
     } 
+0

我傳入的MemoryStream是從byte []的。這意味着他們已經完成了PDF格式,所以他們不應該有任何問題,他們不完整或任何東西。我真的很想避免先把它們寫到磁盤上,然後再次讀取它們,像我在網上看到的其他例子那樣合併它們。這就是爲什麼我使用內存流編寫這個自定義的。 – kyleb

+1

GetImportedPage的頁碼爲1。 – mkl

+0

謝謝。你可以發表你的評論作爲答案,所以我把它標記爲正確的。謝謝。答案是我需要函數中的循環看起來像這樣,它的工作原理。 for(int X = 1; X kyleb

回答

6

爲GetImportedPage頁碼是基於1的。因此:

for (int X = 1; X < Pages + 1; X++) 
{ 
    Page = writer.GetImportedPage(reader, X); 
    writer.AddPage(Page); 
} 
+0

那麼,我的生活有3個小時,我永遠不會回來。這是一個令人困惑的錯誤消息..感嘆。感謝您的回答,我希望我早日發現它:p –