【Androidでデータやファイルと戯れる】android.graphics.pdfパッケージを使ってPDFを操作しよう!
AndroidでPDFを作成しよう!
API19以降からandroid.graphics.pdfが追加され、Android端末でPDFを作成できるようになりました。
そんなわけで今更ながらPDFの作り方を説明します。
また、今回紹介するandroid.graphics.pdfはCanvasを使ってPDFを作成するのでAndroidのCanvasに向き合うを参考にしてください。
android.graphics.pdfの紹介
まずはパッケージに含まれているクラス群の紹介からいきます。
| クラス名 | 概要 |
| PdfDocument | PDFドキュメントの新規作成、ページの管理、ファイルへの書き込み等を行います。 |
| PdfDocument.PageInfo | ページ情報を管理するクラス、コンストラクタはプライベートになっているのでPdfDocument.PageInfo.Builderを使用してインスタンスを作成する。 |
| PdfDocument.PageInfo.Builder | PdfDocument.PageInfoを作成するためのビルダークラス |
| PdfDocument.Page | PDFの一ページに相当し、ページに書き込むためのCanvasを管理する。 |
| PdfRenderer | Bitmapに書き出すためにPDFの全ページを読み込みます。 |
| PdfRenderer.Page | Bitmapに書き出すためにPDFの1ページを読み込みます。 |
PDFを作成するためのクラス群
PdfDocument
| シグネチャ | 説明 |
| PdfDocument.Page startPage(PdfDocument.PageInfo pageInfo) | PageInfoインスタンスを渡して編集可能な Pageを取得する。 closeメソッドを使用した後に使用してはいけません。 |
| void finishPage(PdfDocument.Page page) | Pageの編集を終了します。 closeメソッドを使用した後に使用してはいけません。 |
| void writeTo(OutputStream out) | PdfDocumentの内容を指定した出力ストリームに書き出します。 closeメソッドを使用した後に使用してはいけません。 また、startPageで編集を開始し、finishPageで編集を終了していないPageがある場合も使用してはいけません。 |
| void close() | PdfDocumentに対する操作を終了します。 startPageで編集を開始し、finishPageで編集を終了していないPageがある場合も使用してはいけません。 |
| List |
PdfDocumentに含まれるPageInfoのリストを返却します。 PageInfoが存在しない場合は空のリストが返却されます。 |
PdfDocument.PageInfo
| シグネチャ | 説明 |
| Rect getContentRect() | PDFページの高さと幅をRectクラスのインスタンスで返却する。 縦横のPoint値は1point = 1/72inchとなっています。 |
| int getPageHeight() | PDFページの高さのPoint値を返却する。 Point値は1point = 1/72inchとなっています。 |
| int getPageWidth() | PDFページの幅のPoint値を返却する。 Point値は1point = 1/72inchとなっています。 |
| int getPageNumber() | PDFページのページ番号を返却する。 |
PdfDocument.PageInfo.Builder
| コンストラクタ | 説明 |
| PdfDocument.PageInfo.Builder (int pageWidth, int pageHeight, int pageNumber) |
|
| シグネチャ | 説明 |
| PdfDocument.PageInfo create() | 設定した値でPdfDocument.PageInfoを作成する。 |
| PdfDocument.PageInfo.Builder setContentRect(Rect contentRect) | PDFページの高さと幅をRectクラスのインスタンスで設定する。 高さと幅のPoint値は1point = 1/72inchとなっています。 |
PdfDocument.Page
| シグネチャ | 説明 |
| PdfDocument.PageInfo getInfo() | Pageに設定されているPdfDocument.PageInfoを返却する。 |
| Canvas getCanvas() | Pageに書き込むためのCanvasを返却する。 |
PDFを表示するためのクラス群
PdfRenderer
| コンストラクタ | 説明 |
| PdfRenderer(ParcelFileDescriptor input) | ParcelFileDescriptor input:表示するためのFileを指定する。 |
| シグネチャ | 説明 |
| int getPageCount() | PDFのページ数を返却する。 |
| PdfRenderer.Page openPage(int index) | PDFの指定したページのPdfRenderer.Pageを返却する。 |
| void close() | PdfRendererを閉じます。 |
| boolean shouldScaleForPrinting() | 印刷のために拡大縮小を必要とするかを返却します。 |
PdfRenderer.Page
| シグネチャ | 説明 |
| int getIndex() | ページ番号を返却します。 |
| int getHeight() | PDFページの高さのPoint値を返却する。 Point値は1point = 1/72inchとなっています。 |
| int getWidth() | PDFページの幅のPoint値を返却する。 Point値は1point = 1/72inchとなっています。 |
| void render(Bitmap destination, Rect destClip, Matrix transform, int renderMode) | 渡したBitmapにPDFの内容を描画します。
|
| void close() | PdfRenderer.Pageを閉じます。 |
まとめ
今回は簡単なPDFの作成とPDFの表示を作成しました。
また、作成処理はとても遅いため、実際は非同期処理で実装した方がよさそうです。
サンプルプログラム
public class MainActivity extends AppCompatActivity {
private String path;
private PdfDocument pdfDocument;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
path = Environment.getExternalStorageDirectory().getPath() + "/" + Environment.DIRECTORY_DOWNLOADS + "/file.pdf";
//PDFを作成する。
createPdf();
//PDFの内容を画面に表示する。
showPdf();
}
public void createPdf(){
//PDFに書き込む時に使用するPaintを作成する。
paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(30);
//PdfDocumentをインスタンス化
pdfDocument = new PdfDocument();
long start = SystemClock.currentThreadTimeMillis();
FileOutputStream fos = null;
try {
//PDFに5ページ追加する。
for (int i = 0; i < 5 ; i++){
//ページを追加する。
addPage(i);
}
//PDFの書き込みストリームを生成する。
fos = new FileOutputStream(path);
//ストリームにPdfDocumentの内容を書き込む
pdfDocument.writeTo(fos);
//PdfDocumentを閉じる
pdfDocument.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Toast.makeText(this, "Time:"+(SystemClock.currentThreadTimeMillis() - start) + "ms", Toast.LENGTH_SHORT).show();
}
public void addPage(int pageNum){
/**
* PageInfoインスタンスを作成するためのビルダーをインスタンス化する。
* 幅:720point(10inch)
* 高さ:720point(10inch)
* ページ番号:pageNum
*/
PdfDocument.PageInfo.Builder builder = new PdfDocument.PageInfo.Builder(720, 720, pageNum);
//PageInfoをインスタンス化する。
PdfDocument.PageInfo pageInfo = builder.create();
//PageInfoから編集可能なPageインスタンスを取得する。
PdfDocument.Page page = pdfDocument.startPage(pageInfo);
//Pageにテキストを描画する。
page.getCanvas().drawText("PdfDocumentで作成した文書の " + pageNum + " ページ目" ,0 ,30, paint);
//Pageの編集を終了する。
pdfDocument.finishPage(page);
}
public void showPdf(){
//PDF表示用のViewを用意する。
ScrollView scrollView = new ScrollView(this);
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
scrollView.addView(linearLayout);
setContentView(scrollView);
try {
//表示するPDFファイルを指定し、ParcelFileDescriptorインスタンスを作成する。
ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.open(new File(path) , ParcelFileDescriptor.MODE_READ_ONLY);
//ParcelFileDescriptorインスタンスを使用しPdfRendererをインスタンス化する。
PdfRenderer pdfRenderer = new PdfRenderer(parcelFileDescriptor);
//印刷するために拡大縮小が必要かを調べる(今回はトースト表示するだけ)
Toast.makeText(this, "PdfRenderer#shouldScaleForPrinting():" + pdfRenderer.shouldScaleForPrinting(), Toast.LENGTH_SHORT).show();
//PDFにページが存在するときだけ表示処理を行う。
if (pdfRenderer.getPageCount() > 0) {
for (int i = 0 ; i < pdfRenderer.getPageCount() ; i++){
//ページ番号を指定してPdfRenderer.Pageインスタンスを取得する。
PdfRenderer.Page page = pdfRenderer.openPage(i);
//PdfRenderer.Pageの情報を使って空の描画用Bitmapインスタンスを作成する。
Bitmap bitmap = Bitmap.createBitmap(page.getWidth() , page.getHeight() , Bitmap.Config.ARGB_8888);
//空のBitmapにPDFの内容を描画する。
page.render(bitmap , null,null , PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
//PdfRenderer.Pageを閉じる、この処理を忘れると次回読み込む時に例外が発生する。
page.close();
//画面に表示する
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT ,ViewGroup.LayoutParams.WRAP_CONTENT ));
imageView.setImageBitmap(bitmap);
linearLayout.addView(imageView);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
|
|
|
|
||||||||||
| ||||||||||||||





