2017-10-18 130 views
0
public void onBrowse(View view) { 
    Intent chooseFile; 
    Intent intent; 
    chooseFile = new Intent(Intent.ACTION_GET_CONTENT); 
    chooseFile.addCategory(Intent.CATEGORY_OPENABLE); 
    chooseFile.setType("file/*"); 
    intent = Intent.createChooser(chooseFile, "Choose a file"); 
    startActivityForResult(intent, ACTIVITY_CHOOSE_FILE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode != RESULT_OK) return; 
    String path = ""; 
    if (requestCode == ACTIVITY_CHOOSE_FILE) { 
     Uri uri = data.getData(); 
     Log.v("Path:", uri.getPath()); 
     try { 
      openRenderer(HomeActivity.this, uri.getPath()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


private void openRenderer(Context context, String path) throws IOException { 
    // In this sample, we read a PDF from the assets directory. 
    File file = new File(path); 
    if (!file.exists()) { 
     // Since PdfRenderer cannot handle the compressed asset file directly, we copy it into 
     // the cache directory. 
     InputStream asset = context.getAssets().open(FILENAME); 
     FileOutputStream output = new FileOutputStream(file); 
     final byte[] buffer = new byte[1024]; 
     int size; 
     while ((size = asset.read(buffer)) != -1) { 
      output.write(buffer, 0, size); 
     } 
     asset.close(); 
     output.close(); 
    } 


    mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 
    if (mFileDescriptor != null) { 
     try { 
      mPdfRenderer = new PdfRenderer(mFileDescriptor); 
     } catch (SecurityException e) { 
      Log.v("password", e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

} 
访问

问题是,密码保护的PDF越来越安全异常。密码保护的PDF不被PdfRenderer

 
java.lang.SecurityException: cannot create document. Error: 4 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.graphics.pdf.PdfRenderer.(PdfRenderer.java:157) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at com.sbw.pdfrendererview.HomeActivity.openRenderer(HomeActivity.java:205) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at com.sbw.pdfrendererview.HomeActivity.onActivityResult(HomeActivity.java:157) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.Activity.dispatchActivityResult(Activity.java:7273) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.ActivityThread.deliverResults(ActivityThread.java:4520) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.ActivityThread.handleSendResult(ActivityThread.java:4567) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.ActivityThread.-wrap22(ActivityThread.java) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.os.Looper.loop(Looper.java:154) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6780) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
10-18 09:19:16.562 19058-19058/com.sbw.pdfrendererview W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 

回答

1

PdfRenderer不适用于呈现任意PDF文件。它设计用于在应用程序中打印的PDF文档的打印预览。因此,PdfRenderer不支持受密码保护的PDF文件。

+0

所以有什么事情,我们可以在android中打开一个受保护的PDF预览? –

+0

@SumantaBanerjee:可能有一个商业图书馆可以做到这一点。你可以看到['PDF.js'或'AndroidPdfViewer'](https://commonsware.com/blog/2017/01/04/options-viewing-pdfs.html)是否有能力做到这一点,尽管我做不记得看到它。 – CommonsWare

+0

PdfBox可以做到,但有时会被窃听。我正在做的是:如果有密码,请使用PdfBox,否则使用原生的'PdfRenderer'。另一种方法是使用PdfBox将文件保存在应用程序数据缓存中,而不使用密码,然后使用本机“PdfRenderer”来显示。 – 0101100101