Android SDKには、PDFのライブラリがない
こんにちは、中山です。
ちょっと意外だったのですけれども、Android SDKには、PDFファイルを取り扱うためのライブラリがありません。
それではPDFファイルを表示したいときはどうするのか、というと、通常はIntentの仕組みを使って、外部のビューアアプリにその表示をまかせる、ということになると思います。
しかし、とは言いましても、やっぱりアプリ内でPDFを表示したい、というケースは出てくるものです。
「pdf.js」ライブラリは使えないだろうか?
少し前に、「Windowsストアアプリ内でPDFを表示するための、ある1つの方法」という記事で、Windowsストアアプリ内でPDFを表示する方法を紹介していました。
ここで利用していた「pdf.js」というライブラリは、Androidでも同様に利用できるみたいです。
しかしながら、難点としては、とにかく「遅い」。
PDF自体はきれいに表示できるものの、表示が完了するまでに、けっこう時間がかかってしまいます。
「MuPDF」を使ってみる
そこで、代わりに「MuPDF」というライブラリを使ってみることにしました。
Androidで使える、フリーのPDFライブラリを探してみても、なかなか良いものが見つからない中、比較的良い品質であったのが、この「MuPDF」ライブラリでした。日本語も問題なく表示できるようです。
なお、このライブラリは「AGPL」ライセンスで提供されていますので、その点だけちょっと注意が必要です。(これとは別に、有償の商用ライセンスも提供されているみたいです。)
とにかく、まずは動かしてみましょう。
Android NDKをインストールする
「MuPDF」ライブラリをビルドしてAndroidアプリから利用するために、「Android NDK」が必要になります。
今回は、Macを利用して動作確認を行いますので、「Android NDK」のページから、Mac OS用のファイルを選択してダウンロードします。
ダウンロードしたファイルを展開して、Android SDKのフォルダに配置します。
利便性のために、私はフォルダ名を「ndk」に変更しました。
また、このAndroid NDKのフォルダに、パスを通しておきます。例えば以下のような感じで。
export PATH=$PATH:/{android sdk folder}/ndk
Android NDKのインストールはこれで完了です。
「MuPDF」のソースをダウンロードする
こちらから、「MuPDF」のソースをダウンロードします。
今回はMacを利用しているので、「mupdf-1.3-source.tar.gz」のほうを選びます。
ダウンロードが完了したら、お好きなフォルダに展開します。ファイルを展開すると、以下のような構成になっていました。
「MuPDF」をビルドする
「MuPDF」をビルドするために、いくつか操作を行う必要があります。
まずターミナルを起動して、ダウンロードした「MuPDF」のフォルダに移動し、以下のコマンドを実行します。
make generate
コマンドが正常に完了すると、以下の通り「generated」フォルダが生成されます。
次に、Androidプロジェクトに含まれることになる、「local.properties」ファイルを作成します。
以下のコマンドを実行します。
cd platform/android/ cp -p local.properties.sample local.properties
生成された「local.properties」ファイルをテキストエディタで開いて、以下のように編集します。
「sdk.dir」に、実際のAndroid SDKのフォルダへのパスを指定します。
最後に、「MuPDF」ライブラリをAndroidで利用できるようにするために、以下のコマンドを実行します。(※「ndk-build」は、Android NDKが提供しているツールです。)
cd ../../ ndk-build
これで完了です。
ここまで正常に実行できますと、以下のとおり、「libmupdf.so」ファイルが生成されます。
また、「platform/android/」フォルダが、そのままAndroid用サンプルアプリのプロジェクトフォルダになります。
これは後ほど、Eclipseにインポートして、実際に動かしてみます。
EclipseからAndroid NDKを使えるようにする
Eclipseを起動して、[Window] > [Preferences] > [Android] > [NDK] メニューを選択します。
表示された画面の「NDK Location」欄に、インストールしたAndroid NDKのパスを指定します。
Android用サンプルアプリを実行する
あとは簡単です。
Eclipseの [File] > [Import] メニューから「Existing Android Code Into Workspace」を選択します。
読み込み元のフォルダとして、「MuPDF」のフォルダ内の、Androidサンプルアプリのプロジェクトフォルダ(=「platform/android/」フォルダ)を指定します。(プロジェクト名は、「MuPdfSample」に変更しました。)
プロジェクト読み込み完了後、Android実機、またはエミュレータで実行すると、
まず上記のようなファイル選択画面が表示されます。
いずれかのPDFファイルを選択すると、
このとおり、アプリ内でPDFファイルを表示することができました。
以下のとおり、テキストのハイライト表示や、線の自由描画も行えます。(線の描画に関しては、Android NDKの仕組みは使っていないみたいでした。)
ライセンスだけ惜しい
「MuPDF」ライブラリを使ったPDFファイルの表示に関しては、まったく問題なさそうです。
それだけに、ビジネス用途だと、ライセンスがちょっと使いにくいのが惜しいところです。(料金を支払えば解決するんですけどね。)
なお、エミュレータで実行する場合、Android NDKからネイティブの機能を呼び出している関係上、「CPU」には「ARM」を指定しておく必要がありますので、この点だけご注意ください。(「Intel Atom」では正しく動作しません。)
※追記
「MuPDF」ライブラリを、自作Androidアプリに組み込んで使う方法についてもまとめました。
「Adnroidアプリ内でPDFを表示する - MuPDFの場合(その2) -」をご覧ください。