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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム