我正在使用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为我关闭此流。我做错了什么或这是预期的吗?我的代码似乎有效,但我不确定这是否是关闭流的“正确时间”。
答案 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();