android將pdf檔案轉換成Bitmap,並將bitmap以圖片的 方式儲存到相簿。
阿新 • • 發佈:2019-01-07
背景:
公司專案要求使用者可以在手機端檢視發票並將發票已圖片的形式儲存到相簿,以便列印,問題來了,因為發票是.pdf,android不支援直接檢視pdf,所以要下載下來然後在手機上看,當時的需求是要下載下來在App上檢視,經查詢,使用了第三方的外掛==》PDFView, PDFView基於Google的VuDroid類庫來解碼PDF檔案,在APP內直接載入PDF檔案,效果也不錯;到這是一路的小平坡,坑來了,如何把pdf檔案以圖片的形式存到相簿,在網上也找了一些資料,以下是解決辦法:
解決思路:
利用PdfRenderer這個類降pdf檔案轉成bitmap集合,然後將bitmap集合轉成圖片集合依次存入到相簿。
程式碼實現
- pdf檔案轉成bitmap集合
private ArrayList<Bitmap> pdfToBitmap(File pdfFile) { ArrayList<Bitmap> bitmaps = new ArrayList<>(); try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)); Bitmap bitmap; final int pageCount = renderer.getPageCount(); Log.e("test_sign", "圖片de 張數: " +pageCount); for (int i = 0; i < pageCount; i++) { PdfRenderer.Page page = renderer.openPage(i); int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth(); int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight(); bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //todo 以下三行處理圖片儲存到本地出現黑屏的問題,這個涉及到背景問題 Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); canvas.drawBitmap(bitmap, 0, 0, null); Rect r = new Rect(0, 0, width, height); page.render(bitmap, r, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); bitmaps.add(bitmap); // close the page page.close(); } // close the renderer renderer.close(); } } catch (Exception ex) { ex.printStackTrace(); } return bitmaps; }
得到bitmap集合之後,將bitmap轉成圖片存到相簿。
private void saveImageToGallery(Context context, ArrayList<Bitmap> bitmaps) { // 首先儲存圖片 File appDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";); for (int i = 0; i < bitmaps.size(); i++) { if (!appDir.exists()) { appDir.mkdir(); } String fileName = System.currentTimeMillis() + ".jpg"; File file = new File(appDir, fileName); Log.e("test_sign", "圖片全路徑localFile = " + appDir.getAbsolutePath() + fileName); FileOutputStream fos = null; try { fos = new FileOutputStream(file); bitmaps.get(i).compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { showToast("儲存到相簿失敗!"); e.printStackTrace(); } catch (IOException e) { showToast("儲存到相簿失敗!"); e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); //回收 bitmaps.get(i).recycle(); } catch (IOException e) { e.printStackTrace(); } } } // 其次把檔案插入到系統圖庫 try { MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null); } catch (FileNotFoundException e) { showToast("儲存到相簿失敗!"); e.printStackTrace(); } } showToast("已儲存到手機相簿!"); // 最後通知相簿更新 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(appDir.getPath())))); }
這樣就能在相簿相簿裡看到存進去的圖片啦。
注意:
這期間就有一個問題,就是新增到相簿的圖片顯示不出來,顯示黑色,不過我貼出來的程式碼裡面已經處理了,就是TODO那裡
出現黑色原理分析:有個原理在裡面,bitmap轉jpg的時候,他本身有個空白背景是黑色的,然後當你用imageview去顯示的時候,imageview會直接把圖片背景變成白色,所以你能看得到,但是當你直接儲存到本地的時候,那麼背景為黑色的時候就會顯現出來,所以看到的是黑色,所以我這個時候通過畫布canvas把背景強制為白色,圖片就有了
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bitmap, 0, 0, null);
到此結束。