itext 7 concat pdf并发送给响应

时间:2017-03-13 16:06:54

标签: java itext7

我有一个包含PDF的blob数组。我试图附加所有这些PDF并使用servlet response.getOutputStream将结果发送到客户端。但不知何故,我得到一个15字节的文件,而且Acrobat Reader无法读取。

数据是包含Word文档的一些blob的List<Data>。 我首先使用Aspose转换为PDF。我确信这段代码有效。 所以这不是问题所在。 这里的Document对象是一个Aspose lib。以PDF格式写入输出流的对象。 问题是我无法在iText 7 doc或示例中找到相关文档。

这是我使用

的代码
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();

现在,如果我有1个文档的2个PDF,则sysout返回2,这是正确的。 但返回响应的文档只有15个字节。

1 个答案:

答案 0 :(得分:1)

首先,您应该关闭结果文档。 其次,我不知道你如何写任何回应。您只需拨打os.write(is.read());即可将is复制到os

立即尝试写入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();