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个字节很大。
嗨,看看iText的7 API,你会发现它已经改变,因为iText的5 PdfDocument对象介绍,并根据文档,pdfDoc.copyPagesTo是做到这一点的方式。这个方法返回结果对象到servlet,然后我尝试对它进行流式处理。 如果通过将listPDF对象返回给servlet并在那里创建'result'对象,使用上面看到的for循环以及使用响应对象的输出流,如下所示找到解决方案: PdfDocument result = new PdfDocument (new PdfWriter(response.getOutputStream())); 但这似乎是一个奇怪的方式来做到这一点。 – chnoe