Stampa di documenti HTML

Per stampare contenuti diversi da una semplice foto su Android è necessario scrivere testo e grafica in un stampare un documento. Il framework Android fornisce un modo per utilizzare HTML per comporre un documento e stamparlo con un minimo di codice.

In Android 4.4 (livello API 19), la classe WebView è stata aggiornata a attivare la stampa di contenuti HTML. La classe consente di caricare una risorsa HTML locale o scaricare una pagina dal web, creare un processo di stampa e trasferirlo ai servizi di stampa di Android.

Questa lezione mostra come creare rapidamente un documento HTML che contiene testo, grafica e usa WebView per stamparlo.

Carica un documento HTML

La stampa di un documento HTML con WebView prevede il caricamento di un codice HTML risorsa o creando un documento HTML come stringa. Questa sezione descrive come creare una stringa HTML e caricarla in un WebView per la stampa.

Questo oggetto view è generalmente utilizzato come parte di un layout di attività. Tuttavia, se la tua applicazione non utilizza WebView, puoi creare un'istanza della classe per la stampa. I passaggi principali per creare questa visualizzazione di stampa personalizzata sono:

  1. Crea un WebViewClient che avvii un processo di stampa dopo viene caricata la risorsa HTML.
  2. Carica la risorsa HTML nell'oggetto WebView.

Il seguente esempio di codice mostra come creare un semplice WebViewClient e caricare un documento HTML creato all'istante:

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: assicurati che la chiamata per la generazione di un processo di stampa avvenga nel metodo onPageFinished() di WebViewClient che hai creato nella sezione precedente. Se non aspetti la pagina il caricamento è terminato, l'output di stampa potrebbe essere incompleto o vuoto oppure potrebbe non riuscire del tutto.

Nota: il codice di esempio riportato sopra contiene un'istanza del componente WebView oggetto in modo che non sia garbage collection prima del processo di stampa viene creato. Assicurati di fare lo stesso nella tua implementazione, altrimenti il processo di stampa potrebbe non riuscire.

Se vuoi includere elementi grafici nella pagina, posiziona i file grafici nell'elemento assets/ directory del tuo progetto e specifica un URL di base nel primo parametro del loadDataWithBaseURL(), come mostrato nell'esempio di codice riportato di seguito:

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

Puoi anche caricare una pagina web da stampare sostituendo il pulsante loadDataWithBaseURL() metodo con loadUrl() come mostrato di seguito.

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

Quando utilizzi WebView per creare documenti di stampa, tieni presente quanto segue le seguenti limitazioni:

  • Non puoi aggiungere intestazioni o piè di pagina, inclusi i numeri di pagina, al documento.
  • Le opzioni di stampa per il documento HTML non includono la possibilità di stampare la pagina Ad esempio: la stampa delle pagine da 2 a 4 di un documento HTML di 10 pagine non è supportata.
  • Un'istanza di WebView può elaborare un solo job di stampa alla volta.
  • Un documento HTML contenente attributi di stampa CSS, come le proprietà orizzontali, non supportati.
  • Non puoi utilizzare JavaScript in un documento HTML per attivare la stampa.

Nota: i contenuti di un oggetto WebView incluso in un layout può essere stampato anche dopo aver caricato un documento.

Se vuoi creare un output di stampa più personalizzato e avere il controllo completo dei contenuti disegnare sulla pagina stampata, passa alla lezione successiva: Lezione Stampa di un documento personalizzato.

Dopo aver creato un WebView e caricato i contenuti HTML, dell'applicazione quasi completa la sua parte del processo di stampa. I passaggi successivi consentono di accedere PrintManager, creando un adattatore di stampa e infine creando una stampa lavoro. L'esempio seguente illustra come eseguire questi passaggi:

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

In questo esempio viene salvata un'istanza dell'oggetto PrintJob per l'utilizzo da parte del dell'applicazione, che non è obbligatoria. L'applicazione potrebbe utilizzare questo oggetto per monitorare l'avanzamento il processo di stampa mentre viene elaborato. Questo approccio è utile per monitorare lo stato del processo di stampa nella tua applicazione per il completamento, l'errore o l'annullamento da parte dell'utente. La creazione di un la notifica in-app non è obbligatoria, perché il framework di stampa crea automaticamente un sistema una notifica per il processo di stampa.