Pour imprimer du contenu au-delà d'une simple photo sur Android, vous devez rédiger du texte et des images dans un imprimer un document. Le framework Android permet d'utiliser le langage HTML pour composer un document et l'imprimer avec un minimum de code.
Dans Android 4.4 (niveau d'API 19), la classe WebView
a été mise à jour vers
activer l'impression de contenu HTML. La classe vous permet de charger une ressource HTML locale ou de télécharger
une page sur le Web, créer une tâche d'impression
et la transmettre aux services d'impression d'Android.
Cette leçon vous montre comment créer rapidement un document HTML contenant du texte et des images
utilisez WebView
pour l'imprimer.
Charger un document HTML
L'impression d'un document HTML avec WebView
implique le chargement d'un fichier HTML
ressource ou la création d'un document HTML sous forme de chaîne. Cette section explique comment créer un code HTML
et la charger dans un WebView
pour l'imprimer.
Cet objet de vue est généralement utilisé dans la mise en page d'une activité. Toutefois, si votre application
n'utilise pas de WebView
, vous pouvez créer une instance de la classe
en particulier à des fins d'impression. Voici les principales étapes à suivre pour créer cette vue d'impression personnalisée:
- Créer un
WebViewClient
qui démarre une tâche d'impression au bout de la ressource HTML est chargée. - Chargez la ressource HTML dans l'objet
WebView
.
L'exemple de code suivant montre comment créer un élément WebViewClient
simple et charger un document HTML créé à la volée:
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; }
Remarque:Assurez-vous que votre appel pour générer une tâche d'impression s'effectue dans la méthode onPageFinished()
du WebViewClient
que vous avez créé à la section précédente. Si vous n'attendez pas que la page
est terminé, l'impression peut être incomplète, vide ou échouer complètement.
Remarque:L'exemple de code ci-dessus contient une instance de la classe
WebView
pour éviter la récupération de mémoire avant la tâche d'impression.
est créé. Veillez à effectuer la même opération dans votre propre implémentation. Sinon, le processus d'impression
peut échouer.
Si vous souhaitez inclure des éléments graphiques sur la page, placez les fichiers graphiques dans le fichier assets/
.
de votre projet et spécifiez une URL de base dans le premier paramètre de la
loadDataWithBaseURL()
, comme indiqué dans
l'exemple de code suivant:
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);
Vous pouvez également charger une page Web à imprimer en remplaçant le
Méthode loadDataWithBaseURL()
avec
loadUrl()
comme indiqué ci-dessous.
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");
Lorsque vous utilisez WebView
pour créer des documents imprimés, vous devez savoir
les limites suivantes:
- Vous ne pouvez pas ajouter d'en-têtes ni de pieds de page au document, y compris des numéros de page.
- Les options d'impression du document HTML ne permettent pas d'imprimer des pages plages. Exemple: l'impression de la page 2 à 4 d'un document HTML de 10 pages n'est pas prise en charge.
- Une instance de
WebView
ne peut traiter qu'une seule tâche d'impression à la fois. - Un document HTML contenant des attributs d'impression CSS, tels que des propriétés en mode paysage, n'est pas compatibles.
- Vous ne pouvez pas utiliser JavaScript dans un document HTML pour déclencher l'impression.
Remarque:Le contenu d'un objet WebView
inclus dans
une mise en page peut également être imprimée
après avoir chargé un document.
Si vous souhaitez créer une version d'impression plus personnalisée et avoir un contrôle total sur le contenu sur la page imprimée, passez à la leçon suivante: Imprimer un document personnalisé.
Créer une tâche d'impression
Après avoir créé un WebView
et chargé votre contenu HTML, votre
l’application a presque fini avec sa partie
du processus d’impression. Les étapes suivantes
sont l'accès
le PrintManager
, en créant un adaptateur d'impression et enfin, en créant une
d'un projet. L'exemple suivant montre comment effectuer ces étapes:
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); }
Cet exemple enregistre une instance de l'objet PrintJob
pour que
de votre application, ce qui n'est pas obligatoire. Votre application peut utiliser cet objet pour suivre la progression de
la tâche d'impression pendant son traitement. Cette approche est utile lorsque vous souhaitez surveiller l'état
de la tâche d'impression associée à votre candidature en cas d'achèvement, d'échec ou d'annulation par l'utilisateur. Créer un
la notification dans l'application n'est pas requise, car le framework d'impression crée automatiquement un système
pour la tâche d'impression.