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:
- Crea un
WebViewClient
che avvii un processo di stampa dopo viene caricata la risorsa HTML. - 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.
Creare un job di stampa
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.