文件已关闭。无法对 pdfDocument.getNumberOfPages() 执行操作

问题描述 投票:0回答:1

我在 itext7 (v7.2.5) 和 html2pdf (v4.0.5) 上处理 PDF 文档时遇到此错误

com.itextpdf.kernel.exceptions.PdfException:文档已关闭。无法执行操作。

在下面你会发现:

1。触发该过程的方法

@GetMapping(path = "/split")
public String splitHtml2Pdf() {

    try {
        String inputHtml = "<html><body><landscape>Content 1</landscape><landscape>Content 2</landscape></body></html>";
        Map<Integer, PdfDocument> documentMap = splitHtmlToPdf.splitAndCreateDocuments(inputHtml);

        String outputPdfPath = "/Downloads/output.pdf";
        splitHtmlToPdf.createFinalPdf(documentMap, outputPdfPath);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return "DONE SPLIT HTML2PDF!";
}

2。触发了两个方法

public Map<Integer, PdfDocument> splitAndCreateDocuments(String inputHtml) throws IOException {

    var converterProperties = new ConverterProperties();

    Map<Integer, PdfDocument> documentMap = new HashMap<>();
    String[] segments = inputHtml.split("<landscape>");

    for (int i = 1; i < segments.length; i++) {
        String segmentHtml = segments[i];
        PdfDocument pdfDocument = new PdfDocument(new PdfWriter("temp_" + i + ".pdf"));

        HtmlConverter.convertToPdf(segmentHtml, pdfDocument, converterProperties);

        documentMap.put(i, pdfDocument);
    }

    return documentMap;
}


public void createFinalPdf(Map<Integer, PdfDocument> documentMap, String outputPath) throws IOException {
    PdfDocument finalPdf = new PdfDocument(new PdfWriter(outputPath));
    PdfMerger merger = new PdfMerger(finalPdf);

    for (Map.Entry<Integer, PdfDocument> entry : documentMap.entrySet()) {
        PdfDocument pdfDocument = entry.getValue();
        // HERE THE METHOD IS THROWN
        int docNrPages = pdfDocument.getNumberOfPages();
        merger.merge(pdfDocument, 1, docNrPages);
        pdfDocument.close();
    }

    finalPdf.close();

}

3.调用抛出错误

int docNrPages = pdfDocument.getNumberOfPages();

4。关闭文档的呼叫是

HtmlConverter.convertToPdf(segmentHtml, pdfDocument, converterProperties);

问题:

知道如何解决这个问题吗?

itext7 html2pdf
1个回答
1
投票

您可以通过调用 HtmlConverter 提供的另一个方法来防止立即关闭 PdfDocument 实例:例如,HtmlConverter#convertToDocument 重载之一将返回未关闭的 Document 对象。例如,您可以提供 PdfDocument 对象或 PdfWriter 作为参数。

如果您没有提供 PdfDocument 对象作为 ConvertToDocument 方法之一的参数,您仍然可以通过调用 Document#getPdfDocument

来检索它

代码示例:

    public byte[] convertPdf(String inFile) throws IOException {
    var baos = new ByteArrayOutputStream();
    var pdf = new PdfDocument(new PdfWriter(baos));
    var doc = HtmlConverter.convertToDocument(new FileInputStream(inFile),pdf,new ConverterProperties());
    System.out.println(pdf.getNumberOfPages());
    doc.close();
    return baos.toByteArray();
}
© www.soinside.com 2019 - 2024. All rights reserved.