Cómo imprimir documentos HTML

Para imprimir contenido aparte de una simple foto en Android, es necesario redactar texto y gráficos en una imprimir documento. El framework de Android ofrece una forma de usar HTML para redactar un documento y imprimirla con un mínimo de código.

En Android 4.4 (nivel de API 19), la clase WebView se actualizó a habilitar la impresión de contenido HTML. Esta clase te permite cargar o descargar un recurso HTML local. una página de la Web, crear un trabajo de impresión y entregarlo a los servicios de impresión de Android.

En esta lección, se muestra cómo crear rápidamente un documento HTML que contenga texto y gráficos, y usa WebView para imprimirlo.

Cómo cargar un documento HTML

Imprimir un documento HTML con WebView implica cargar un archivo HTML o crear un documento HTML como una cadena. En esta sección, se describe cómo compilar una cadena HTML y cargarla en un objeto WebView para imprimir.

Este objeto de vista generalmente se usa como parte de un diseño de actividad. Sin embargo, si tu aplicación no está utilizando un objeto WebView, puedes crear una instancia de la clase específicamente para fines de impresión. Los pasos principales para crear esta vista de impresión personalizada son los siguientes:

  1. Crea un WebViewClient que inicie un trabajo de impresión después se carga el recurso HTML.
  2. Carga el recurso HTML en el objeto WebView.

En la siguiente muestra de código, se muestra cómo crear un objeto WebViewClient simple y cargar un documento HTML sobre la marcha:

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;
}

Nota: Asegúrate de que la llamada para generar un trabajo de impresión se realice en el método onPageFinished() de la WebViewClient que creaste en la sección anterior. Si no esperas hasta la página finalizó la carga, es posible que el resultado de la impresión esté incompleto o en blanco, o que falle por completo.

Nota: El código de ejemplo anterior contiene una instancia de la WebView para que no sea recolección de elementos no utilizados antes del trabajo de impresión. cuando se cree. Asegúrate de hacer lo mismo en tu propia implementación; de lo contrario, durante el proceso de impresión puede fallar.

Si quieres incluir gráficos en la página, coloca los archivos gráficos en el assets/. de tu proyecto y especifica una URL base en el primer parámetro de la loadDataWithBaseURL(), como se muestra en la siguiente ejemplo de código:

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);

También puedes cargar una página web para imprimir; para ello, reemplaza el Método loadDataWithBaseURL() con loadUrl(), como se muestra a continuación.

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");

Cuando uses WebView para crear documentos impresos, debes tener en cuenta lo siguiente: las siguientes limitaciones:

  • No puedes agregar encabezados o pies de página, incluidos los números de página, al documento.
  • Las opciones de impresión de documentos HTML no incluyen la capacidad de imprimir rangos de página; por ejemplo, no es posible imprimir las páginas 2 a 4 de un documento HTML de 10 páginas.
  • Una instancia de WebView solo puede procesar un trabajo de impresión por vez.
  • Un documento HTML que contiene atributos de impresión CSS, como las propiedades de modo horizontal, no se no es compatible.
  • No puedes usar JavaScript en un documento HTML para activar la impresión.

Nota: El contenido de un objeto WebView que se incluye en un diseño también se puede imprimir una vez que carga un documento.

Si quieres crear una salida de impresión más personalizada y tener control total sobre el contenido dibujado en la página impresa, ve a la siguiente lección: Cómo imprimir un documento personalizado.

Después de crear un WebView y cargar el contenido HTML, tu aplicación casi termina con su parte del proceso de impresión. Los próximos pasos son acceder PrintManager, crear un adaptador de impresión y, por último, crear un archivo de impresión el trabajo. En el siguiente ejemplo, se muestra cómo realizar estos pasos:

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);
}

En este ejemplo, se guarda una instancia del objeto PrintJob para que la use la una aplicación, que no es obligatoria. Tu aplicación puede usar este objeto para seguir el progreso de el trabajo de impresión mientras se está procesando. Este enfoque es útil cuando quieres supervisar el estado del trabajo de impresión en tu solicitud si se completa, falla o cancela el usuario. Creación de un no se requiere una notificación en la app, ya que el marco de impresión crea automáticamente un sistema para el trabajo de impresión.