Android 5.0(Lollipop)にて、ようやくPDF読み込みがサポートされたので、早速エミュレータで試してみました。
今回使用したのは以下のクラスです。
・android.graphics.pdf.PdfRenderer
・android.graphics.pdf.PdfRenderer.Page
実装例
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
MainActivity
package com.example.test; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Rect; import android.graphics.pdf.PdfRenderer; import android.os.Bundle; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.widget.ImageView; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); File sdcard = Environment.getExternalStorageDirectory(); ParcelFileDescriptor fd = null; PdfRenderer renderer = null; PdfRenderer.Page page = null; try { // SDカード直下からtest.pdfを読み込み、1ページ目を取得 fd = ParcelFileDescriptor.open(new File(sdcard, "test.pdf"), ParcelFileDescriptor.MODE_READ_ONLY); renderer = new PdfRenderer(fd); page = renderer.openPage(0); ImageView view = (ImageView) findViewById(R.id.image); int viewWidth = view.getWidth(); int viewHeight = view.getHeight(); float pdfWidth = page.getWidth(); float pdfHeight = page.getHeight(); Log.i("test", "viewWidth=" + viewWidth + ", viewHeight=" + viewHeight + ", pdfWidth=" + pdfWidth + ", pdfHeight=" + pdfHeight); // 縦横比合うように計算 float wRatio = viewWidth / pdfWidth; float hRatio = viewHeight / pdfHeight; if (wRatio <= hRatio) { viewHeight = (int) Math.ceil(pdfHeight * wRatio); } else { viewWidth = (int) Math.ceil(pdfWidth * hRatio); } Log.i("test", "drawWidth=" + viewWidth + ", drawHeight=" + viewHeight); // Bitmap生成して描画 Bitmap bitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888); page.render(bitmap, new Rect(0, 0, viewWidth, viewHeight), null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); view.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fd != null) { fd.close(); } } catch (IOException e) { e.printStackTrace(); } if (page != null) { page.close(); } if (renderer != null) { renderer.close(); } } } }
実行結果
無事、こんな感じで出力されました。
注意点としては、RGB_565だと「Unsupported pixel format」とエラーが出力されてしまう点ですかね。
renderのAPI仕様に記載の通り、ARGBでないといけないようです。