COSStream has been closed and cannot be read(COSStream已关闭,无法读取)
问题描述
我的项目中有下一个代码,它不时地落在COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
它发生在不同的时间和不同的工作量,所以我想解决它。
提前谢谢。
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;
}
推荐答案
您使用重新创建的模板文档(templatePDDocument
,fontTemplatePdf
)中的流,并在每次循环迭代中提供免费的垃圾回收。因此,在您调用outPDDocument.save
之前,这些模板文档中的一些可能已经被垃圾回收完成,从而导致您观察到的错误。
如果保留此基本体系结构,则可以通过将这些模板文档全部添加到某个集合并仅在调用outPDDocument.save
后清除该集合来防止这些模板文档过早定版。
或者,您也可以切换到克隆模板页面并使用克隆,而不是使用原始模板页面。
这篇关于COSStream已关闭,无法读取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:COSStream已关闭,无法读取
基础教程推荐
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01