Drukowanie dokumentów HTML

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:

  1. Utwórz WebViewClient, który uruchamia zadanie drukowania po załadowaniu zasobu HTML.
  2. 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.

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.