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ć.
Wczytywanie 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. Główne etapy tworzenia tego niestandardowego widoku wydruku:
- Utwórz element
WebViewClient
, który rozpoczyna zadanie drukowania po gdy zostanie załadowany zasób 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. Upewnij się, że robisz to samo we własnej implementacji. W przeciwnym razie proces drukowania
może zakończyć się niepowodzeniem.
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 drukowanych w usłudze WebView
pamiętaj o tych kwestiach:
następujące ograniczenia:
- 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 wydrukowania strony zakresy np.: drukowanie stron 2-4 10-stronicowego dokumentu HTML nie jest obsługiwane.
- Instancja
WebView
może przetworzyć tylko jedno zadanie drukowania naraz. - Dokument HTML zawierający atrybuty drukowania CSS, takie jak właściwości orientacji poziomej, nie jest obsługiwane.
- 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. Poniższy przykład pokazuje, jak to zrobić:
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. Ta metoda jest przydatna, gdy chcesz monitorować stan
do ukończenia, niepowodzeń lub anulowania przez użytkownika. Tworzenie
powiadomienia w aplikacji nie są wymagane, bo platforma drukowania automatycznie tworzy
powiadomienia o zadaniu drukowania.