【发布时间】:2017-03-14 00:46:57
【问题描述】:
我正在用这样的代码在 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 而不会遇到暂存文件错误?
【问题讨论】:
-
“当我多次运行我的程序时”是什么意思?哪部分重复了?我问是因为您创建的 PageContentStream 已“绑定”到文档。
-
@TilmanHausherr 我在一个while循环中运行程序(上面的代码的主要生成方法),该循环继续生成PDF,直到用户输入无效输入。如果我只运行一次程序(没有 while 循环),然后重新启动程序,它工作正常,但我需要它在一个循环中。
-
为了进一步澄清,我创建了一个“生成器”对象,并在循环中不断调用该对象的“生成”方法。
-
让我换个方式问 - contentstreammap 什么时候初始化?据我所知,
mPageContentStreamMap.get(i)如果不清空或者不创建,就会得到旧文档的内容流。 -
@TilmanHausherr 原来是我的代码而不是 PDFBox 的问题,抱歉吓到了。我为我的绘图逻辑创建了一个单例对象,这意味着在第一次运行后,相同的对象在不应该被重用时被重用。