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

Costream已关闭,无法读取

袁和通
2023-03-14

我在我的项目中有下一个代码,它时不时地与costream一起被关闭,无法读取。也许它的附件已经关闭了 它发生在不同的时间和不同的工作负载,所以我想修复它。提前谢谢。

public void transferBankActPagesToPdfFile(List<PdfBankActPage> acts, HttpServletResponse response)
            throws IOException {
        try (PDDocument outPDDocument = new PDDocument()) {
            for (PdfBankActPage pdfBankActPage : acts) {
                String templateFilename = TEMPLATES_FOLDER + DELIMETER + pdfBankActPage.getPdfTemplateName();
                PDDocument templatePDDocument = PDDocument.load(readResource(templateFilename));
                PDPage pdPage = templatePDDocument.getPage(0);
                String fontTemplatePath = TEMPLATES_FOLDER + DELIMETER + FONT_TEMPLATE;
                PDDocument fontTemplatePdf = PDDocument.load(readResource(fontTemplatePath));
                PDPage fontTemplatePage = fontTemplatePdf.getPage(0);
                PDResources fontTemplateResources = fontTemplatePage.getResources();
                PDFont cyrillicFont = null;
                for (COSName cosName : fontTemplateResources.getFontNames()) {
                    if (cosName.getName().equals("F4")) {
                        cyrillicFont = fontTemplateResources.getFont(cosName);
                    }
                }
                outPDDocument.addPage(pdPage);
                PDPageContentStream contentStream = new PDPageContentStream(templatePDDocument, pdPage,
                        PDPageContentStream.AppendMode.APPEND, true, true);
                List<PdfTextLine> textLines = pdfBankActPage.getTextLines();
                if (textLines != null) {
                    for (PdfTextLine textLine : textLines) {
                        contentStream.setFont(cyrillicFont, textLine.getFontSize());
                        contentStream.beginText();
                        contentStream.newLineAtOffset(textLine.getOffsetX(), textLine.getOffsetY());
                        contentStream.showText(textLine.getText());
                        contentStream.endText();
                    }
                }
                contentStream.close();
            }
            response.setContentType(MediaType.APPLICATION_PDF_VALUE);
            outPDDocument.save(response.getOutputStream());
        }
    }

这里是加载资源的部分:

 private InputStream readResource(String resourceFilename) {
        InputStream inputStream = PdfBankActPagesToPdfFile.class.getResourceAsStream(resourceFilename);
        if (inputStream == null) {
            inputStream = PdfBankActPagesToPdfFile.class.getClassLoader().getResourceAsStream(resourceFilename);
        }
        return inputStream;
    }

共有1个答案

呼延学
2023-03-14

您使用新创建的模板文档(templatePDDocumentfontemplatepdf)中的流,并在每个循环迭代中免费进行垃圾收集。因此,在调用outPDDocument之前,其中一些模板文档可能已经通过垃圾收集完成。保存,导致您观察到的错误。

如果保留此基本体系结构,则可以通过将这些模板文档全部添加到某个集合并仅在调用outPDDocument后清除该集合来防止过早完成这些模板文档。保存

或者,您可以切换到克隆模板页面,并使用克隆而不是使用原始模板页面。

 类似资料:
  • 我做过研究,在运行workingdocument.save(文件名)命令之前,似乎有一个PDDocument正在关闭。我不是很确定如何修复这个,我也有点迷路如何找到一个变通办法。我对我的编程有点生疏,所以任何帮助都将非常感谢!此外,任何关于如何使未来的帖子更多信息的反馈都将是很好的。 提前致谢

  • 我尝试用apache PDFBox保存PDF文件,但出现错误 java.io.IOException:COSStream已关闭,无法读取。也许它所附的PDDocument已经关闭了? 出什么事了?

  • 本质上,我试图用Java创建一个小工具,从某种用户输入中获取文本,想象一个普通的文本框,并用它创建一个PDF文件。 到目前为止,我用我对pdfbox的基本知识很快地学到了一些东西。 在我的应用程序中,我在另一个带有GUI元素的应用程序中实例化这个类(如下所示),如果我输入文本,比方说在一个文本框中,并且运行这个脚本一次--它运行起来非常好,但是第二次运行它,它就会崩溃,并给我带来这个恼人的错误:

  • 我正在使用selenium webdriver和sikuli进行一个自动化项目,但是当我运行第一个测试时,我得到以下错误: [错误]图像:无法加载:file:/c:/bla/bla/pic/singinbtn.png[错误]图像:图像无效,但TextSearch已关闭! 我使用的是java,这是我的示例代码: 你能告诉我怎样才能打开文本搜索吗? 谢谢

  • 我正在做一个实验2D物理的个人项目。现在,我正在尝试设置JFrame,以便它每秒更新60次。但是,当我调用方法开始更新JFrame时,我不能关闭JFrame。但是如果我省略了调用方法的部分,我可以关闭JFrame。这是主要代码: 这是Frame的代码: 如果我不在start()中调用updater(),我可以关闭JFrame。我知道我离开running=true,但它仍然应该关闭,因为这在我的旧计

  • 这个问题是由打字错误或无法再复制的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能对未来的读者有所帮助。 Eclipse 版本 :eclipse-jee-oxygen-3a-win32-x86_64 java : jdk1.7.0_79 系统信息 : Eclipse错误: eclipse配置设置文件: -启动插件/org.eclipse.equinox.launcher_1