2017-03-13 46 views
1

我有一個包含PDF的blob數組。我試圖附加所有這些PDF並使用servlet response.getOutputStream將結果發送給客戶端。但不知何故,我得到一個15字節的文檔,Acrobat Reader不可讀。itext 7 concat pdf併發送到回覆

其中數據是List<Data>包含一些與Word文檔的斑點。 我首先使用Aspose轉換爲PDF。我相信這段代碼有效。 這樣就不成問題了。 Document這裏的對象是一個Aspose庫。以PDF形式寫入輸出流的對象。 問題是,我無法在iText 7文檔中找到任何關於此的文檔,在示例中也沒有。

下面是我使用

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

現在如果我有2個PDF文件1號文件的代碼,則系統輸出返回2,這樣是正確的。 但是返回到響應的文檔只有15個字節很大。

+0

嗨,看看iText的7 API,你會發現它已經改變,因爲iText的5 PdfDocument對象介紹,並根據文檔,pdfDoc.copyPagesTo是做到這一點的方式。這個方法返回結果對象到servlet,然後我嘗試對它進行流式處理。 如果通過將listPDF對象返回給servlet並在那裏創建'result'對象,使用上面看到的for循環以及使用響應對象的輸出流,如下所示找到解決方案: PdfDocument result = new PdfDocument (new PdfWriter(response.getOutputStream())); 但這似乎是一個奇怪的方式來做到這一點。 – chnoe

回答

1

首先,您應該關閉生成的文檔。 其次,我沒有看到你如何寫任何迴應。您只能撥打os.write(is.read());,它根本不會複製isos

嘗試寫os向右走,這是一個非常簡潔的方法:

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