2017-10-18 139 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