2012-12-21 6 views
7

Я использую iText (в частности, iTextSharp 4.1.6), и я хочу создать PDF, объединив страницы из существующих PDF-файлов, а также вставив новые страницы, созданные с изображения.iText - как добавить страницы в документ, созданный с помощью PdfCopy

У меня эти две части работают отдельно, используя PdfCopy и PdfWriter соответственно. Код для создания страницы с изображения выглядит следующим образом:

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

Теперь Поскольку PdfCopy наследует от PDFWriter, я думал, что я мог бы добавить такую ​​«страницу изображения» на мой объект PdfCopy, используя ту же технику, но он не работает (если вы создаете экземпляр PdfCopy вместо PdfWriter в приведенном выше примере, на странице ничего не появляется).

Из-за быстрого взгляда на исходный код я замечаю, что когда конструктор для PdfCopy вызывает конструктор суперкласса, он делает это с новым объектом Document, а не с тем, который прошел, поэтому я предполагаю, что это причина.

Есть ли лучший способ сделать это? На мой взгляд, лучше всего создать одностраничный Pdf из изображения с помощью PdfWriter, а затем добавить его в документ с помощью PdfCopy, но это похоже на обходное решение.

+1

Что вы описали, как работа вокруг мне кажется, правильное решение. PdfCopy предназначен для объединения нескольких PDF-файлов, и вы применяете его к ранее существующим PDF-файлам и вашему новому создавать. если изображение не слишком велико, вы можете создать этот PDF в памяти (байт []) и прочитать его оттуда; таким образом, даже нет необходимости в дополнительных временных файлах. – mkl

+0

Спасибо - я не слишком хорошо знаком с iText, и кажется, что это так полно, что я просто не был уверен, был ли другой способ сделать это. Я реализовал его, создав временный PDF-файл в памяти, и все это прекрасно работает :-) – Andy

ответ

7

У меня недавно была эта проблема, и ответы здесь не были на самом деле полезными. Мой прецедент был в основном «Возьмите кучу PDF-файлов и изображений (.jpg, .png и т. Д.) И объедините их в один PDF-файл». Я должен был использовать PdfCopy, потому что он сохраняет такие вещи, как поля формы и метки, где PdfWriter этого не делает.

В принципе, поскольку PdfCopy не позволяет создавать новые страницы с помощью addPage(), вам необходимо создать новый PDF-файл в памяти с изображением на странице, а затем использовать PdfCopy для копирования страницы из этого PDF-файла.

Например:

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(); 
     } 

    } 
Смежные вопросы