چاپ اسناد HTML
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
چاپ محتوایی فراتر از یک عکس ساده در اندروید نیازمند نوشتن متن و گرافیک در یک سند چاپی است. چارچوب اندروید راهی برای استفاده از HTML برای نوشتن یک سند و چاپ آن با حداقل کد ارائه می دهد.
در Android 4.4 (سطح API 19)، کلاس WebView
برای فعال کردن چاپ محتوای HTML به روز شده است. این کلاس به شما امکان می دهد یک منبع HTML محلی را بارگیری کنید یا یک صفحه را از وب بارگیری کنید، یک کار چاپ ایجاد کنید و آن را به خدمات چاپ Android تحویل دهید.
این درس به شما نشان می دهد که چگونه به سرعت یک سند HTML حاوی متن و گرافیک بسازید و از WebView
برای چاپ آن استفاده کنید.
یک سند HTML را بارگیری کنید
چاپ یک سند HTML با WebView
شامل بارگیری یک منبع HTML یا ساخت یک سند HTML به عنوان یک رشته است. این بخش نحوه ساخت یک رشته HTML و بارگذاری آن در WebView
برای چاپ را توضیح می دهد.
این شی view معمولاً به عنوان بخشی از یک طرحبندی فعالیت استفاده میشود. با این حال، اگر برنامه شما از WebView
استفاده نمی کند، می توانید نمونه ای از کلاس را به طور خاص برای اهداف چاپ ایجاد کنید. مراحل اصلی برای ایجاد این نمای چاپ سفارشی عبارتند از:
- یک
WebViewClient
ایجاد کنید که پس از بارگیری منبع HTML کار چاپ را شروع می کند. - منبع HTML را در آبجکت
WebView
بارگیری کنید.
نمونه کد زیر نحوه ایجاد یک WebViewClient
ساده و بارگذاری یک سند HTML ایجاد شده در پرواز را نشان می دهد:
کاتلین
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
}
جاوا
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
)
جاوا
webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
"text/HTML", "UTF-8", null);
همچنین میتوانید با جایگزین کردن متد loadDataWithBaseURL()
با loadUrl()
یک صفحه وب را برای چاپ بارگذاری کنید.
کاتلین
webView.loadUrl("https://developer.android.com/about/index.html")
جاوا
// Print an existing web page (remember to request INTERNET permission!):
webView.loadUrl("https://developer.android.com/about/index.html");
هنگام استفاده از WebView
برای ایجاد اسناد چاپی، باید از محدودیت های زیر آگاه باشید:
- شما نمی توانید سرصفحه یا پاورقی، از جمله شماره صفحه را به سند اضافه کنید.
- گزینه های چاپ برای سند HTML شامل قابلیت چاپ محدوده صفحات نمی شود، به عنوان مثال: چاپ صفحه 2 تا 4 از یک سند HTML 10 صفحه ای پشتیبانی نمی شود.
- یک نمونه از
WebView
فقط می تواند یک کار چاپ را در یک زمان پردازش کند. - یک سند HTML حاوی ویژگی های چاپ CSS، مانند ویژگی های چشم انداز، پشتیبانی نمی شود.
- شما نمی توانید از جاوا اسکریپت در یک سند HTML برای شروع چاپ استفاده کنید.
توجه: محتوای یک شی WebView
که در یک طرح بندی گنجانده شده است نیز می تواند پس از بارگیری یک سند چاپ شود.
اگر میخواهید خروجی چاپ سفارشیتری ایجاد کنید و کنترل کاملی بر ترسیم محتوا در صفحه چاپ شده داشته باشید، به درس بعدی بروید: چاپ درس سند سفارشی .
یک کار چاپ ایجاد کنید
پس از ایجاد یک WebView
و بارگیری محتوای HTML، برنامه شما تقریباً با بخشی از فرآیند چاپ به پایان رسیده است. مراحل بعدی دسترسی به PrintManager
، ایجاد یک آداپتور چاپ و در نهایت ایجاد یک کار چاپی است. مثال زیر نحوه انجام این مراحل را نشان می دهد:
کاتلین
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
}
}
}
جاوا
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);
}
این مثال نمونه ای از شی PrintJob
را برای استفاده توسط برنامه ذخیره می کند که نیازی به آن نیست. برنامه شما ممکن است از این شیء برای ردیابی پیشرفت کار چاپ در حین پردازش استفاده کند. این رویکرد زمانی مفید است که میخواهید وضعیت کار چاپ را در برنامه خود برای تکمیل، شکست یا لغو کاربر نظارت کنید. ایجاد یک اعلان درون برنامه ای لازم نیست، زیرا چارچوب چاپ به طور خودکار یک اعلان سیستم برای کار چاپ ایجاد می کند.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Printing HTML documents\n\nPrinting out content beyond a simple photo on Android requires composing text and graphics in a\nprint document. The Android framework provides a way to use HTML to compose a document and\nprint it with a minimum of code.\n\nIn Android 4.4 (API level 19), the [WebView](/reference/android/webkit/WebView) class has been updated to\nenable printing HTML content. The class allows you to load a local HTML resource or download\na page from the web, create a print job and hand it off to Android's print services.\n\nThis lesson shows you how to quickly build an HTML document containing text and graphics and\nuse [WebView](/reference/android/webkit/WebView) to print it.\n\nLoad an HTML document\n---------------------\n\nPrinting an HTML document with [WebView](/reference/android/webkit/WebView) involves loading an HTML\nresource or building an HTML document as a string. This section describes how to build an HTML\nstring and load it into a [WebView](/reference/android/webkit/WebView) for printing.\n\nThis view object is typically used as part of an activity layout. However, if your application\nis not using a [WebView](/reference/android/webkit/WebView), you can create an instance of the class\nspecifically for printing purposes. The main steps for creating this custom print view are:\n\n1. Create a [WebViewClient](/reference/android/webkit/WebViewClient) that starts a print job after the HTML resource is loaded.\n2. Load the HTML resource into the [WebView](/reference/android/webkit/WebView) object.\n\nThe following code sample demonstrates how to create a simple [WebViewClient](/reference/android/webkit/WebViewClient) and load an HTML document created on the fly: \n\n### Kotlin\n\n```kotlin\nprivate var mWebView: WebView? = null\n\nprivate fun doWebViewPrint() {\n // Create a WebView object specifically for printing\n val webView = WebView(activity)\n webView.webViewClient = object : WebViewClient() {\n\n override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false\n\n override fun onPageFinished(view: WebView, url: String) {\n Log.i(TAG, \"page finished loading $url\")\n createWebPrintJob(view)\n mWebView = null\n }\n }\n\n // Generate an HTML document on the fly:\n val htmlDocument =\n \"\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eTest Content\u003c/h1\u003e\u003cp\u003eTesting, testing, testing...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e\"\n webView.loadDataWithBaseURL(null, htmlDocument, \"text/HTML\", \"UTF-8\", null)\n\n // Keep a reference to WebView object until you pass the PrintDocumentAdapter\n // to the PrintManager\n mWebView = webView\n}\n```\n\n### Java\n\n```java\nprivate WebView mWebView;\n\nprivate void doWebViewPrint() {\n // Create a WebView object specifically for printing\n WebView webView = new WebView(getActivity());\n webView.setWebViewClient(new WebViewClient() {\n\n public boolean shouldOverrideUrlLoading(WebView view, String url) {\n return false;\n }\n\n @Override\n public void onPageFinished(WebView view, String url) {\n Log.i(TAG, \"page finished loading \" + url);\n createWebPrintJob(view);\n mWebView = null;\n }\n });\n\n // Generate an HTML document on the fly:\n String htmlDocument = \"\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eTest Content\u003c/h1\u003e\u003cp\u003eTesting, \" +\n \"testing, testing...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e\";\n webView.loadDataWithBaseURL(null, htmlDocument, \"text/HTML\", \"UTF-8\", null);\n\n // Keep a reference to WebView object until you pass the PrintDocumentAdapter\n // to the PrintManager\n mWebView = webView;\n}\n```\n\n\n**Note:** Make sure your call for generating a print job happens in the [onPageFinished()](/reference/android/webkit/WebViewClient#onPageFinished(android.webkit.WebView, java.lang.String)) method of the [WebViewClient](/reference/android/webkit/WebViewClient) you created in the previous section. If you don't wait until page\nloading is finished, the print output may be incomplete or blank, or may fail completely.\n\n\n**Note:** The example code above holds an instance of the\n[WebView](/reference/android/webkit/WebView) object so that is it not garbage collected before the print job\nis created. Make sure you do the same in your own implementation, otherwise the print process\nmay fail.\n\n\nIf you want to include graphics in the page, place the graphic files in the `assets/`\ndirectory of your project and specify a base URL in the first parameter of the\n[loadDataWithBaseURL()](/reference/android/webkit/WebView#loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)) method, as shown in the\nfollowing code example: \n\n### Kotlin\n\n```kotlin\nwebView.loadDataWithBaseURL(\n \"file:///android_asset/images/\",\n htmlBody,\n \"text/HTML\",\n \"UTF-8\",\n null\n)\n```\n\n### Java\n\n```java\nwebView.loadDataWithBaseURL(\"file:///android_asset/images/\", htmlBody,\n \"text/HTML\", \"UTF-8\", null);\n```\n\nYou can also load a web page for printing by replacing the\n[loadDataWithBaseURL()](/reference/android/webkit/WebView#loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)) method with\n[loadUrl()](/reference/android/webkit/WebView#loadUrl(java.lang.String)) as shown below. \n\n### Kotlin\n\n```kotlin\nwebView.loadUrl(\"https://developer.android.com/about/index.html\")\n```\n\n### Java\n\n```java\n// Print an existing web page (remember to request INTERNET permission!):\nwebView.loadUrl(\"https://developer.android.com/about/index.html\");\n```\n\nWhen using [WebView](/reference/android/webkit/WebView) for creating print documents, you should be aware of\nthe following limitations:\n\n- You cannot add headers or footers, including page numbers, to the document.\n- The printing options for the HTML document do not include the ability to print page ranges, for example: Printing page 2 to 4 of a 10 page HTML document is not supported.\n- An instance of [WebView](/reference/android/webkit/WebView) can only process one print job at a time.\n- An HTML document containing CSS print attributes, such as landscape properties, is not supported.\n- You cannot use JavaScript in a HTML document to trigger printing.\n\n\n**Note:** The content of a [WebView](/reference/android/webkit/WebView) object that is included in\na layout can also be printed once it has loaded a document.\n\nIf you want to create a more customized print output and have complete control of the content\ndraw on the printed page, jump to the next lesson:\n[Printing a custom document](/training/printing/custom-docs) lesson.\n\nCreate a print job\n------------------\n\nAfter creating a [WebView](/reference/android/webkit/WebView) and loading your HTML content, your\napplication is almost done with its part of the printing process. The next steps are accessing\nthe [PrintManager](/reference/android/print/PrintManager), creating a print adapter, and finally, creating a print\njob. The following example illustrates how to perform these steps: \n\n### Kotlin\n\n```kotlin\nprivate fun createWebPrintJob(webView: WebView) {\n\n // Get a PrintManager instance\n (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager -\u003e\n\n val jobName = \"${getString(R.string.app_name)} Document\"\n\n // Get a print adapter instance\n val printAdapter = webView.createPrintDocumentAdapter(jobName)\n\n // Create a print job with name and adapter instance\n printManager.print(\n jobName,\n printAdapter,\n PrintAttributes.Builder().build()\n ).also { printJob -\u003e\n\n // Save the job object for later status checking\n printJobs += printJob\n }\n }\n}\n```\n\n### Java\n\n```java\nprivate void createWebPrintJob(WebView webView) {\n\n // Get a PrintManager instance\n PrintManager printManager = (PrintManager) getActivity()\n .getSystemService(Context.PRINT_SERVICE);\n\n String jobName = getString(R.string.app_name) + \" Document\";\n\n // Get a print adapter instance\n PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(jobName);\n\n // Create a print job with name and adapter instance\n PrintJob printJob = printManager.print(jobName, printAdapter,\n new PrintAttributes.Builder().build());\n\n // Save the job object for later status checking\n printJobs.add(printJob);\n}\n```\n\nThis example saves an instance of the [PrintJob](/reference/android/print/PrintJob) object for use by the\napplication, which is not required. Your application may use this object to track the progress of\nthe print job as it's being processed. This approach is useful when you want to monitor the status\nof the print job in you application for completion, failure, or user cancellation. Creating an\nin-app notification is not required, because the print framework automatically creates a system\nnotification for the print job."]]