כדי להדפיס תוכן מעבר לתמונה פשוטה ב-Android, צריך לכתוב טקסט וגרפיקה להדפיס את המסמך. ה-framework של Android מספק דרך להשתמש ב-HTML כדי לכתוב מסמך להדפיס אותה עם מינימום של קוד.
ב-Android 4.4 (רמת API 19), המחלקה WebView
עודכנה ל
לאפשר הדפסת תוכן HTML. הכיתה מאפשרת לטעון משאב HTML מקומי או להוריד דף מהאינטרנט, ליצור משימת הדפסה ולהעביר אותה לשירותי ההדפסה של Android.
בשיעור הזה תלמדו איך לבנות במהירות מסמך HTML שמכיל טקסט וגרפיקה
אפשר להשתמש ב-WebView
כדי להדפיס אותו.
טעינת מסמך HTML
כדי להדפיס מסמך HTML באמצעות WebView
צריך לטעון HTML
או בניית מסמך HTML כמחרוזת. בקטע הזה נסביר איך ליצור קוד HTML
וטוענים אותו לתוך WebView
להדפסה.
אובייקט התצוגה הזה משמש בדרך כלל כחלק מפריסת פעילות. אבל אם הבקשה שלכם
לא משתמש ב-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;
}
הערה: חשוב לוודא שהקריאה ליצירת משימת הדפסה מתבצעת ב-method 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, כמו מאפיינים לרוחב, לא נתמך.
- לא ניתן להשתמש ב-JavaScript במסמך 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
לשימוש באפליקציה, אבל זה לא נדרש. האפליקציה שלך עשויה להשתמש באובייקט הזה כדי לעקוב אחר ההתקדמות של
את משימת ההדפסה בזמן שהיא מעובדת. הגישה הזו שימושית אם רוצים לעקוב אחרי הסטטוס
של משימת ההדפסה באפליקציה להשלמת משימת ההדפסה, לכשל או לביטול על ידי המשתמש. יצירת
לא נדרשת הודעה בתוך האפליקציה, כי מסגרת ההדפסה יוצרת מערכת באופן אוטומטי
עבור משימת ההדפסה.