【发布时间】:2026-01-23 03:40:01
【问题描述】:
我很难让这段代码正常工作。目标是将 pdf 与 PDDocument 对象中加载的 pdf 合并。我不想使用 PdfBox 的 mergeUtility 因为它意味着关闭 PDDocument 对象。我有很多数据要处理,我使用循环来处理它。加载和关闭 PDDocument 将花费太多时间和资源(也许我错了,但感觉就是这样)。
这是我的做法:
for (String path:pathList) {
/* ... */
if(path.endsWith("pdf")){
File pdfToMerge = new File(path);
try(PDDocument pdfToMergeDocument = PDDocument.load(pdfToMerge)){
for (int pageIndex = 0; pageIndex < pdfToMergeDocument.getNumberOfPages(); pageIndex++){
PDPage page = pdfToMergeDocument.getPage(pageIndex);
doc.addPage(page);
}
}catch (IOException e){
System.out.println("Pdf : " + path + ANSI_RED + " [FAILED]" + ANSI_RESET);
continue;
}finally {
System.out.println("Pdf : " + path + ANSI_GREEN +" [OK]" + ANSI_RESET);
}
}
}
doc.save("src/Kairos/OutPut/"+pdfName[pdfName.length - 1]+".pdf");
doc.close();
当我尝试在第 65 行保存文档时发生错误。
我收到此错误消息:
Exception in thread "main" java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
at org.apache.pdfbox.cos.COSStream.checkClosed(COSStream.java:83)
at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:133)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1214)
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:402)
at org.apache.pdfbox.cos.COSObject.accept(COSObject.java:158)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:521)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:459)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:443)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1108)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:449)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1381)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1268)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1334)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1305)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1293)
at Kairos.Main.main(Main.java:65)
【问题讨论】:
-
@FedericoklezCulloca
doc在文件开头声明,它是使用 apache 示例的 CreatePDFA 类创建的。我检查代码是否在没有这部分的情况下工作,一切都很好我没有收到错误,我可以保存文档。问题确实出在这个街区。如果你愿意,我可以编辑我的帖子以添加完整的代码。 -
总结答案:仅在保存
doc后关闭pdfToMergeDocument。 -
@TilmanHausherr 请在下面重新阅读我的答案。那里有一个循环,在第一次迭代结束时关闭
doc。在第二次迭代中,save失败,因为doc已关闭。 -
哎呀,确实。 (但我的评论可能仍然适用)
-
@TilmanHausherr 确实如此。我刚刚重新阅读了
PDDocument::addPage方法的文档。它没有说清楚,但它没有复制。我稍后会用解决方案来修改我的答案。感谢您的 cmets