我在 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);
问题:
知道如何解决这个问题吗?
您可以通过调用 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();
}