In tài liệu HTML

Để in nội dung ngoài một bức ảnh đơn giản trên Android, bạn phải soạn văn bản và đồ hoạ trong in tài liệu. Khung Android cung cấp cách sử dụng HTML để soạn tài liệu và in trang tổng quan với ít nhất một mã.

Trong Android 4.4 (API cấp 19), lớp WebView đã được cập nhật lên cho phép in nội dung HTML. Lớp này cho phép bạn tải tài nguyên HTML cục bộ hoặc tải trang xuống từ web, tạo một công việc in và chuyển công việc đó đến các dịch vụ in của Android.

Bài học này sẽ hướng dẫn bạn cách tạo nhanh một tài liệu HTML chứa văn bản, hình ảnh và hãy sử dụng WebView để in.

Tải một tài liệu HTML

Để in tài liệu HTML bằng WebView, bạn cần tải tài nguyên HTML hoặc tạo tài liệu HTML dưới dạng chuỗi. Phần này mô tả cách tạo HTML và tải chuỗi đó vào WebView để in.

Đối tượng thành phần hiển thị này thường được dùng trong bố cục hoạt động. Tuy nhiên, nếu ứng dụng của bạn không sử dụng WebView, bạn có thể tạo một thực thể của lớp cho mục đích in ấn. Các bước chính để tạo chế độ xem bản in tuỳ chỉnh này là:

  1. Tạo WebViewClient sẽ bắt đầu lệnh in sau tài nguyên HTML sẽ được tải.
  2. Tải tài nguyên HTML vào đối tượng WebView.

Mã mẫu sau đây minh hoạ cách tạo một WebViewClient đơn giản và tải nhanh một tài liệu HTML được tạo:

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

Lưu ý: Hãy đảm bảo rằng lệnh gọi để tạo lệnh in diễn ra trong phương thức onPageFinished() của WebViewClient mà bạn đã tạo ở phần trước. Nếu bạn không đợi cho đến khi trang tải xong, kết quả in có thể chưa hoàn chỉnh hoặc trống hoặc có thể không in được.

Lưu ý: Mã ví dụ ở trên chứa một thực thể của WebView để đối tượng này không được thu thập rác trước lệnh in sẽ được tạo. Hãy nhớ làm tương tự trong quá trình triển khai của riêng bạn, nếu không thì quy trình in có thể không thành công.

Nếu bạn muốn đưa hình ảnh đồ hoạ vào trang, hãy đặt tệp đồ hoạ vào assets/ của dự án và chỉ định URL cơ sở trong tham số đầu tiên của loadDataWithBaseURL(), như minh hoạ trong ví dụ về mã sau:

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

Bạn cũng có thể tải trang web để in bằng cách thay thế Phương thức loadDataWithBaseURL() với loadUrl() như được hiển thị dưới đây.

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");

Khi sử dụng WebView để tạo tài liệu in, bạn cần lưu ý các hạn chế sau:

  • Bạn không thể thêm đầu trang hoặc chân trang, bao gồm cả số trang, vào tài liệu.
  • Tuỳ chọn in cho tài liệu HTML không bao gồm khả năng in trang các phạm vi, ví dụ: Không hỗ trợ in trang 2 đến trang 4 của tài liệu HTML gồm 10 trang.
  • Một thực thể của WebView chỉ có thể xử lý một lệnh in tại mỗi thời điểm.
  • Tài liệu HTML có chứa các thuộc tính in của CSS, chẳng hạn như thuộc tính ngang, được hỗ trợ.
  • Bạn không thể sử dụng JavaScript trong tài liệu HTML để kích hoạt tính năng in.

Lưu ý: Nội dung của đối tượng WebView có trong bố cục cũng có thể được in sau khi tải xong tài liệu.

Nếu bạn muốn tạo bản in tuỳ chỉnh hơn và có toàn quyền kiểm soát nội dung vẽ trên trang in đó, hãy chuyển sang bài học tiếp theo: Bài học về In một tài liệu tuỳ chỉnh.

Sau khi tạo một WebView và tải nội dung HTML, ứng dụng gần như được hoàn tất với một phần trong quá trình in. Các bước tiếp theo sẽ truy cập PrintManager, tạo bộ chuyển đổi in và cuối cùng là tạo bản in công việc. Ví dụ sau minh hoạ cách thực hiện các bước này:

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

Ví dụ này lưu một thực thể của đối tượng PrintJob để đối tượng sử dụng và không bắt buộc. Ứng dụng của bạn có thể sử dụng đối tượng này để theo dõi tiến trình lệnh in khi nó đang được xử lý. Phương pháp này rất hữu ích khi bạn muốn theo dõi trạng thái của lệnh in trong đơn đăng ký của bạn về việc hoàn tất, không thực hiện được hoặc do người dùng huỷ. Bạn không cần tạo thông báo trong ứng dụng vì khung in sẽ tự động tạo thông báo hệ thống cho công việc in.