Drukowanie materiałów w systemie Android wymaga utworzenia tekstu i grafiki w formacie wydrukuj dokument. Platforma Androida umożliwia wykorzystanie kodu HTML do utworzenia dokumentu i wydrukować go z minimalną ilością kodu.
W Androidzie 4.4 (poziom interfejsu API 19) klasa WebView
została zaktualizowana do
włącz drukowanie treści HTML. Dzięki niej możesz wczytać lokalny zasób HTML lub pobrać
stronę w internecie, utworzyć zadanie drukowania i przekazać je usługom drukowania na Androidzie.
Z tej lekcji dowiesz się, jak szybko utworzyć dokument HTML zawierający tekst i grafikę
użyj WebView
, aby go wydrukować.
Ładowanie dokumentu HTML
Drukowanie dokumentu HTML za pomocą WebView
obejmuje wczytanie kodu HTML
lub utworzyć dokument HTML w formie ciągu znaków. W tej sekcji opisano, jak utworzyć kod HTML
w formacie WebView
i wczytywać go w celu wydrukowania.
Ten obiekt widoku danych jest zwykle używany jako część układu działań. Jeśli jednak Twoja aplikacja
nie używa WebView
, możesz utworzyć instancję klasy
wyłącznie do celów związanych z drukiem. Aby utworzyć ten niestandardowy widok na potrzeby drukowania, wykonaj te czynności:
- Utwórz
WebViewClient
, który uruchamia zadanie drukowania po załadowaniu zasobu HTML. - Wczytaj zasób HTML do obiektu
WebView
.
Poniższy przykładowy kod pokazuje, jak utworzyć prosty WebViewClient
i wczytać dokument HTML utworzony na bieżąco:
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; }
Uwaga: upewnij się, że wywołanie generowania zadania drukowania odbywa się za pomocą metody onPageFinished()
w elemencie WebViewClient
utworzonego w poprzedniej sekcji. Jeśli nie poczekasz do momentu
ładowanie zostało zakończone, dane wyjściowe wydruku mogą być niekompletne lub puste, a nawet prowadzić do całkowitego błędu.
Uwaga: przykładowy kod powyżej zawiera wystąpienie elementu
WebView
obiekt, w którym nie są usuwane śmieci przed zadaniem drukowania
po utworzeniu konta. Pamiętaj o tym podczas implementacji, ponieważ w przeciwnym razie proces drukowania może się nie udać.
Jeśli na stronie chcesz dołączyć grafikę, umieść pliki graficzne w sekcji assets/
swojego projektu i podaj podstawowy adres URL w pierwszym parametrze
loadDataWithBaseURL()
, jak widać w metodzie
następujący przykładowy kod:
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);
Możesz też wczytać stronę internetową do drukowania, zastępując fragment
Metoda loadDataWithBaseURL()
z
loadUrl()
, jak widać poniżej.
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");
Podczas tworzenia dokumentów do drukowania za pomocą usługi WebView
należy pamiętać o tych ograniczeniach:
- Do dokumentu nie można dodawać nagłówków ani stopek, w tym numerów stron.
- Opcje drukowania dokumentu HTML nie obejmują możliwości drukowania zakresów stron. Na przykład nie można wydrukować stron od 2 do 4 w 10-stronicowym dokumencie HTML.
- Jedna instancja
WebView
może przetwarzać tylko jedno zadanie drukowania naraz. - Dokument HTML zawierający atrybuty drukowania w CSS, takie jak właściwości formatu poziomego, nie jest obsługiwany.
- W dokumencie HTML nie można używać JavaScriptu, aby aktywować drukowanie.
Uwaga: zawartość obiektu WebView
zawartego w
układ można też wydrukować po wczytaniu dokumentu.
Możliwość wydrukowania bardziej spersonalizowanych treści i zachowania pełnej kontroli nad treścią rysuj na wydrukowanej stronie, przejdź do następnej lekcji: Lekcja Drukowanie niestandardowego dokumentu.
Tworzenie zadania drukowania
Po utworzeniu pliku WebView
i wczytaniu treści HTML komponent
proces drukowania jest już prawie zakończony. Kolejne kroki: uzyskanie dostępu
PrintManager
, tworzenie przejściówki do wydruku, a na koniec –
pracy. Ten przykład pokazuje, jak wykonać te czynności:
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); }
W tym przykładzie zapisujemy instancję obiektu PrintJob
do wykorzystania przez
aplikacji, co nie jest wymagane. Aplikacja może używać tego obiektu do śledzenia postępu
podczas przetwarzania zadania drukowania. To podejście jest przydatne, gdy chcesz monitorować stan zadania drukowania w aplikacji w celu sprawdzenia, czy zostało ono ukończone, czy zakończyło się niepowodzeniem lub zostało anulowane przez użytkownika. Tworzenie
powiadomienia w aplikacji nie są wymagane, bo platforma drukowania automatycznie tworzy
powiadomienia o zadaniu drukowania.