iText7:合并两个pdf时文件指针出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iText7:合并两个pdf时文件指针出错相关的知识,希望对你有一定的参考价值。
我们正在评估iText7的最后几步。我们使用iText 7.1.0和html2pdf 2.0.0。
我们做什么:我们向我们的Java应用程序发送一个带有pdf-data(包括用于标题,正文和页脚的html)的json_encoded集合。在那里我们迭代集合,为每个pdf-data元素创建一个byteArrayOutputStream并将它们合并在一起。然后,我们将结果发送到一个脚本,该脚本将其回显到例如一个浏览器。虽然pdf显示正确,但我们在创建时遇到错误:
com.itextpdf.io.IOException: Error at file pointer 226,416.
...
Caused by: com.itextpdf.io.IOException: xref subsection not found.
... 73 common frames omitted
如果我们只创建集合的一部分,则不会抛出任何错误。
迭代收集和合并:
@RequestMapping(value = "/pdf", method = RequestMethod.POST, produces = MediaType.APPLICATION_PDF_VALUE)
public byte[] index(@RequestBody PDFDataModelCollection elements, Model model) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(byteArrayOutputStream);
try (PdfDocument resultDoc = new PdfDocument(writer)) {
for (PDFDataModel pdfDataModel : elements.getElements()) {
PdfReader reader = new PdfReader(new ByteArrayInputStream(creationService.createDatasheet(pdfDataModel)));
try (PdfDocument sourceDoc = new PdfDocument(reader)) {
int n = sourceDoc.getNumberOfPages(); //<-- IOException on second iteration
for (int i = 1; i <= n; i++) {
PdfPage page = sourceDoc.getPage(i).copyTo(resultDoc);
resultDoc.addPage(page);
}
}
}
}
return byteArrayOutputStream.toByteArray(); //outputs the final pdf
}
创建部分:
public byte[] createDatasheet(PDFDataModel pdfDataModel) throws IOException {
PdfWriter writer = new PdfWriter(byteArrayOutputStream);
//Initialize PDF document
PdfDocument pdfDoc = new PdfDocument(writer);
try (
Document document = new Document(pdfDoc)
) {
//header, footer, etc
//body
for (IElement element : HtmlConverter.convertToElements(pdfDataModel.getBody(), this.props)) {
document.add((IBlockElement) element);
}
footer.writeTotalNumberOnPages(pdfDoc);
}
return byteArrayOutputStream.toByteArray();
}
我们对任何建议表示感谢。
在createDatasheet
你似乎重新使用一些byteArrayOutputStream
而不先清除它。
因此,在第一次迭代中,一切都按预期工作,在createDatasheet
的末尾,您有一个PDF文件。
但是,在第二次迭代中,byteArrayOutputStream
中有两个PDF文件,一个接一个。此串联不构成有效的单个PDF。
因此,byteArrayOutputStream.toByteArray()
返回了一些破碎的东西。
要解决这个问题,要么将byteArrayOutputStream
本地化为createDatasheet
并每次创建一个新实例,或者在byteArrayOutputStream
开头重置createDatasheet
:
public byte[] createDatasheet(PDFDataModel pdfDataModel) throws IOException {
byteArrayOutputStream.reset();
PdfWriter writer = new PdfWriter(byteArrayOutputStream);
[...]
以上是关于iText7:合并两个pdf时文件指针出错的主要内容,如果未能解决你的问题,请参考以下文章
iText7高级教程之html2pdf——2.使用CSS定义样式
iText7高级教程之html2pdf——2.使用CSS定义样式