我有一些麻烦得到这个代码工作。目标是将pdf与PD文档对象中加载的pdf合并。我不想使用PdfBox的mergeUtics,因为它暗示要关闭PD文档对象。我有很多数据要处理,我使用循环来处理它。加载和关闭PDF文档将花费太多的时间和资源(也许我错了,但它的感觉)。
以下是我的方法:
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)
考虑一下:您在路径列表中有一个字符串列表,然后迭代它。
在第一个循环结束时,保存doc
并关闭它。
然后再次循环并尝试保存doc
。您在上一次迭代中关闭了它。
如果您的目标是将pathList
中所有pdf的内容放在doc
指向的pdf中,则在循环所有pathList
之后,必须在循环外部关闭它。
编辑:
正如蒂尔曼·豪斯赫尔指出的,还有另一个问题。当您调用addPage
时,您不是在复制原始页面,而是或多或少地链接到它。由于您使用的是一个使用资源的try构造,原始html" target="_blank">文件将在try-catch
构造结束时关闭,这意味着一旦您退出该构造,您将失去对原始页面的任何引用。因此,您必须在退出try-catch
之前保存,或者您使用进口页面
来代替,这会产生一个副本(然后无论如何都会调用addPage
)。所以呢
PDPage page = pdfToMergeDocument.getPage(pageIndex);
doc.importPage(page);
编辑2:
当然,这个答案现在是错误的,因为OP在原始问题中发布了错误的代码:)我将把这个留在这里,以防有人需要它。
错误发生在我试图保存文档时,在第65行。 我会收到以下错误消息:
我做过研究,在运行workingdocument.save(文件名)命令之前,似乎有一个PDDocument正在关闭。我不是很确定如何修复这个,我也有点迷路如何找到一个变通办法。我对我的编程有点生疏,所以任何帮助都将非常感谢!此外,任何关于如何使未来的帖子更多信息的反馈都将是很好的。 提前致谢
我使用的代码是:https://www.tutorialspoint.com/pdfbox/pdfbox_inserting_image.htm 帮助我将图像添加到现有PDF。问题是它创建的文件是一个空白页,上面只有图像。 这是我的代码: 据我所知,我所做的应该是有效的,我没有任何错误,那么是什么造成的呢?
主题:尝试在您将文件添加到MainPDF后打开COSStream。换句话说,在将PDF文件添加到主PDF文件后,尝试将文本写入主PDF文档。我不想保存或关闭我的mainPDF,因为我计划一次又一次地添加更多的PDF文件和更多的文本。在我的例子中,我正在尝试在使用TreEmerge后打开PDPageContentStream contentStream。很明显,主要文件提前结束了?向下滚动查看下面的
我正在尝试使用JAVA填写PDF表单,但当我尝试使用下面的代码获取字段时,列表为空。 然后我尝试使用PDFStripper读取文件 输出如下 “请稍候。。。 如果此消息最终未被文档的正确内容替换,则PDF查看器可能无法显示此类文档。 您可以通过访问升级至最新版本的Adobe Reader for Windows®、Mac或Linux®http://www.adobe.com/go/reader_d
主要内容:将页面添加到PDF文档,示例在前一章中,我们已经学习了如何创建PDF文档。 创建PDF文档后,我们需要添加页面。 现在来了解如何在PDF文档中添加页面。 将页面添加到PDF文档 可以通过实例化类并使用类的方法将其添加到PDF文档来创建空白页面。 以下是创建一个空文档并向其中添加页面的步骤。 第1步:创建空白文档 通过实例化类创建一个空的PDF文档,如下所示。 第2步:创建一个空白页面 类表示PDF文档中的一个页面,因此可以通