2017-03-13 44 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();