طباعة مستندات HTML
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتطلب طباعة محتوى خارج نطاق صورة بسيطة على Android إنشاء نص ورسومات في
وطباعة مستند. يوفر إطار عمل Android طريقة لاستخدام HTML لإنشاء مستند
اطبعه بحد أدنى من التعليمات البرمجية.
وفي الإصدار Android 4.4 (المستوى 19 من واجهة برمجة التطبيقات)، تم تحديث الفئة WebView
إلى
تمكين طباعة محتوى HTML. تتيح لك الفئة تحميل مورد HTML محلي أو تنزيله
صفحة من الويب وإنشاء مهمة طباعة وتسليمها إلى خدمات الطباعة في Android.
يوضح هذا الدرس كيفية إنشاء مستند HTML بسرعة يحتوي على نصوص ورسومات
يمكنك استخدام "WebView
" لطباعته.
تحميل مستند HTML
تتضمّن طباعة مستند HTML باستخدام WebView
تحميل ملف HTML.
أو إنشاء مستند HTML كسلسلة. يصف هذا القسم كيفية إنشاء ترميز HTML
سلسلة وتحميله في WebView
للطباعة.
ويُستخدم عنصر طريقة العرض هذا عادةً كجزء من تخطيط النشاط. ومع ذلك، إذا كان طلبك
لا تستخدم WebView
، يمكنك إنشاء مثيل للفئة
خصيصًا لأغراض الطباعة. الخطوات الأساسية لإنشاء عرض الطباعة المخصص هذا هي:
- إنشاء
WebViewClient
تبدأ مهمة طباعة بعد
تحميل مورد HTML.
- تحميل مورد HTML إلى الكائن
WebView
.
يوضح نموذج الرمز البرمجي التالي كيفية إنشاء رمز WebViewClient
بسيط وتحميل مستند HTML تم إنشاؤه بشكل فوري:
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;
}
ملاحظة: تأكَّد من أنّ الطلب لإنشاء مهمة طباعة يتم تنفيذه في طريقة onPageFinished()
من WebViewClient
التي أنشأتها في القسم السابق. إذا لم تنتظر حتى صفحة
اكتمل التحميل، أو قد يكون ناتج الطباعة غير مكتمل أو فارغًا، أو قد يتعذّر تمامًا.
ملاحظة: يشتمل المثال أعلاه على مثيل
كائن WebView
بحيث لا يتم جمع البيانات غير الضرورية قبل مهمة الطباعة
يتم إنشاؤه. تأكد من تنفيذ الشيء ذاته في التنفيذ الخاص بك، وإلا في عملية الطباعة
وقد تفشل.
إذا كنت تريد تضمين الرسومات في الصفحة، ضع ملفات الرسومات في assets/
.
مشروعك وتحديد عنوان URL أساسي في المعلمة الأولى من
loadDataWithBaseURL()
، كما هو موضح في
مثال الرمز التالي:
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);
يمكنك أيضًا تحميل صفحة ويب للطباعة من خلال استبدال
طريقة واحدة (loadDataWithBaseURL()
) مع
loadUrl()
كما هو موضح أدناه.
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");
عند استخدام WebView
لإنشاء مستندات مطبوعة، يجب أن تكون على دراية
القيود التالية:
- لا يمكنك إضافة رؤوس أو تذييلات، بما في ذلك أرقام الصفحات، إلى المستند.
- لا تتضمن خيارات الطباعة لمستند HTML إمكانية طباعة الصفحة
النطاقات، على سبيل المثال: طباعة الصفحة من 2 إلى 4 من مستند HTML مكون من 10 صفحات غير متاحة.
- يمكن لمثال
WebView
معالجة مهمة طباعة واحدة فقط في كل مرة.
- لا يُسمح باستخدام مستند HTML يحتوي على سمات طباعة CSS، مثل الخصائص الأفقية.
- لا يمكنك استخدام JavaScript في مستند HTML لتشغيل الطباعة.
ملاحظة: محتوى كائن WebView
المضمّن في
يمكن أيضًا طباعة تخطيط بمجرد تحميله للمستند.
إذا كنت تريد إنشاء إخراج طباعة أكثر تخصيصًا والتحكّم بشكل كامل في المحتوى
للرسم على الصفحة المطبوعة، انتقل إلى الدرس التالي:
درس طباعة مستند مخصّص
إنشاء مهمة طباعة
بعد إنشاء WebView
وتحميل محتوى HTML، لا
التطبيق على الانتهاء من الجزء الخاص به من عملية الطباعة. تتمثل الخطوات التالية في الوصول إلى
PrintManager
، وإنشاء محوّل طباعة وأخيرًا إنشاء صورة
وظيفة. يوضح المثال التالي كيفية تنفيذ هذه الخطوات:
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);
}
يحفظ هذا المثال مثالاً على الكائن PrintJob
لاستخدامه من خلال
تطبيقه، وهو أمر غير مطلوب. قد يستخدم التطبيق هذا الكائن لتتبع تقدم
مهمة الطباعة أثناء معالجتها. ويكون هذا الأسلوب مفيدًا عندما تريد مراقبة حالة
لمهمة الطباعة في طلبك لإكمالها أو عند حدوث إخفاق أو إلغاء من جانب المستخدم. إنشاء
لا يكون الإشعار داخل التطبيق مطلوبًا، لأنّ إطار عمل الطباعة ينشئ تلقائيًا نظامًا
لمهمة الطباعة.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]