Mencetak konten lebih dari sekadar foto sederhana di Android memerlukan penulisan teks dan gambar dalam dokumen cetak. Framework Android menyediakan cara menggunakan HTML untuk menulis dokumen dan mencetaknya dengan kode minimum.
Di Android 4.4 (API level 19), class WebView
telah diupdate untuk mengaktifkan pencetakan konten HTML. Class ini memungkinkan Anda memuat resource HTML lokal atau mendownload halaman dari web, membuat tugas pencetakan, dan menyerahkannya ke layanan cetak Android.
Tutorial ini menunjukkan cara membuat dokumen HTML yang berisi teks dan grafik dengan cepat serta menggunakan WebView
untuk mencetaknya.
Memuat dokumen HTML
Mencetak dokumen HTML dengan WebView
mencakup pemuatan resource HTML atau pembuatan dokumen HTML sebagai string. Bagian ini menjelaskan cara membuat string HTML
dan memuatnya ke WebView
untuk dicetak.
Objek tampilan ini biasanya digunakan sebagai bagian dari tata letak aktivitas. Namun, jika aplikasi Anda
tidak menggunakan WebView
, Anda dapat membuat instance class khusus
untuk tujuan pencetakan. Langkah utama untuk membuat tampilan cetak kustom ini adalah:
- Buat
WebViewClient
yang memulai tugas pencetakan setelah resource HTML dimuat. - Muat resource HTML ke objek
WebView
.
Contoh kode berikut menunjukkan cara membuat WebViewClient
sederhana dan memuat dokumen HTML yang dibuat dengan cepat:
Kotlin
private var mWebView: WebView? = null private fun doWebViewPrint() { // Create a WebView object specifically for printing val webView = WebView(activity) 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") createWebPrintJob(view) mWebView = null } } // Generate an HTML document on the fly: val htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, testing, testing...</p></body></html>" webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null) // Keep a reference to WebView object until you pass the PrintDocumentAdapter // to the PrintManager mWebView = webView }
Java
private WebView mWebView; private void doWebViewPrint() { // Create a WebView object specifically for printing WebView webView = new WebView(getActivity()); webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { Log.i(TAG, "page finished loading " + url); createWebPrintJob(view); mWebView = null; } }); // Generate an HTML document on the fly: String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " + "testing, testing...</p></body></html>"; webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null); // Keep a reference to WebView object until you pass the PrintDocumentAdapter // to the PrintManager mWebView = webView; }
Catatan: Pastikan panggilan Anda untuk menghasilkan pekerjaan cetak terjadi di metode onPageFinished()
dari WebViewClient
yang Anda buat di bagian sebelumnya. Jika Anda tidak menunggu hingga pemuatan halaman
selesai, output cetak mungkin tidak lengkap atau kosong, atau mungkin gagal sepenuhnya.
Catatan: Contoh kode di atas menyimpan instance objek WebView
sehingga objek tersebut tidak dibersihkan sampah memori sebelum tugas pencetakan dibuat. Pastikan Anda melakukan hal yang sama dalam implementasi Anda sendiri, jika tidak, proses cetak mungkin akan gagal.
Jika Anda ingin menyertakan grafik di halaman, tempatkan file grafis di direktori assets/
project Anda dan tentukan URL dasar di parameter pertama
metode loadDataWithBaseURL()
, seperti yang ditunjukkan dalam
contoh kode berikut:
Kotlin
webView.loadDataWithBaseURL( "file:///android_asset/images/", htmlBody, "text/HTML", "UTF-8", null )
Java
webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody, "text/HTML", "UTF-8", null);
Anda juga dapat memuat halaman web untuk dicetak dengan mengganti metode
loadDataWithBaseURL()
dengan
loadUrl()
seperti yang ditunjukkan di bawah ini.
Kotlin
webView.loadUrl("https://developer.android.com/about/index.html")
Java
// Print an existing web page (remember to request INTERNET permission!): webView.loadUrl("https://developer.android.com/about/index.html");
Saat menggunakan WebView
untuk membuat dokumen cetak, Anda harus mengetahui batasan-batasan berikut:
- Anda tidak dapat menambahkan header atau footer, termasuk nomor halaman, ke dokumen.
- Opsi pencetakan untuk dokumen HTML tidak mencakup kemampuan untuk mencetak rentang halaman, misalnya: Mencetak halaman 2 hingga 4 dari dokumen HTML 10 halaman tidak didukung.
- Instance
WebView
hanya dapat memproses satu pekerjaan cetak pada satu waktu. - Dokumen HTML yang berisi atribut cetak CSS, seperti properti lanskap, tidak didukung.
- Anda tidak dapat menggunakan JavaScript dalam dokumen HTML untuk memicu pencetakan.
Catatan: Konten objek WebView
yang disertakan dalam tata letak juga dapat dicetak setelah memuat dokumen.
Jika Anda ingin membuat output cetak yang lebih disesuaikan dan memiliki kontrol penuh atas gambar konten di halaman yang dicetak, lompat ke tutorial berikutnya: pelajaran Mencetak dokumen kustom.
Membuat pekerjaan cetak
Setelah membuat WebView
dan memuat konten HTML, aplikasi Anda hampir menyelesaikan bagian dari proses pencetakan. Langkah selanjutnya adalah mengakses
PrintManager
, membuat adaptor cetak, dan terakhir, membuat tugas
pencetakan. Contoh berikut menunjukkan cara melakukan langkah ini:
Kotlin
private fun createWebPrintJob(webView: WebView) { // Get a PrintManager instance (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager -> val jobName = "${getString(R.string.app_name)} Document" // Get a print adapter instance val printAdapter = webView.createPrintDocumentAdapter(jobName) // Create a print job with name and adapter instance printManager.print( jobName, printAdapter, PrintAttributes.Builder().build() ).also { printJob -> // Save the job object for later status checking printJobs += printJob } } }
Java
private void createWebPrintJob(WebView webView) { // Get a PrintManager instance PrintManager printManager = (PrintManager) getActivity() .getSystemService(Context.PRINT_SERVICE); String jobName = getString(R.string.app_name) + " Document"; // Get a print adapter instance PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(jobName); // Create a print job with name and adapter instance PrintJob printJob = printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build()); // Save the job object for later status checking printJobs.add(printJob); }
Contoh ini menyimpan instance objek PrintJob
untuk digunakan oleh
aplikasi, yang tidak diperlukan. Aplikasi Anda dapat menggunakan objek ini untuk melacak progres
tugas pencetakan saat sedang diproses. Pendekatan ini berguna saat Anda ingin memantau status tugas pencetakan dalam aplikasi untuk penyelesaian, kegagalan, atau pembatalan pengguna. Pembuatan notifikasi
dalam aplikasi tidak diperlukan, karena framework cetak otomatis membuat notifikasi
sistem untuk tugas pencetakan.