PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException
Posted
技术标签:
【中文标题】PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException【英文标题】:PdfRenderer always throwing 'password required' SecurityException after rendering a password-protected file 【发布时间】:2020-04-21 13:39:25 【问题描述】:我有以下 android 代码:
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();
PDF 文件f1
受密码保护。 PDF 文件f2
不是。当我运行代码时,两个文件都出于某种原因引发了安全异常 (password required or incorrect password
)。当我正确地切换顺序(f2
排在第一位,f1
排在第二位)时,只有受密码保护的 PDF 会引发异常。
我做错了什么吗?谢谢。
编辑:我怀疑它与 open()
方法有关,返回一个静态对象。但是我无法找到有效销毁它的方法(我在返回的ParcelFileDescriptor
对象上尝试了close()
,但没有成功)。
【问题讨论】:
【参考方案1】:我也遇到过类似的问题。 您可以使用适用于 Android 的 PDFBox 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();
【讨论】:
以上是关于PdfRenderer 在呈现受密码保护的文件后总是抛出“需要密码”SecurityException的主要内容,如果未能解决你的问题,请参考以下文章
页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时
使用 Sun PDFRenderer 进行 Java 打印编码
PdfRenderer 错误:java.io.IOException:无法创建文档。错误:3