【问题标题】:PDFBox 2.0.3: PDDocument Scratch File Already ClosedPDFBox 2.0.3:PDDocument 暂存文件已关闭
【发布时间】: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 的问题,抱歉吓到了。我为我的绘图逻辑创建了一个单例对象,这意味着在第一次运行后,相同的对象在不应该被重用时被重用。

标签: java pdfbox


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多