はじめに
Androoid 5.0でサポートされたPDFドキュメントのレンダリングフレームワークで、これまでできなかった、PDFビューアがアプリで作ることが可能になりました。
サンプルアプリとリファレンスを元に作り方を簡単にまとめました。
作り方
5つのステップだけで簡単にPDFビューアが作れます。
1. ファイルディスクリプタからPDFレンダリングオブジェクト生成する。
.java
FileDescriptor fileDescriptor = context.getAssets().openFd("sample.pdf").getParcelFileDescriptor();
PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
2. 生成したレンダリングオブジェクトから、表示したいページを取得する。引数に指定。
.java
PdfRenderer.Page currentPage = pdfRenderer.openPage(index);
3. 表示したいページサイズのBitmapを生成し、レンダリングする。
.java
Bitmap bitmap = Bitmap.createBitmap(currentPage.getWidth(), currentPage.getHeight(),
Bitmap.Config.ARGB_8888);
currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
4. ImageViewに貼り付ける
.java
ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setImageBitmap(bitmap);
5. 後始末。
.java
currentPage.close();
pdfRenderer.close();
fileDescriptor.close();
補足:
- 生成するBitmapは、RGBではなくARGBということに注意
- レンダリングは、表示モード
RENDER_MODE_FOR_DISPLAY
と印刷モードRENDER_MODE_FOR_DISPLAY
の2種類がある。印刷モードを使う時は、スケーリングされるかPdfRenderer#shouldScaleForPrinting()
で確認しておくこと - PdfRendererはスレッドセーフではありません。困ることはないと思うけど実装時はご注意を
もっとよくする:
- ページ数は
pdfRenderer.getPageCount()
で取得できるので、全体の何ページを表示しているかUIにも反映可能 - ImageViewに貼り付けたビューは、GestureDetector使ってビンチイン/アウトUXを高めることをおすすめします。
chrisbanes/PhotoView · GitHub を使えば簡単に実現可能です。
.java
new PhotoViewAttacher(imageView);
蛇足:
PdfRendererクラスの中身見ると、nativeコールしてますね。Java層ではI/Fだけ用意して実装はやっぱりC言語なのですね
graphics/java/android/graphics/pdf/PdfRenderer.java - platform/frameworks/base - Git at Google