当前位置: 首页 > 知识库问答 >
问题:

pdfbox:COSStream已关闭,无法读取。将PDF文件添加到PDF文件中。和审查

谷梁弘深
2023-03-14

主题:尝试在您将文件添加到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的数组列表https://stackoverflow.com/A/61299092/14092356

    其中PDPages是实例化的事项。COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了?

    来自帖子:PDFBox IO异常:COSStream已关闭,无法读取。注释https://stackoverflow.com/A/555591429/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在使用前关闭
    • java.io.IOException:COSStream已关闭,无法读取。可能其所附的PDDocument已关闭?
    • 在使用PDFBox添加页面后尝试保存PDF时,“IOException:COSStream已关闭,无法读取”
    • 合并大量pdf文件将会很困难,因为您需要跟踪https://issues.apache.org/jira/browse/pdfbox-3901
    • 的打开和关闭
    • 使用PDFBox从PDF文档中读取特定页面

    这是我的问题代码

    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 PM org.apache.pdfbox.cos.CosDocument结束警告:警告:您没有关闭PDF文档2020年8月27日11:10:48 PM org.apache.pdfbox.cos.CosDocument结束警告:警告:您没有关闭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)
    
  • 共有1个答案

    哈泰
    2023-03-14

    有几个因素可能导致此错误。最后对我起作用的是在流的开头添加一个偏移量值和空白文本。所以我认为这是合并错误,因为当我停止合并新的PDF文件时,问题消失了。不过,这是我封面上的问题。封面上的COSStream干扰了正在合并的pdf文件。

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

    内容1.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();
        }
    
     类似资料:
    • 我正在使用iText生成Pdf。但当我试图在pdf中添加图像时, 我mage.get实例(新的URL(timetableResource.getImageUrl()));document.add(学校标志); 但我得到的错误是 HTTP状态500-服务器为URL返回了HTTP响应代码400:http://139.59.72.150:8080/sms/attachments/23/42/school

    • 我正在尝试使用JAVA填写PDF表单,但当我尝试使用下面的代码获取字段时,列表为空。 然后我尝试使用PDFStripper读取文件 输出如下 “请稍候。。。 如果此消息最终未被文档的正确内容替换,则PDF查看器可能无法显示此类文档。 您可以通过访问升级至最新版本的Adobe Reader for Windows®、Mac或Linux®http://www.adobe.com/go/reader_d

    • 我正在尝试用Java阅读文本,但效果不好。这是我的密码 但是这样的结果 请稍等... 如果此消息最终未被文档的正确内容替换,则PDF查看器可能无法显示此类文档。 您可以通过访问http://www.adobe.com/go/reader_download.升级到适用于Windows®、Mac或Linux®的最新版本的Adobe Reader 有关Adobe Reader的更多帮助,请访问http:

    • 问题内容: 我想对iText执行以下操作: (1)解析现有的PDF文件 (2)在文档的现有单页上添加一些数据(例如时间戳) (3)写出文件 我似乎无法弄清楚如何使用iText做到这一点。用伪代码可以做到这一点: Document document = reader.read(input); document.add(new Paragraph(“my timestamp”)); writer.wr

    • 问题内容: 我想发送带有PDF附件的电子邮件。我创建了PDF文件,然后执行了以下操作,但我认为这是错误的: 在发送电子邮件之前,我可以看到附件,但是当我发送电子邮件时,它的发送没有附件,这是因为我没有正确附加文件。 问题答案: 您错了。使用代替。

    • 在我的maven项目中,我有一个PDF文件,它位于文件夹中。我的函数从文件夹读取PDF文件,并根据用户的数据在文档中添加一些值。 此项目使用打包为文件,并在我的其他Spring Boot应用程序中用作依赖项。 在我的Spring启动项目中,我创建了将在PDF上执行一些工作的类的instace。一旦PDF文件上的所有工作都完成,并且当PDF文件保存在文件系统上时,它始终是空的(所有页面都是空白的)。