2012-11-02 2 views
2

온라인에서 몇 가지 예를 살펴본 후 iTextSharp를 사용하여 pdfs를 병합하는 코드를 작성했습니다. 하지만 오류가 발생합니다. Merge PDFs iTextSharp

은 { "이 문서는 어떠한 페이지가 없습니다."}

그것은 페이지 = writer.GetImportedPage (리더, X)에서 실패; 그것은 내가 그것을 디버깅 3 페이지가

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

: 여기

는 스택 추적한다. 무엇이 잘못 되었습니까 ??

여기 GetImportedPage에 대한

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 <페이지 + 1, X ++) { Page = writer.GetImportedPage (reader, X); writer.AddPage (Page); } – kyleb

답변

6

페이지 번호가 1부터 시작됩니다 내 코드입니다. 따라서 :

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

글쎄, 내 인생의 3 시간 만에 다시는 돌아 가지 않을거야. 그것은 혼란스러운 오류 메시지입니다. 한숨. 귀하의 답변 주셔서 감사합니다, 나는 그것을 빨리 찾았 으면 좋겠 : p –