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 ausdrucken.
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 Internet zu erstellen, 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 auszudrucken.
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:
WebViewClient
erstellen, die einen Druckauftrag startet nach dem wird die HTML-Ressource geladen.- 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 Druckjobs muss in der onPageFinished()
-Methode der WebViewClient
erfolgen, die Sie im vorherigen Abschnitt erstellt haben. Wenn Sie nicht warten, bis die Seite vollständig geladen ist, ist die Druckausgabe möglicherweise unvollständig oder leer oder es kommt zu einem vollständigen Fehler.
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 auf der Seite einfügen möchten, legen Sie die Grafikdateien im Verzeichnis assets/
Ihres Projekts ab und geben Sie im ersten Parameter der loadDataWithBaseURL()
-Methode eine Basis-URL an, wie im folgenden Codebeispiel gezeigt:
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, einschließlich Seitenzahlen, hinzufügen.
- 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
Druckauftrag erstellen
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 des Druckjobs während der Verarbeitung zu verfolgen. 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.