2015-02-23 2 views
0

Я нахожусь в первом использовании iText, и у меня есть эта проблема.Как я могу вставить документ одной страницы, представленный ByteArrayOutputStream, в другой документ?

Я создал этот stampaFattureMultiple() метод, который конкатенировать некоторую PDFs документ найденный внутри ArrayList listaFatture коллекции. Как вы можете видеть, документ PDF хранится внутри поля Blob, представленного listaFatture.get (i) .getPdf(). Хорошо, это прекрасно работает, и документ PDFs правильно конкатенирован.

public void stampaFattureMultiple(ArrayList<Fattura> listaFatture) { 

    ByteArrayOutputStream docPDF = null; 
    ByteArrayOutputStream currentPdfBAOS = null; 

    InputStream blobinstream = null; 

    /** The resulting PDF file: */ 
    String result = "D:/XYZ/fatture-concatenate.pdf"; 

    // STEP 1 Creazione del documento in formato A4 e senza margini: 
    com.itextpdf.text.Document document = new com.itextpdf.text.Document(com.itextpdf.text.PageSize.A4, 0, 0, 0, 0); 

    try { 
     // STEP 2: Make copies of PDF documents. Documents can be edited after reading and before writing them out 
     //PdfCopy copy = new PdfCopy(document, pdfResult); 
     docPDF = new ByteArrayOutputStream(); 
     //PdfCopy copy = new PdfCopy(document, docPDF); 

     PdfCopy copy = new PdfCopy(document, new FileOutputStream(result)); 



     // STEP 3: 
     document.open(); 

     // Concatena tutti i PDF delle fatture reperite: 
     for (int i = 0; i < listaFatture.size(); i++) { 

      // Obtain the current Blob object representing the PDF: 
      Blob currentPdfBlob = listaFatture.get(i).getPdf(); 

      // Put the current PDF Blob content into the current ByteArrayOutputStream: 
      if(currentPdfBlob!=null){ 
       blobinstream = currentPdfBlob.getBinaryStream(); 

       int chunk = 1024; 
       byte[] buffer = new byte[chunk]; 
       int length = -1; 


       currentPdfBAOS = new ByteArrayOutputStream(); 

       while ((length = blobinstream.read(buffer)) != -1) { 
        currentPdfBAOS.write(buffer, 0, length); 
       } 
       currentPdfBAOS.flush(); 
      } 

      ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i)); 

      //document.newPage(); 


      // STEP 4: reader for the i document: 
      ByteArrayInputStream currentPdfBAIS = new ByteArrayInputStream(currentPdfBAOS.toByteArray()); 
      PdfReader currentPdfReader = new PdfReader(currentPdfBAIS); 

      PdfImportedPage page; 
      PdfCopy.PageStamp stamp; 

      for (int currentPageIndex = 0; currentPageIndex < currentPdfReader.getNumberOfPages();) { 

       page = copy.getImportedPage(currentPdfReader, ++currentPageIndex); 
       copy.addPage(page); 
      } 



     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    }finally { 
     document.close(); 

    } 

} 

Как вы можете видеть, чтобы выполнить эту задачу, я сделал следующим образом:

  1. я итерацию по всем документам внутри listaFatture коллекции, и я построить соответствующий PDF документ, начиная с Blob объект:

    Blob currentPdfBlob = listaFatture.get(i).getPdf(); 
    
  2. Затем я создаю читатель для этого documnt пути:

    PdfReader currentPdfReader = new PdfReader(currentPdfBAIS); 
    

    и так я прочитал этот читатель и скопировать страницу внутри документа.

Хорошо работает. Проблема в том, что перед каждым документом я должен вставить специальную страницу, которая генерируется из этого метода stampaTestataFatturaPdf(), который возвращает ByteArrayOutputStream представляет собой документ с одной страницей.

Так я вставил эту строку перед скопировать текущую страницу в формате PDF:

ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i)); 

Но я не имею ни малейшего представления о том, как вставить страницу, представленную currentFatturaTestataBasos внутри документа, который я генерирующий.

Можете ли вы дать мне некоторую помощь и некоторые предложения?

Tnx

ответ

2

Вы можете иметь любое количество PdfReader открытой. У вас уже есть один с currentPdfReader, просто откройте еще PdfReader с new PdfReader(currentFatturaTestataBasos.toByteArray()) и добавьте страницы от одного и от другого до PdfCopy.

+0

Ok tnx, решена с использованием деа ;-) –

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