在PDFBox中关闭PDFParser中Stream的正确方法

时间:2018-02-01 21:12:47

标签: java pdfbox

我正在使用pdfbox2.0.3解析PDF文档:

private PDDocument getPDDocument(InputStream inputStream) throws IOException {
    org.apache.pdfbox.pdfparser.PDFParser parser = new org.apache.pdfbox.pdfparser.PDFParser(
            new RandomAccessBufferedFileInputStream(inputStream));

    try {
        parser.parse();
    } catch (NoClassDefFoundError e) {
        throw new SecurityException("PDF document is protected.", e);
    }

    COSDocument cospd = parser.getDocument();
    return new PDDocument(cospd);
}

稍后我关闭文档进行清理:

pd.close();

我意识到这会在我的文件夹中留下一个未清理的临时文件。玩完之后,我意识到我必须专门关闭RandomAccessBufferedFileInputStream。

private PDDocument getPDDocument(InputStream inputStream) throws IOException {
    RandomAccessBufferedFileInputStream strm = new RandomAccessBufferedFileInputStream(inputStream);

    try {
        org.apache.pdfbox.pdfparser.PDFParser parser = new org.apache.pdfbox.pdfparser.PDFParser(strm);

        try {
            parser.parse();
        } catch (NoClassDefFoundError e) {
            throw new SecurityException("PDF document is protected.", e);
        }

        COSDocument cospd = parser.getDocument();
        return new PDDocument(cospd);
    } finally {
        strm.close();
    }
}

我希望PDDocument或COSDocument为我关闭此流。我做错了什么或这是预期的吗?我的代码似乎有效,但我不确定这是否是关闭流的“正确时间”。

2 个答案:

答案 0 :(得分:1)

使用PDFBox 2. *的正确方法是:

private PDDocument getPDDocument(InputStream inputStream) throws IOException
{
    return PDDocument.load(inputStream);
}

关闭文档的正确方法是

doc.close();

doc是PDDocument对象。

目前的版本是2.0.8。

另一个好的工作模式是以打开它的方法关闭文档,这样就可以使用JDK7的try-with-resources。

如果您的InputStream来自文件,那么您可以并且应该将File对象传递给open(),您将获得更好的性能。

答案 1 :(得分:0)

而不是:

   COSDocument cospd = parser.getDocument();
   return new PDDocument(cospd);

尝试这样做:

return parser.getPDDocument();