【问题标题】:PDFBox: COSStream has been closed and cannot be read. Adding PDF File to PDF. And ReviewPDFBox:COSStream 已关闭,无法读取。将 PDF 文件添加到 PDF。并回顾
【发布时间】:2023-03-12 20:24:01
【问题描述】:

主题:在将文件添加到 mainPDF 后尝试打开 COSStream。换句话说,在您将 PDF 文件添加到您的主 PDF 文件之后,尝试将文本写入您的主 PDF 文档。我不想保存或关闭我的 mainPDF,因为我计划一次又一次地添加更多 PDF 文件和更多文本。就我而言,我试图在使用 TreeMerge 后打开 PDPageContentStream contentStream。显然,主要文件过早关闭? 向下滚动以查看下面的代码

自 2014 年左右以来,这个话题肯定有很多麻烦: 我真的希望这些问题的答案能发布完整的代码。因此,我列出了类似问题的帖子并尝试解决此问题(滚动下方)。我相信更多的初学者会遇到这个问题。

更多资源

这是我的问题代码

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 页中删除文本,它将不再有效。

标签: java pdfbox


【解决方案1】:

有几件事可能会导致此错误。最终对我有用的是在流的开头添加偏移值和空白文本。所以我认为这是合并错误,因为当我停止合并新的 PDF 文件时问题就消失了。但是,我的封面有问题。封面页的 COSStream 干扰了 pdf 文件的合并。

我的封面只有一张图片,没有文字。由于我仍然不知道的原因,这是导致错误的原因。一旦我对文本和空白文本进行了偏移,程序就会编译。 请注意,PDImage 之前已经有一个偏移值。显然这对编译器来说还不够。

content1.newLineAtOffset(50, 350);

content1.setFont(PDType1Font.TIMES_ROMAN, 14);

content1.showText("如果我们添加这段代码,它现在可以工作了。奇怪");

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.newLineAtOffset(50, 350);
        content1.setFont(PDType1Font.TIMES_ROMAN, 14);
        content1.showText("If we add this code it works now. Strange");

        content1.endText();
        content1.drawImage(pdImage, 50, 400,300,300);
        content1.close();
    }

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2018-10-08
    相关资源
    最近更新 更多