HTML-Dokumente drucken

Um auf Android-Geräten neben einfachen Fotos Inhalte auszudrucken, müssen Text und Grafiken in einem Dokument drucken. Das Android-Framework bietet die Möglichkeit, mithilfe von HTML ein Dokument zu erstellen und mit ein Minimum an Code drucken.

In Android 4.4 (API-Level 19) wurde die Klasse WebView aktualisiert auf Drucken von HTML-Inhalten aktivieren Mit der Klasse können Sie eine lokale HTML-Ressource laden oder herunterladen eine Seite aus dem Web zu erhalten, einen Druckauftrag zu erstellen und ihn an die Druckdienste von Android zu übergeben.

In dieser Lektion erfahren Sie, wie Sie schnell ein HTML-Dokument mit Text und Grafiken verwenden Sie WebView, um sie zu drucken.

HTML-Dokument laden

Beim Drucken eines HTML-Dokuments mit WebView muss ein HTML-Code oder das Erstellen eines HTML-Dokuments als String. In diesem Abschnitt wird beschrieben, wie Sie ein HTML- String und laden Sie ihn zum Drucken in eine WebView.

Dieses Ansichtsobjekt wird in der Regel als Teil eines Aktivitätslayouts verwendet. Wenn Ihre Anwendung jedoch kein WebView verwendet, können Sie eine Instanz der Klasse erstellen. für Druckzwecke. Die Hauptschritte zum Erstellen dieser benutzerdefinierten Druckansicht sind:

  1. WebViewClient erstellen, die einen Druckauftrag startet nach dem wird die HTML-Ressource geladen.
  2. Laden Sie die HTML-Ressource in das WebView-Objekt.

Im folgenden Codebeispiel wird gezeigt, wie Sie ein einfaches WebViewClient erstellen und ein im Handumdrehen erstelltes HTML-Dokument laden:

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

Hinweis:Der Aufruf zum Generieren eines Druckauftrags muss in der onPageFinished()-Methode der WebViewClient erfolgen, die Sie im vorherigen Abschnitt erstellt haben. Wenn Sie nicht bis zur geladen wurde, ist die Druckausgabe möglicherweise unvollständig, leer oder gar nicht.

Hinweis: Der Beispielcode oben enthält eine Instanz des WebView-Objekt, damit vor dem Druckauftrag keine Speicherbereinigung durchgeführt wird. erstellt wird. Wiederholen Sie diesen Schritt in Ihrer eigenen Implementierung. Andernfalls wird der Druckvorgang ausgeführt. kann fehlschlagen.

Wenn Sie Grafiken in die Seite einbinden möchten, platzieren Sie die Grafikdateien im Ordner assets/. Verzeichnis Ihres Projekts und geben Sie im ersten Parameter des loadDataWithBaseURL()-Methode, wie in den folgenden Codebeispiel:

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

Sie können eine Webseite zum Drucken auch laden, indem Sie Methode loadDataWithBaseURL() mit loadUrl(), wie unten gezeigt.

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

Wenn Sie WebView zum Erstellen von Druckdokumenten verwenden, die folgenden Einschränkungen:

  • Sie können dem Dokument keine Kopf- oder Fußzeilen hinzufügen, auch keine Seitennummern.
  • Die Druckoptionen für das HTML-Dokument umfassen nicht die Möglichkeit, die Seite zu drucken. Das Drucken der Seiten 2 bis 4 eines zehnseitigen HTML-Dokuments wird nicht unterstützt.
  • Eine Instanz von WebView kann jeweils nur einen Druckauftrag verarbeiten.
  • Ein HTML-Dokument mit CSS-Druckattributen wie Querformateigenschaften unterstützt.
  • Sie können in einem HTML-Dokument kein JavaScript verwenden, um das Drucken auszulösen.

Hinweis: Der Inhalt eines WebView-Objekts, das in ein Layout kann auch gedruckt werden, sobald ein Dokument geladen wurde.

Wenn Sie eine benutzerdefinierte Druckausgabe erstellen und die volle Kontrolle über den Inhalt haben möchten auf der gedruckten Seite zeichnen möchten, springen Sie zur nächsten Lektion: Lektion Benutzerdefiniertes Dokument drucken

Nachdem Sie eine WebView erstellt und Ihre HTML-Inhalte geladen haben, ist fast fertig mit dem Druckprozess. In den nächsten Schritten PrintManager, Erstellen eines Druckadapters und schließlich das Erstellen Job. Das folgende Beispiel zeigt, wie diese Schritte ausgeführt werden:

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 diesem Beispiel wird eine Instanz des PrintJob-Objekts zur Verwendung durch den was nicht erforderlich ist. Ihre Anwendung kann dieses Objekt verwenden, um den Fortschritt von während der Verarbeitung des Druckauftrags erfolgt. Dieser Ansatz ist nützlich, wenn Sie den Status des Druckauftrags in Ihrer Anwendung auf Fertigstellung, Fehler oder Abbruch durch den Nutzer. Erstellen eines In-App-Benachrichtigung ist nicht erforderlich, da mit dem Print-Framework automatisch ein System Benachrichtigung für den Druckauftrag.