【问题标题】:iText7: Error at file pointer when merging two pdfsiText7:合并两个pdf时文件指针出错
【发布时间】:2018-01-24 10:03:11
【问题描述】:

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

我们所做的:我们将带有 pdf-data(包括页眉、正文和页脚的 html)的 json_encoded 集合发送到我们的 Java 应用程序。在那里我们遍历集合,为每个 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();
}

我们非常感谢您的任何建议。

【问题讨论】:

    标签: itext itext7


    【解决方案1】:

    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);
        [...]    
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 2022-01-12
      • 1970-01-01
      • 2019-11-17
      • 2015-12-13
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多