2017-03-13 3 views
1

Je vais avoir un tableau de blobs contenant des fichiers PDF. J'essaie d'ajouter tous ces fichiers PDF et envoyer le résultat au client en utilisant le servlet response.getOutputStream. Mais d'une façon ou d'une autre, je reçois un document de 15 octets qui n'est pas lisible par Acrobat Reader.itext 7 concat pdf et envoyer à la réponse

Où données est un List<Data> contenant des tâches avec les documents Word. Je convertis d'abord en PDF en utilisant Aspose. Je suis confiant que ce code fonctionne. Donc, ça ne peut pas être le problème. Document objet ici est un Aspose lib. objet qui est écrit dans un flux de sortie au format PDF. Le problème est que je ne trouve aucune documentation à ce sujet dans le document iText 7, ni dans les exemples.

Voici le code que je utilise

List<PdfDocument> listPDF = new LinkedList<>(); 
for (Data aData : data) { 
    byte[] input = aData.getBlobValue(); 
    ByteArrayInputStream inStream = new ByteArrayInputStream(input); 
    Document srcDocWord = new Document(inStream); 
    ByteArrayOutputStream pdfOStream = new ByteArrayOutputStream();   
    srcDocWord.save(pdfOStream, SaveFormat.PDF); 
    ByteArrayInputStream pdfIStream = new ByteArrayInputStream(pdfOStream.toByteArray()); 
    PdfReader reader = new PdfReader(pdfIStream); 
    PdfDocument pdfDoc = new PdfDocument(reader); 
    listPDF.add(pdfDoc); 
}  
PdfDocument result = new PdfDocument(new PdfWriter(new ByteArrayOutputStream())); 
for (PdfDocument pdfDoc : listPDF) { 
    pdfDoc.initializeOutlines(); 
    List<PdfPage> list = pdfDoc.copyPagesTo(1, pdfDoc.getNumberOfPages(), result);   
    pdfDoc.close(); 
}  
System.out.println(result.getNumberOfPages()); 
ByteArrayInputStream is = new ByteArrayInputStream(((ByteArrayOutputStream)pdfDoc.getWriter().getOutputStream()).toByteArray()); 
OutputStream os = response.getOutputStream(); 
os.write(is.read()); 
os.flush(); 
os.close(); 

Maintenant, si je vais avoir 2 fichiers PDF de 1 document, le sysout retourne 2, de sorte que c'est exact. Mais le document retourné à la réponse est seulement 15 octets grand.

+0

Salut, regardez la api iText 7, vous le trouverez a changé depuis iText 5. L'objet PDFDocument est introduit , et selon le doc, pdfDoc.copyPagesTo est le moyen de le faire. Cette méthode renvoie l'objet résultat au servlet, puis j'essaie de le diffuser. Si vous trouvez une solution en retournant l'objet listPDF au servlet, et en créant l'objet 'result', utilisez la boucle for que vous voyez ci-dessus, et en utilisant le flux de sortie de l'objet réponse, comme ceci: PdfDocument result = new PdfDocument (nouveau PdfWriter (response.getOutputStream())); Mais il semble une façon étrange de le faire. – chnoe

Répondre

1

Tout d'abord, vous devez fermer le document résultant. Deuxièmement, je ne vois pas comment vous écrivez quelque chose à la réponse. Vous appelez seulement os.write(is.read()); qui ne copie pas is à os du tout.

Essayez d'écrire à la os tout de suite, cela est une approche beaucoup plus propre:

OutputStream os = response.getOutputStream(); 
PdfDocument result = new PdfDocument(new PdfWriter(os)); 
for (PdfDocument pdfDoc : listPDF) { 
    pdfDoc.initializeOutlines(); 
    List<PdfPage> list = pdfDoc.copyPagesTo(1, pdfDoc.getNumberOfPages(), result);   
    pdfDoc.close(); 
} 
result.close();