AndroidアプリのViewをPDFファイルとして出力する方法
PdfDocument というAndroidアプリからPDFファイルを出力したい時に
便利なAPIがAndroid SDK 19から用意されています。
今回はこのAPIを使ったサンプルアプリのご紹介です。
ソースコードです。
// PDF出力リクエスト
private const val PDFOUT_REQUEST_CODE: Int = 30
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ボタンを押したらimageViewの内容をpdfに出力します。
// imageViewには@android:drawable/btn_star_big_onを表示している
button.setOnClickListener {
doOutPutFile("application/pdf", editFileNameText.text.toString(), PDFOUT_REQUEST_CODE)
}
}
// ACTION_CREATE_DOCUMENTインテントを使用したPDF出力メソッド
private fun doOutPutFile(mimeType: String, fileName: String, requestCode : Int) {
// ストレージアクセスフレームワークを使った ドキュメントファイル作成用のインテント
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
// mimeTypeの設定
intent.type = mimeType
// 保存先ファイル名を設定
intent.putExtra(Intent.EXTRA_TITLE, fileName)
startActivityForResult(intent, requestCode)
}
// startActivityForResultの結果を受け取る
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// PDF用のリクエスト かつ 結果が成功であればPDFの書き込みを行う
if(requestCode == PDFOUT_REQUEST_CODE && resultCode == Activity.RESULT_OK)
{
// データのnullチェック
if(data?.data != null)
{
val uri = data.data
try{
// dataから取得したuriに関連付けられたコンテンツへのOutputStreamを開く
val outputStream = contentResolver.openOutputStream(uri!!)
// imageViewの内容をPDFとして出力する
val content = imageView
// ビューのサイズを取得
val width = content.width
val height = content.height
// PdfDocumentを使用してPDF化を行う
val pdfDocument = PdfDocument()
// 1ページ分の設定 ビューと同じサイズ、ページインデックスは1
val pageInfo = PdfDocument.PageInfo.Builder(width, height, 1).create()
// ページを開始する
val page = pdfDocument.startPage(pageInfo)
// ページのキャンバスにビューを描き込む
content.draw(page.canvas)
// ページを終了する
pdfDocument.finishPage(page)
// pdfデータを出力する
pdfDocument.writeTo(outputStream)
// PdfDocumentを閉じる
pdfDocument.close()
}catch (e : Exception)
{
// エラーが起きたら
// Uriが指し示す先のファイルを削除する。
DocumentsContract.deleteDocument(contentResolver, uri!!)
Toast.makeText(this, "エラーが発生しました", Toast.LENGTH_SHORT).show()
}
}
}
}
}
doOutPutFile()メソッドで、ストレージアクセスフレームワークを
使用したファイル出力用のインテントを発行しています。
その結果をonActivityResult()で受け取り、PdfDocumentを使いImageView
の内容をPDFのページデータとして描き込みを行い
引数によって渡されたURIから出力先ファイルのOutPutStreamに対して
PDFファイルのデータを出力しています。
実行結果です。



ストレージアクセスフレームワーク を使うと外部ストレージに出力する際に
WRITE_EXTERNAL_STORAGE パーミッション
をアプリからリクエストする必要がありません。
水曜担当:Tanaka
tanaka at 2023年06月21日 10:00:00