Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

Androidアプリ内でPDFを表示する - MuPDFの場合(その1) -

f:id:IntelligentTechnology:20131029095638p:plain:w240

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 SDKをインストールする

こちらのサイトから「Android SDK」を入手してインストールします。(手順については割愛いたします。)

Android NDKをインストールする

「MuPDF」ライブラリをビルドしてAndroidアプリから利用するために、「Android NDK」が必要になります。

今回は、Macを利用して動作確認を行いますので、「Android NDK」のページから、Mac OS用のファイルを選択してダウンロードします。
f:id:IntelligentTechnology:20131029114055p:plain

ダウンロードしたファイルを展開して、Android SDKのフォルダに配置します。
f:id:IntelligentTechnology:20131029114526p:plain

利便性のために、私はフォルダ名を「ndk」に変更しました。
f:id:IntelligentTechnology:20131029114606p:plain

また、このAndroid NDKのフォルダに、パスを通しておきます。例えば以下のような感じで。

export PATH=$PATH:/{android sdk folder}/ndk

Android NDKのインストールはこれで完了です。

「MuPDF」のソースをダウンロードする

こちらから、「MuPDF」のソースをダウンロードします。
今回はMacを利用しているので、「mupdf-1.3-source.tar.gz」のほうを選びます。
f:id:IntelligentTechnology:20131029132511p:plain

ダウンロードが完了したら、お好きなフォルダに展開します。ファイルを展開すると、以下のような構成になっていました。
f:id:IntelligentTechnology:20131029132654p:plain

「MuPDF」をビルドする

「MuPDF」をビルドするために、いくつか操作を行う必要があります。

まずターミナルを起動して、ダウンロードした「MuPDF」のフォルダに移動し、以下のコマンドを実行します。

make generate

コマンドが正常に完了すると、以下の通り「generated」フォルダが生成されます。
f:id:IntelligentTechnology:20131029133551p:plain

次に、Androidプロジェクトに含まれることになる、「local.properties」ファイルを作成します。
以下のコマンドを実行します。

cd platform/android/
cp -p local.properties.sample local.properties

生成された「local.properties」ファイルをテキストエディタで開いて、以下のように編集します。
f:id:IntelligentTechnology:20131029134040p:plain
sdk.dir」に、実際のAndroid SDKのフォルダへのパスを指定します。

最後に、「MuPDF」ライブラリをAndroidで利用できるようにするために、以下のコマンドを実行します。(※「ndk-build」は、Android NDKが提供しているツールです。)

cd ../../
ndk-build

これで完了です。
ここまで正常に実行できますと、以下のとおり、「libmupdf.so」ファイルが生成されます。
f:id:IntelligentTechnology:20131029134722p:plain

また、「platform/android/」フォルダが、そのままAndroid用サンプルアプリのプロジェクトフォルダになります。
これは後ほど、Eclipseにインポートして、実際に動かしてみます。

EclipseからAndroid NDKを使えるようにする

Eclipseを起動して、[Window] > [Preferences] > [Android] > [NDK] メニューを選択します。
表示された画面の「NDK Location」欄に、インストールしたAndroid NDKのパスを指定します。
f:id:IntelligentTechnology:20131029135535p:plain

Android用サンプルアプリを実行する

あとは簡単です。
Eclipse[File] > [Import] メニューから「Existing Android Code Into Workspace」を選択します。
f:id:IntelligentTechnology:20131021144744p:plain:w400

読み込み元のフォルダとして、「MuPDF」のフォルダ内の、Androidサンプルアプリのプロジェクトフォルダ(=「platform/android/」フォルダ)を指定します。(プロジェクト名は、「MuPdfSample」に変更しました。)
f:id:IntelligentTechnology:20131029140031p:plain:w480

プロジェクト読み込み完了後、Android実機、またはエミュレータで実行すると、
f:id:IntelligentTechnology:20131029140228p:plain:w320

まず上記のようなファイル選択画面が表示されます。
いずれかのPDFファイルを選択すると、
f:id:IntelligentTechnology:20131029140338p:plain:w320

このとおり、アプリ内でPDFファイルを表示することができました。
以下のとおり、テキストのハイライト表示や、線の自由描画も行えます。(線の描画に関しては、Android NDKの仕組みは使っていないみたいでした。)
f:id:IntelligentTechnology:20131029095638p:plain:w320

ライセンスだけ惜しい

「MuPDF」ライブラリを使ったPDFファイルの表示に関しては、まったく問題なさそうです。
それだけに、ビジネス用途だと、ライセンスがちょっと使いにくいのが惜しいところです。(料金を支払えば解決するんですけどね。)

なお、エミュレータで実行する場合、Android NDKからネイティブの機能を呼び出している関係上、「CPU」には「ARM」を指定しておく必要がありますので、この点だけご注意ください。(「Intel Atom」では正しく動作しません。)
f:id:IntelligentTechnology:20131029164029p:plain:w360

※追記

「MuPDF」ライブラリを、自作Androidアプリに組み込んで使う方法についてもまとめました。
Adnroidアプリ内でPDFを表示する - MuPDFの場合(その2) -」をご覧ください。