代码拉取完成,页面将自动刷新
版本:2.11.10
模块:pdfbox
错误原因:flush生成临时文件后,XEasyPdfImage等通过Stream加载的数据会被关闭,image会被清空。因此会导致下面的异常。我想可行的改动方法,方式一:调整XEasy的draw方法 方式二:每次flush后重新构建GlobalHeader;【目前我是用方式二解决的】
堆栈:
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:83)
at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:133)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1268)
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:416)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:570)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:496)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:480)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1162)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:452)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1435)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1322)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1379)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1346)
at wiki.xsx.core.pdf.doc.XEasyPdfDocument.flush(XEasyPdfDocument.java:717)
at wiki.xsx.core.pdf.doc.XEasyPdfDocument.saveTemp(XEasyPdfDocument.java:997)
at wiki.xsx.core.pdf.doc.XEasyPdfDocument.save(XEasyPdfDocument.java:766)
......
测试代码
public void testPdf() {
// 定义pdf输出路径
String outputPath = "D://out.pdf";
XEasyPdfText titleText = XEasyPdfHandler.Text.build("明细");
titleText.setHorizontalStyle(XEasyPdfPositionStyle.CENTER);
titleText.setFontSize(32);
titleText.setMarginTop(15);
XEasyPdfWatermark watermark = XEasyPdfHandler.Watermark.build("账单");
// 如果需要动态加Page,需要使用定制的对象;
XEasyPdfDocument document = XEasyPdfHandler.Document.build();
document.setGlobalHeader(XEasyPdfHandler.Header.build(
XEasyPdfHandler.Image.build(
new File("C:\\Users\\涂\\Pictures\\1_加入_创建社区.png"))));
document.setGlobalWatermark(watermark);
int[] cellWidth = {130, 80, 80, 262};
for (int current = 1; current <= GENERATE_PAGE; current++) {
XEasyPdfPage xEasyPdfPage = generatePage(current, cellWidth);
document.flush();
document.addPage(xEasyPdfPage);
}
document.save(outputPath).close();
}