2012-07-25 10 views
5

Làm cách nào để thêm đúng (các) trang từ tệp PDF hiện có trên đĩa vào tài liệu PDF hiện đang được tạo trong bộ nhớ?Thêm tệp PDF hiện có từ tệp vào tài liệu không được sử dụng bằng cách sử dụng iTextSharp

Chúng tôi có một lớp sản xuất tài liệu PDF bằng iTextSharp. Điều này hoạt động tốt. Tại thời điểm này chúng ta thêm một khoản & điều kiện như một hình ảnh ở trang cuối cùng:

this.nettPriceListDocument.NewPage(); 
this.currentPage++; 
Image logo = Image.GetInstance("/inetpub/Applications/Trade/Reps/images/TermsAndConditions.gif"); 
logo.SetAbsolutePosition(0, 0); 
logo.ScaleToFit(this.nettPriceListDocument.PageSize.Width, this.nettPriceListDocument.PageSize.Height); 
this.nettPriceListDocument.Add(logo); 

Tôi có hình ảnh này như một tài liệu PDF và muốn gắn nó. Nếu tôi có thể tìm ra điều này, bạn có thể thêm các tài liệu PDF khác mà chúng tôi có thể cần vào những gì tôi đang tạo.

Tôi đã thử:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfWriter writer = PdfWriter.GetInstance(this.nettPriceListDocument, this.nettPriceListMemoryStream); 
PdfContentByte content = writer.DirectContentUnder; 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.nettPriceListDocument.NewPage(); 
    this.currentPage++; 
    PdfImportedPage newpage = writer.GetImportedPage(reader, pageno); 
    content.AddTemplate(newpage, 1f, 1f); 
} 

Những kết quả trong một "tài liệu không mở" ngoại lệ tại writer.DirectContentUnder

Tôi cũng đã thử:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfConcatenate concat = new PdfConcatenate(this.nettPriceListMemoryStream); 
concat.AddPages(reader); 

nào dẫn đến chèn một trang trống, có kích thước kỳ lạ trên trang đầu tiên thông thường của tài liệu.

Tôi cũng đã thử:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopy copier = new PdfCopy(nettPriceListDocument, nettPriceListMemoryStream); 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.currentPage++; 
    PdfImportedPage newpage = copier.GetImportedPage(reader, pageno); 
    copier.AddPage(newpage); 
} 
copier.Close(); 
reader.Close(); 

Những kết quả trong một NullReferenceException tại copier.AddPage(newpage).

Tôi cũng đã thử:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopyFields copier = new PdfCopyFields(nettPriceListMemoryStream); 
copier.AddDocument(reader); 

này cũng dẫn đến một NullReferenceException tại copier.AddDocument(reader).

Tôi có hầu hết các ý tưởng này từ các câu hỏi và câu trả lời khác nhau của StackOverflow. Một điều mà dường như không ai đối phó, đang thêm (các) trang mới từ một tệp PDF hiện có, vào một tài liệu trong bộ nhớ đã tồn tại chưa được ghi vào tệp PDF trên đĩa. Tài liệu này đã được mở và có các trang dữ liệu được ghi vào đó. Nếu tôi để lại Điều khoản & Quy trình điều kiện này, hoặc chỉ cần viết nó là một hình ảnh (như ban đầu), thì kết quả là PDF xuất hiện rất tốt.

Để hoàn tất khi tôi bắt đầu: Làm cách nào để thêm đúng (các) trang từ tệp PDF hiện có trên đĩa vào tài liệu PDF hiện đang được tạo trong bộ nhớ?

Cảm ơn và đánh giá cao trước sự suy nghĩ của bạn về điều này. Vui lòng cho tôi biết nếu tôi có thể cung cấp thêm thông tin.

Trả lời

7

Đây là phương pháp hợp nhất đơn giản sao chép tệp PDF thành một tệp PDF. Tôi sử dụng phương pháp này khá thường xuyên khi hợp nhất các tệp PDF. Tôi đã sử dụng điều này để hợp nhất các trang có kích thước khác nhau mà không có vấn đề. Hy vọng nó giúp.

public MemoryStream MergePdfForms(List<byte[]> files) 
{ 
    if (files.Count > 1) 
    { 
     PdfReader pdfFile; 
     Document doc; 
     PdfWriter pCopy; 
     MemoryStream msOutput = new MemoryStream(); 

     pdfFile = new PdfReader(files[0]); 

     doc = new Document(); 
     pCopy = new PdfSmartCopy(doc, msOutput); 

     doc.Open(); 

     for (int k = 0; k < files.Count; k++) 
     { 
      pdfFile = new PdfReader(files[k]); 
      for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
      { 
       ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
      } 
      pCopy.FreeReader(pdfFile); 
     } 

     pdfFile.Close(); 
     pCopy.Close(); 
     doc.Close(); 

     return msOutput; 
    } 
    else if (files.Count == 1) 
    { 
     return new MemoryStream(files[0]); 
    } 

    return null; 
} 
+0

Cảm ơn @ Jonathan, nếu tôi không thể gọi 'Document.Open()' vì tài liệu đã mở và đã có nhiều thành phần đã được thêm vào? – Troy

+0

@Nevyn Bạn có thể đóng tài liệu và sau đó mở lại tài liệu thông qua quá trình hợp nhất. Tất cả những gì bạn cần làm là đóng tài liệu, sau đó chuyển các mảng byte của tài liệu của bạn sang phương thức hợp nhất, nó sẽ trả về một bộ nhớ của tài liệu đã được hợp nhất mới của bạn. – Jonathan