首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PDFBox中关闭PDFParser流的正确方法

在PDFBox中关闭PDFParser流的正确方法
EN

Stack Overflow用户
提问于 2018-02-02 05:12:47
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
pd.close();

我意识到这是在我的文件夹中留下了一个没有清理的临时文件。在尝试之后,我意识到我必须特别关闭RandomAccessBufferedFileInputStream。

代码语言:javascript
复制
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会帮我关闭这个流。是我做错了什么呢,还是这是意料之中的?我的代码似乎可以工作,但我不确定现在是否是关闭流的“正确时机”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-02 14:13:02

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

代码语言:javascript
复制
private PDDocument getPDDocument(InputStream inputStream) throws IOException
{
    return PDDocument.load(inputStream);
}

关闭文档的正确方法是

代码语言:javascript
复制
doc.close();

其中doc是一个PDDocument对象。

当前版本为2.0.8。

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-02-02 05:23:34

而不是这样:

代码语言:javascript
复制
   COSDocument cospd = parser.getDocument();
   return new PDDocument(cospd);

试着这样做:

代码语言:javascript
复制
return parser.getPDDocument();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48571808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档