Печать HTML документа

Печать пользовательского контента, в отличие от простого фото, на Android требует компоновки текста и графики в виде документа печати. Платформа Android предоставляет возможность использовать HTML для создания документа с возможность печати его с минимальным количеством кода.

В Android 4.4 (API уровень 19), WebView класс был обновлен, и теперь позволяет печатать HTML контент. Класс позволяет загрузить локальный HTML ресурс или загрузить страницу из интернета, создать задание и передать его дальше в сервис печати Android.

Этот урок покажет вам, как быстро создать HTML документ, содержащий текст и графику, и используя WebView распечатать его.

Загрузка HTML документа

Печать HTML документа с помощью WebView включает в себя загрузку HTML ресурса или построение HTML документа в виде строки. В этом разделе описываются как построить HTML в виде строки и загрузить её в WebView для печати.

Этот объект представления обычно используется как часть макета деятельности. Тем не менее, если ваше приложение не использует WebView, можно создать экземпляр класса специально для печати. Основными шагами по созданию этого пользовательского представление для печати являются:

  1. Создайте WebViewClient , который запускает задание на печать после того, как HTML ресурс загрузится.
  2. Загрузите HTML ресурс в WebView объект.

В следующем примере кода показано, как создать простой WebViewClient и загрузить HTML документ, созданный на лету:

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;
}

Примечание: Убедитесь, что ваш вызов для генерации задания на печать происходит в onPageFinished() методе WebViewClient , который вы создали в предыдущем разделе. Если вы не дождетесь завершения загрузки страницы, при печати она может быть неполной или пустой, или может вообще завершиться ошибкой.

Примечание: Пример кода выше содержит экземпляр WebView объекта, поэтому он не будет собран сборщиком мусора до создания задание для печати. Убедитесь, что вы сделали то же самое в своей собственной реализации, в противном случае процесс печати может завершиться неудачей.

Если вы хотите добавить графику на страницу, поместите графические файлы в assets/ каталог вашего проекта и укажите базовый URL в первом параметре loadDataWithBaseURL() метода, как показано в следующем примере кода:

webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
        "text/HTML", "UTF-8", null);

Вы также можете загрузить веб-страницу для печати, заменив loadDataWithBaseURL() метод на loadUrl() как показано ниже.

// Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("http://developer.android.com/about/index.html");

При использовании WebView для создания документов для печати, вы должны быть осведомлены о следующих ограничениях:

  • Вы не можете добавить колонтитулы, включая номера страниц.
  • Параметры печати HTML документов не позволяют задать диапазон страниц печати, например: печать страниц с 2 по 4 из 10 страницы HTML документа не поддерживается.
  • Экземпляр WebView может обрабатывать только одно задание для печати за один промежуток времени.
  • HTML документ, содержащий CSS атрибуты для печати, такие как свойства ориентации страницы, не поддерживается.
  • Вы не можете использовать JavaScript в HTML документе для запуска печати.

Примечание: Содержимое WebView объекта, который является частью макета, также может быть напечатан, как только документ будет загружен.

Если вы хотите создать более специфический вывод на печать, и имеют полный контроль над содержимым печатной страницы, перейти к следующему уроку: Печать пользовательских документов урок.

После создания WebView и загрузки содержимого HTML, ваше приложение почти закончило со своей стороны всё необходимое для процесса печати. Следующие шаги это получение PrintManager, создание адаптера печати, и, наконец, создание задания печати. Следующий пример иллюстрирует, как выполнить эти действия:

private void createWebPrintJob(WebView webView) {

    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    // Get a print adapter instance
    PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();

    // Create a print job with name and adapter instance
    String jobName = getString(R.string.app_name) + " Document";
    PrintJob printJob = printManager.print(jobName, printAdapter,
            new PrintAttributes.Builder().build());

    // Save the job object for later status checking
    mPrintJobs.add(printJob);
}

Этот пример сохраняет экземпляр PrintJob объекта для использования приложением, который в принципе не требуется. Приложение может использовать этот объект для отслеживания хода выполнения задания печати, того как оно обрабатывается. Этот подход полезен, когда вы хотите контролировать состояние задания печати в вашем приложении на завершение, ошибки или отмену пользователем. Создание уведомления в вашем приложении не требуется, потому что платформа автоматически создает системные уведомления печати.