Để 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à:
- Tạo
WebViewClient
sẽ bắt đầu lệnh in sau tài nguyên HTML sẽ được tải. - 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.
Tạo lệnh in
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.