Imprimer des documents HTML

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:

  1. Créer un WebViewClient qui démarre une tâche d'impression au bout de la ressource HTML est chargée.
  2. Chargez la ressource HTML dans l'objet WebView.

L'exemple de code suivant montre comment créer un WebViewClient simple et charger un document HTML créé instantanément :

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 l'objet WebView afin qu'il ne soit pas collecté avant la création de la tâche d'impression. 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 la méthode loadDataWithBaseURL() par 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 d'impression, tenez compte des 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 les propriétés paysage, n'est pas accepté.
  • 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 sortie d'impression plus personnalisée et contrôler complètement le contenu dessiné sur la page imprimée, passez à la leçon suivante : Imprimer un document personnalisé.

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. Il n'est pas nécessaire de créer une notification dans l'application, car le framework d'impression crée automatiquement une notification système pour la tâche d'impression.