我有以下安卓代码:
private void test() throws IOException {
File f1 = new File("/sdcard/password-protected-pdf.pdf");
File f2 = new File("/sdcard/normal-pdf.pdf");
this.renderPDF(f1);
this.renderPDF(f2);
}
private void renderPDF(File f) throws IOException {
PdfRenderer renderer = null;
try {
renderer = new PdfRenderer(ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
} catch (SecurityException e) {
e.printStackTrace();
} finally {
if (renderer != null)
renderer.close();
}
}
f1
的 PDF 文件受密码保护。f2
的 PDF 文件不是。当我运行代码时,由于某种原因(password required or incorrect password
(,这两个文件都抛出了安全异常。当我正确切换顺序(f2
先行,f1
秒(时,只有受密码保护的 PDF 会引发异常。
我做错了什么吗?谢谢。
编辑:我怀疑它与返回静态对象的open()
方法有关。但是,我无法找到一种有效破坏它的方法(我尝试close()
返回的ParcelFileDescriptor
对象,但没有运气(。
我也遇到了类似的问题。 您可以使用 PDFBox for Android https://github.com/TomRoush/PdfBox-Android 并加载文档并检查密码保护。如果FIL是安全的,那么它将抛出IOException
注意:使用此库会增加您的应用大小。
private void test() throws IOException {
File f1 = new File("/sdcard/password-protected-pdf.pdf");
File f2 = new File("/sdcard/normal-pdf.pdf");
this.renderPDF(f1);
this.renderPDF(f2);
}
private void renderPDF(File f) throws IOException {
PdfRenderer renderer = null;
try {
// That will throw if document is password protected
PDDocument.load(f)
renderer = new PdfRenderer(ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
// Check for Password
e.printStackTrace();
}
finally {
if (renderer != null)
renderer.close();
}
}