2017-03-13 7 views
1

Ich habe eine Reihe von Blobs mit PDFs. Ich versuche, alle diese PDFs anzuhängen und das Ergebnis mit dem Servlet response.getOutputStream an den Client zu senden. Aber irgendwie bekomme ich ein Dokument, das 15 Bytes groß ist und vom Acrobat Reader nicht lesbar ist.itext 7 concat pdf und an die Antwort senden

Wo Daten ist ein List<Data> enthält einige Blobs mit den Word-Dokumenten. Ich konvertiere zuerst mit Aspose in PDF. Ich bin zuversichtlich, dass dieser Code funktioniert. Das kann also nicht das Problem sein. Document Objekt hier ist eine Aspose lib. Objekt, das als PDF in einen Ausgabestream geschrieben wird. Problem ist, dass ich keine Dokumentation dazu in der iText 7 Doc oder in den Beispielen finden kann.

Hier ist der Code, den ich mit

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

Jetzt Wenn ich 2 mit bin PDFs von 1 Dokument, das SYSOUT 2 zurückkehrt, so dass richtig ist. Aber das Dokument, das zu der Antwort zurückgegeben wird, ist nur 15 Byte groß.

+0

Hallo, bei der api iText 7 suchen, finden Sie es seit iText 5. PDFDocument Objekt geändert wird eingeführt und gemäß dem Dokument ist der pdfDoc.copyPagesTo der Weg, dies zu tun. Diese Methode gibt das Ergebnisobjekt an das Servlet zurück, und dann versuche ich es zu streamen. Wenn Sie eine Lösung finden, indem Sie das listPDF-Objekt an das Servlet zurücksenden und dort das 'result'-Objekt erstellen, indem Sie die oben gezeigte for-Schleife verwenden und den Ausgabestream des Antwortobjekts verwenden: PdfDocument result = new PdfDocument (neuer PdfWriter (response.getOutputStream())); Aber es scheint ein seltsamer Weg, dies zu tun. – chnoe

Antwort

1

Zuerst sollten Sie das resultierende Dokument schließen. Zweitens, ich sehe nicht, wie Sie etwas auf die Antwort schreiben. Sie rufen nur os.write(is.read()); an, die is zu os überhaupt nicht kopiert.

Versuchen Sie, die os sofort zu schreiben, das ist ein viel sauberer Ansatz:

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(); 
Verwandte Themen