PDFBox 2.0.3:PDDocument Scratch文件已经关闭

时间:2016-10-31 21:08:03

标签: java pdfbox

我正在用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而不会遇到暂存文件错误?

1 个答案:

答案 0 :(得分:0)

我为绘图逻辑创建了一个单例对象,这意味着在第一次运行之后,相同的对象在不应该被重用时被重用,因为输入(正在绘制的内容)已经改变。