我正在用Java生成一个带有这样代码的PDDocument ......
HashMap<Integer, PDPageContentStream> mPageContentStreamMap = new HashMap<>();
PDDocument doc = new PDDocument();
for (int i = 1; i <= mNumPages; i++) {
PDPage page = new PDPage(PDRectangle.A4);
page.setRotation(90);
PDPageContentStream pageContentStream = new PDPageContentStream(doc, page);
contentStreamMap.put(i, pageContentStream);
doc.addPage(page);
}
}
然后保存并关闭这样的文件...
for (int i : mPageContentStreamMap.keySet()) {
mPageContentStreamMap.get(i).close();
}
doc.save("test-filename");
doc.close();
第一次运行时效果很好;但是,当我多次运行我的程序时,我收到以下错误
java.io.IOException: Scratch file already closed
at org.apache.pdfbox.io.ScratchFile.checkClosed(ScratchFile.java:390)
at org.apache.pdfbox.io.ScratchFileBuffer.<init>(ScratchFileBuffer.java:78)
at org.apache.pdfbox.io.ScratchFile.createBuffer(ScratchFile.java:403)
at org.apache.pdfbox.cos.COSStream.createOutputStream(COSStream.java:208)
at org.apache.pdfbox.pdmodel.common.PDStream.createOutputStream(PDStream.java:224)
at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:259)
at org.apache.pdfbox.pdmodel.PDPageContentStream.<init>(PDPageContentStream.java:121)
如果我在没有“doc.close();”的情况下重新运行我的程序行,此错误消失,但PDF的输出是重复的(即生成一个新的PDF,但使用上一个PDF的内容和当前PDF的内容)。
有没有办法关闭流并创建多个PDF而不会遇到暂存文件错误?
答案 0 :(得分:0)
我为绘图逻辑创建了一个单例对象,这意味着在第一次运行之后,相同的对象在不应该被重用时被重用,因为输入(正在绘制的内容)已经改变。