itext 7 concat pdf 并发送到响应

itext 7 concat pdf and send to response

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

其中数据是 List<Data>,其中包含一些带有 Word 文档的 blob。 我首先使用 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();

现在,如果我有 1 个文档的 2 个 PDF,则系统输出 returns 2,所以这是正确的。 但是响应返回的文档只有15个字节大。

首先,您应该关闭生成的文档。 其次,我看不出你是如何在回复中写任何东西的。您只调用 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();