我有一个包含 PDF 的 blob 数组。我正在尝试附加所有这些 PDF 并使用 servlet response.getOutputStream
将结果发送到客户端。但不知怎的,我得到了一个 15 字节的文档,并且 Acrobat Reader 无法读取。
其中数据是 List<Data>
包含一些带有 Word 文档的 blob。
我首先使用 Aspose 转换为 PDF。我确信这段代码可以工作。
所以这不可能是问题。
Document
这里的对象是一个Aspose lib。以 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,则 sysout 将返回 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();
关于java - itext 7 concat pdf并发送到回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768261/