【发布时间】:2023-03-12 20:24:01
【问题描述】:
主题:在将文件添加到 mainPDF 后尝试打开 COSStream。换句话说,在您将 PDF 文件添加到您的主 PDF 文件之后,尝试将文本写入您的主 PDF 文档。我不想保存或关闭我的 mainPDF,因为我计划一次又一次地添加更多 PDF 文件和更多文本。就我而言,我试图在使用 TreeMerge 后打开 PDPageContentStream contentStream。显然,主要文件过早关闭? 向下滚动以查看下面的代码
自 2014 年左右以来,这个话题肯定有很多麻烦: 我真的希望这些问题的答案能发布完整的代码。因此,我列出了类似问题的帖子并尝试解决此问题(滚动下方)。我相信更多的初学者会遇到这个问题。
-
@mkl 和@community https://stackoverflow.com/a/49973366/14092356
- 尝试使用
newDoc.addPage(newDoc.importPage(doc.getPage(0)));而不是newDoc.addPage(doc.getPage(1)); - 记得关闭您在 mainPDF 中插入的新文件
- 添加新文件时,请确保将它们分配给变量,这样垃圾收集也不会过早关闭它
- 尝试将这些文件添加到 PDDocuments 的 ArrayList https://stackoverflow.com/a/61299092/14092356
- 尝试使用
-
PDPages 在哪里被实例化很重要。 COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
-
来自帖子:PDFBox IO Exception: COSStream has been closed and cannot be read。评论https://stackoverflow.com/a/55591429/14092356 - 对我不起作用:我在这里发布代码
'''
public void tableOfContents() throws IOException { String path1 = new File("Index1.pdf").getAbsoluteFile().toString(); File file1 = new File(path1); String path2 = new File("Index2.pdf").getAbsoluteFile().toString(); File file2 = new File(path2); PDFMergerUtility merger = new PDFMergerUtility(); PDDocument combine = PDDocument.load(file1); PDDocument combine2 = PDDocument.load(file2); merger.appendDocument(mainDocument, combine); //combine.close(); merger.appendDocument(mainDocument, combine2); merger.mergeDocuments(); merger.mergeDocuments(MemoryUsageSetting.setupTempFileOnly()); }
更多资源
- PDFBox COSStream closed before use
- java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
- "IOException: COSStream has been closed and cannot be read" when trying to save PDF after adding page with PdfBox
- 合并大量 pdf 文件会很困难,因为您需要跟踪打开和关闭 https://issues.apache.org/jira/browse/PDFBOX-3901
- Reading a particular page from a PDF document using PDFBox
这是我的问题代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException {
PDDocument document = new PDDocument();
PDOutlineItem pagesOutline = new PDOutlineItem();
for (int numberOfPages = 0; numberOfPages < 5; numberOfPages++) {
//Creating a blank page
PDPage blankPage = new PDPage();
//Adding the blank page to the document
document.addPage(blankPage);
}
ExampleImportingClass example = new ExampleImportingClass(document);
document.save("exampleError.pdf");
System.out.println("PDF created");
document.close();
}
}
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.IOException;
public class ExampleImportingClass {
private PDDocument document;
public ExampleImportingClass(PDDocument document) throws IOException {
this.document = document;
page1();
page2_3();
page4();
}
public void page1() throws IOException {
PDPage page1 = document.getPage(0);
String path = new File("catPicture3.jpg").getAbsoluteFile().toString();
PDImageXObject pdImage = PDImageXObject.createFromFile(path, document);
PDPageContentStream content1 = new PDPageContentStream(document, page1);
content1.beginText();
content1.endText();
content1.drawImage(pdImage, 50, 400,300,300);
content1.close();
}
public void page2_3() throws IOException {
String path1 = new File("Example1.pdf").getAbsoluteFile().toString();
File file1 = new File(path1);
String path2 = new File("Example2.pdf").getAbsoluteFile().toString();
File file2 = new File(path2);
PDPage page1 = document.getPage(0);
PDPage page2 = document.getPage(2);
PDPageTree mergePD = document.getPages();
PDDocument doc1 = PDDocument.load(file1);
PDDocument doc2 = PDDocument.load(file2);
mergePD.insertAfter(doc1.getPage(0), page1);
mergePD.insertAfter(doc2.getPage(0), page2);
}
public void page4() throws IOException {
PDPage page = document.getPage(3);
PDPageContentStream content1 = new PDPageContentStream(document, page);
content1.beginText();
content1.setFont(PDType1Font.TIMES_ROMAN, 14);
content1.newLineAtOffset(50, 350);
content1.showText("If we remove page4() method AND its not working, then its not ");
content1.endText();
content1.close();
}
这是臭名昭著的错误堆栈跟踪:
2020 年 8 月 27 日晚上 11:10:48 org.apache.pdfbox.cos.COS 文档完成 警告:警告:您没有关闭 PDF 文档 2020 年 8 月 27 日 11:10:48 PM org.apache.pdfbox.cos.COS 文档完成 警告:警告:您没有关闭 PDF 文档
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:154)
at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:204)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1219)
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:475)
at org.apache.pdfbox.cos.COSObject.accept(COSObject.java:158)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:526)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:464)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:448)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1113)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:452)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1386)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1273)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1357)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1328)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1316)
at main.main(main.java:22)
【问题讨论】:
-
在完成结果文件之前不要关闭 doc1 和 doc2。
-
谢谢,但如果我不关闭 doc1 和 doc2,我会得到同样的错误。
-
然后发布该代码,以及结果 PDF 的最后 10 行。那个是过早关闭的对象。
-
当问题发生时您说“我不想保存或关闭我的 mainPDF”。但是堆栈跟踪另有说明,它说异常发生
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1316) at Runner.main(Runner.java:25)。我怀疑Runner是一个 PDFBox 类,所以它似乎是你的,当你的代码尝试保存时发生异常。 -
我贴出了整个项目的代码。我也可以通过电子邮件向您发送该项目。我重新创建了项目以隔离问题。如果您从第 1 页或第 4 页中删除文本,它将不再有效。