iText7:合并两个PDF时在文件指针处出错

iText7:合并两个PDF时在文件指针处出错,itext,itext7,Itext,Itext7,我们正处于评估iText7的最后一步。我们使用iText7.1.0和html2pdf 2.0.0 我们所做的:我们向Java应用程序发送一个json_编码的集合,其中包含pdf数据(包括页眉、正文和页脚的html)。在那里,我们迭代集合,为每个pdf数据元素创建一个byteArrayOutputStream,并将它们合并在一起。然后,我们将结果发送到脚本,脚本会将结果回传到浏览器等。尽管pdf显示正确,但在创建pdf时会遇到错误: com.itextpdf.io.IOException:

我们正处于评估iText7的最后一步。我们使用iText7.1.0和html2pdf 2.0.0

我们所做的:我们向Java应用程序发送一个json_编码的集合,其中包含pdf数据(包括页眉、正文和页脚的html)。在那里,我们迭代集合,为每个pdf数据元素创建一个byteArrayOutputStream,并将它们合并在一起。然后,我们将结果发送到脚本,脚本会将结果回传到浏览器等。尽管pdf显示正确,但在创建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
}

我们非常感谢您的建议。

createDatasheet
中,您似乎通过tearrayoutputstream重新使用了一些
,而没有首先清除它

因此,在第一次迭代中,一切都按预期进行,在
createDatasheet
的末尾,您有一个PDF文件

不过,在第二次迭代中,您在该
byteArrayOutputStream
中有两个PDF文件,一个接一个。此连接不会形成有效的单个PDF

因此,
byteArrayOutputStream.toByteArray()
返回一些损坏的内容

要解决此问题,请将
byteArrayOutputStream
设置为本地
createDatasheet
,并每次创建一个新实例,或者在
createDatasheet
的开头重置
byteArrayOutputStream

public byte[] createDatasheet(PDFDataModel pdfDataModel) throws IOException {
    byteArrayOutputStream.reset();
    PdfWriter writer = new PdfWriter(byteArrayOutputStream);
    [...]    

createDatasheet
中,您似乎重复使用了一些
byteArrayOutputStream
,而没有首先清除它

因此,在第一次迭代中,一切都按预期进行,在
createDatasheet
的末尾,您有一个PDF文件

不过,在第二次迭代中,您在该
byteArrayOutputStream
中有两个PDF文件,一个接一个。此连接不会形成有效的单个PDF

因此,
byteArrayOutputStream.toByteArray()
返回一些损坏的内容

要解决此问题,请将
byteArrayOutputStream
设置为本地
createDatasheet
,并每次创建一个新实例,或者在
createDatasheet
的开头重置
byteArrayOutputStream

public byte[] createDatasheet(PDFDataModel pdfDataModel) throws IOException {
    byteArrayOutputStream.reset();
    PdfWriter writer = new PdfWriter(byteArrayOutputStream);
    [...]