2012-12-21 37 views
7

Tôi đang sử dụng iText (cụ thể iTextSharp 4.1.6) và tôi muốn tạo PDF bằng cách kết hợp các trang từ các tệp PDF hiện có mà còn chèn các trang mới được tạo từ một hình ảnh.iText - cách thêm trang vào tài liệu được tạo bằng PdfCopy

Tôi có hai phần này hoạt động riêng biệt bằng cách sử dụng PdfCopy và PdfWriter tương ứng. Mã để tạo ra một trang từ một hình ảnh trông như thế này:

PdfWriter pw = PdfWriter.GetInstance(doc, outputStream); 
Image img = Image.GetInstance(inputStream); 
doc.Add(img); 
doc.NewPage(); 

Bây giờ, Từ PdfCopy thừa hưởng từ PdfWriter, tôi nghĩ rằng tôi sẽ có thể thêm như "trang hình ảnh" để đối tượng PdfCopy của tôi bằng cách sử dụng kỹ thuật tương tự, nhưng nó không hoạt động (nếu bạn khởi tạo PdfCopy thay vì PdfWriter trong ví dụ trên, không có gì xuất hiện trên trang).

Nhìn nhanh mã nguồn, tôi nhận thấy rằng khi contstructor cho PdfCopy gọi hàm tạo superclass nó làm như vậy với đối tượng Document mới, không phải là một đối tượng được truyền vào, vì vậy tôi đoán đây là lý do.

Có cách nào tốt hơn để thực hiện việc này không? Hiện tại, dự đoán tốt nhất của tôi là tạo một trang Pdf từ hình ảnh bằng cách sử dụng PdfWriter và sau đó thêm nó vào tài liệu bằng PdfCopy, nhưng điều đó có vẻ giống như một chút giải pháp.

+1

Những gì bạn mô tả như một công trình xung quanh đối với tôi dường như là một giải pháp thích hợp. PdfCopy được thiết kế để kết hợp nhiều tệp PDF và bạn áp dụng nó cho các tệp pdf hiện có trước đó của mình và tệp mới được tạo. nếu hình ảnh không quá lớn, bạn có thể tạo tệp PDF đó trong bộ nhớ (byte []) và đọc nó từ đó; do đó, thậm chí không cần thêm các tệp tạm thời. – mkl

+0

Cảm ơn - Tôi không quá quen thuộc với iText và nó có vẻ rất đầy đủ tính năng mà tôi chỉ không chắc chắn nếu có một cách hoàn toàn khác để làm điều này. Tôi đã thực hiện nó tạo PDF tạm thời trong bộ nhớ và tất cả đều hoạt động đáng yêu :-) – Andy

Trả lời

7

Gần đây tôi có vấn đề này và câu trả lời ở đây thực sự hữu ích. Trường hợp sử dụng của tôi về cơ bản là "Lấy một loạt các tệp PDF và hình ảnh (.jpg, .png v.v ...) và kết hợp tất cả chúng thành 1 PDF". Tôi đã phải sử dụng PdfCopy vì nó bảo tồn những thứ như các trường biểu mẫu và nhãn, nơi PdfWriter không. Về cơ bản, vì PdfCopy sẽ không cho phép bạn tạo trang mới với addPage(), bạn phải tạo một tệp PDF mới trong bộ nhớ với hình ảnh trên trang và sau đó sử dụng PdfCopy để sao chép trang từ tệp PDF đó.

Ví dụ:

Document pdfDocument = new Document(); 
    ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); 
    PdfCopy copy = new PdfCopy(pdfDocument, pdfOutputStream); 

    pdfDocument.open(); 

    for (File file : allFiles) { 
     if (/* file is PDF */) { 
      /* Copy all the pages in the PDF file into the new PDF */ 
      PdfReader reader = new PdfReader(file.getAllBytes()); 
      for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
       copy.addPage(copy.getImportedPage(reader, i); 
      } 
     } else { 
      /* File is image. Create a new PDF in memory, write the image to its first page, and then use PdfCopy to copy that first page back into the main PDF */ 
      Document imageDocument = new Document(); 
      ByteArrayOutputStream imageDocumentOutputStream = new ByteArrayOutputStream(); 
      PdfWriter imageDocumentWriter = PdfWriter.getInstance(imageDocument, imageDocumentOutputStream); 

      imageDocument.open(); 

      if (imageDocument.newPage()) { 

       image = Image.getInstance(file.getAllBytes()); 

       if (!imageDocument.add(image)) { 
        throw new Exception("Unable to add image to page!"); 
       } 

       imageDocument.close(); 
       imageDocumentWriter.close(); 

       PdfReader imageDocumentReader = new PdfReader(imageDocumentOutputStream.toByteArray()); 

       copy.addPage(copy.getImportedPage(imageDocumentReader, 1)); 

       imageDocumentReader.close(); 
     } 

    } 
Các vấn đề liên quan