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();
我有一组包含 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();