Mencetak dokumen HTML

Mencetak konten lebih dari sekadar foto sederhana di Android memerlukan penulisan teks dan gambar dalam dokumen cetak. Framework Android menyediakan cara menggunakan HTML untuk membuat dokumen dan mencetaknya dengan sedikit kode.

Di Android 4.4 (API level 19), class WebView telah diupdate menjadi mengaktifkan pencetakan konten HTML. Class ini memungkinkan Anda memuat resource HTML lokal atau mendownload halaman dari web, membuat tugas cetak, dan menyerahkannya ke layanan cetak Android.

Pelajaran ini menunjukkan kepada Anda cara membuat dokumen HTML yang berisi teks dan grafik dengan cepat dan gunakan WebView untuk mencetaknya.

Memuat dokumen HTML

Mencetak dokumen HTML dengan WebView melibatkan pemuatan HTML resource atau membuat dokumen HTML sebagai string. Bagian ini menjelaskan cara membuat HTML dan memuatnya ke dalam 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 khususnya untuk tujuan pencetakan. Langkah utama untuk membuat tampilan cetak kustom ini adalah:

  1. Buat WebViewClient yang memulai tugas pencetakan setelah resource HTML dimuat.
  2. 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 berisi instance objek WebView sehingga tidak dikumpulkan sebelum tugas pencetakan dibuat. Pastikan Anda melakukan hal yang sama dalam implementasi Anda sendiri, jika tidak, proses cetak dapat gagal.

Jika Anda ingin menyertakan grafik di halaman, tempatkan file grafis di assets/ project Anda dan tentukan URL dasar di parameter pertama 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.

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 berikut:

  • Anda tidak dapat menambahkan header atau footer, termasuk nomor halaman, ke dokumen.
  • Opsi pencetakan untuk dokumen HTML tidak mencakup kemampuan untuk mencetak halaman rentang, misalnya: Mencetak halaman 2 sampai 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 hasil cetak yang lebih disesuaikan dan memiliki kontrol penuh atas konten gambar pada halaman yang dicetak, lanjutkan ke pelajaran berikutnya: Pelajaran Mencetak dokumen kustom.

Setelah membuat WebView dan memuat konten HTML, aplikasi hampir selesai dengan bagian dari proses pencetakan. Langkah selanjutnya adalah mengakses PrintManager, membuat adaptor cetak, dan terakhir, membuat pekerjaan. 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 ketika Anda ingin memantau status dari tugas pencetakan di aplikasi Anda untuk penyelesaian, kegagalan, atau pembatalan pengguna. Membuat notifikasi dalam aplikasi tidak diperlukan, karena framework cetak otomatis membuat sistem untuk tugas pencetakan.