Java PDFBox 2.0.3:PDDocument暂存文件已关闭

Java PDFBox 2.0.3:PDDocument暂存文件已关闭,java,pdfbox,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);

我正在用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)
java.io.IOException:临时文件已关闭
位于org.apache.pdfbox.io.ScratchFile.checkClosed(ScratchFile.java:390)
位于org.apache.pdfbox.io.ScratchFileBuffer(ScratchFileBuffer.java:78)
位于org.apache.pdfbox.io.ScratchFile.createBuffer(ScratchFile.java:403)
位于org.apache.pdfbox.cos.costream.createOutputStream(costream.java:208)
位于org.apache.pdfbox.pdmodel.common.PDStream.createOutputStream(PDStream.java:224)
位于org.apache.pdfbox.pdmodel.PDPageContentStream。(PDPageContentStream.java:259)
位于org.apache.pdfbox.pdmodel.PDPageContentStream。(PDPageContentStream.java:121)
如果我在没有“doc.close();”行的情况下重新运行程序,则此错误会消失,但PDF的输出会重复(即生成一个新的PDF,但包含上一个PDF的内容和当前PDF的内容)


有没有一种方法可以关闭流并创建多个PDF,而不会出现scratch文件错误?

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

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

当我多次运行程序时”意味着什么?哪一部分是重复的?我这样问是因为您创建的PageContentStream已“绑定”到文档。@TilmanHausherr我在while循环中运行该程序(使用上面代码的主生成方法),该程序将继续生成PDF,直到用户输入无效的输入。如果我只运行一次程序(无while循环),然后重新启动程序,它工作正常,但我需要在循环中使用它。为了进一步澄清,我创建了一个“generator”对象,并在循环中连续调用该对象上的“generate”方法。让我换一种方式问这个问题-contentstreammap何时初始化?据我所见,
mPageContentStreamMap.get(I)
将获取旧文档的内容流,如果您不清空或创建它。@tilmahausher原来是我的代码有问题,而不是PDFBox,很抱歉让人害怕。我为我的绘图逻辑创建了一个单例对象,这意味着在第一次运行之后,相同的对象在不应该被重用的时候被重用。“当我多次运行我的程序”意味着什么?哪一部分是重复的?我这样问是因为您创建的PageContentStream已“绑定”到文档。@TilmanHausherr我在while循环中运行该程序(使用上面代码的主生成方法),该程序将继续生成PDF,直到用户输入无效的输入。如果我只运行一次程序(无while循环),然后重新启动程序,它工作正常,但我需要在循环中使用它。为了进一步澄清,我创建了一个“generator”对象,并在循环中连续调用该对象上的“generate”方法。让我换一种方式问这个问题-contentstreammap何时初始化?据我所见,
mPageContentStreamMap.get(I)
将获取旧文档的内容流,如果您不清空或创建它。@tilmahausher原来是我的代码有问题,而不是PDFBox,很抱歉让人害怕。我已经为我的绘图逻辑创建了一个单例对象,这意味着在第一次运行之后,相同的对象在不应该被重用的时候被重用。