画像やテキストを印刷する方法|PrintManager|Kotlin|開発裏話
スレッド式メモ帳アプリ『CBnotes』には、メモの「印刷」機能が搭載されています。
公式ガイド「ファイルの印刷」
印刷の実現方法は、以下の公式ガイド「ファイルの印刷」で詳細に説明されていますので、それに倣えば、実装は非常に簡単です。
実装方法は「三択」になっています。
1.印刷対象の View を Bitmap 化して、「写真」として印刷する
2.HTML ドキュメントを作成して 「WEB ページ」として印刷する
3.Canvas へ好きなように自由に描画して印刷する
自由に描画できるカスタムドキュメントの印刷は、ページの余白など全てのレイアウトを自分で細かく考える必要がありますので、簡単ではありますが、非常に手間です。
『CBnotes』における実装
『CBnotes』では、「HTML タグで構成する WEB ページ風」に印刷する方法を選択しています。
以下に、『CBnotes』における実装を抜粋します。
private fun print(title: String, body: String) {
// Returns a localized string from the application's package's
// default string table.
var documentName = getString(R.string.app_name)
// Returns a string having leading and trailing whitespace removed.
var trim = title.trim()
// Returns `true` if this char sequence is empty (contains no characters).
if (trim.isEmpty()) {
// Returns a localized string from the application's package's
// default string table.
trim = getString(R.string.no_title)
} else {
documentName = "$documentName - $trim"
}
// Generate an HTML document on the fly:
val img = "<img src=\"ic_launcher.png\" width=\"64\" height=\"64\">"
val data = "<html><body>$img<hr><h3>$trim</h3><hr><p>${body.replace("\n", "<br>")}</p></body></html>"
// Creates a print job for printing a PrintDocumentAdapter with
// default print attributes.
PrintUtils.print(this, data, documentName)
}
class PrintUtils
// Keep a reference to WebView object until you pass the PrintDocumentAdapter
// to the PrintManager.
private var webView: WebView? = null
fun print(context: Context, data: String, documentName: String) {
// Create a WebView object specifically for printing.
webView = WebView(context)
webView!!.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false
override fun onPageFinished(view: WebView, url: String) {
Log.i(TAG, "page finished loading $url")
// Creates a print job for printing a PrintDocumentAdapter with
// default print attributes.
print(context, view, documentName)
webView = null
}
}
webView!!.loadDataWithBaseURL("file:///android_asset/", data, "text/HTML", "UTF-8", null)
}
fun print(context: Context, webView: WebView, documentName: String) {
// Get a PrintManager instance.
(context.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->
// Get a print adapter instance.
val documentAdapter = webView.createPrintDocumentAdapter(documentName)
// Create a print job with name and adapter instance.
printManager.print(documentName, documentAdapter, PrintAttributes.Builder().build())
}
}
『CBnotes』ソースコード一式
以下 note で、実際に Google Play へ公開リリースしている『CBnotes』のソースコード一式を販売しております。
Android(Kotlin)アプリ開発を学習している方々には「参考教材」として、業務で動作実績のあるサンプルコード&開発環境一式が必要なプロの方々には「工数削減」として、大変にオススメです。