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ć.

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:

  1. Utwórz element WebViewClient, który rozpoczyna zadanie drukowania po gdy zostanie załadowany zasób 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. 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.

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.