Android'de basit bir fotoğrafın ötesindeki içerikleri yazdırmak için basılı bir dokümanda metin ve grafik oluşturmanız gerekir. Android çerçevesi, bir belge oluşturmak ve minimum kodla yazdırmak için HTML'yi kullanmanın bir yolunu sunar.
Android 4.4'te (API düzeyi 19) WebView
sınıfı, HTML içeriğinin yazdırılmasını etkinleştirecek şekilde güncellenmiştir. Bu sınıf, yerel bir HTML kaynağını yüklemenize veya web'den bir sayfa indirmenize, yazdırma işi oluşturmanıza ve bunu Android'in yazdırma hizmetlerine vermenize olanak tanır.
Bu derste, metin ve grafik içeren bir HTML dokümanını hızlıca nasıl oluşturacağınızı ve yazdırmak için WebView
aracını nasıl kullanabileceğinizi öğrenebilirsiniz.
HTML dokümanı yükleme
WebView
ile HTML dokümanı yazdırmak, bir HTML kaynağı yüklemeyi veya dize olarak bir HTML belgesi oluşturmayı içerir. Bu bölümde, bir HTML dizesinin nasıl oluşturulacağı ve yazdırılmak üzere WebView
içine nasıl yükleneceği açıklanmaktadır.
Bu görünüm nesnesi genellikle bir etkinlik düzeninin parçası olarak kullanılır. Bununla birlikte, uygulamanız WebView
kullanmıyorsa özellikle yazdırma amacıyla sınıfın bir örneğini oluşturabilirsiniz. Bu özel yazdırma görünümünü oluşturmak için ana adımlar şunlardır:
- HTML kaynağı yüklendikten sonra yazdırma işi başlatan bir
WebViewClient
oluşturun. - HTML kaynağını
WebView
nesnesine yükleyin.
Aşağıdaki kod örneğinde, basit bir WebViewClient
dosyasının nasıl oluşturulacağı ve hızlı bir şekilde oluşturulan bir HTML dokümanının nasıl yükleneceği gösterilmektedir:
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; }
Not: Yazdırma işi oluşturma çağrınızın, bir önceki bölümde oluşturduğunuz WebViewClient
öğesindeki onPageFinished()
yönteminde yapıldığından emin olun. Sayfa yüklemenin tamamlanmasını beklemezseniz yazdırma çıktısı eksik veya boş ya da tamamen başarısız olabilir.
Not: Yukarıdaki örnek kod, WebView
nesnesinin bir örneğini tutar. Böylece, yazdırma işi oluşturulmadan önce çöp toplama işlemi yapılmaz. Aynı işlemi kendi uygulamanızda da yaptığınızdan emin olun. Aksi takdirde yazdırma işlemi başarısız olabilir.
Sayfaya grafik eklemek istiyorsanız grafik dosyalarını projenizin assets/
dizinine yerleştirin ve aşağıdaki kod örneğinde gösterildiği gibi loadDataWithBaseURL()
yönteminin ilk parametresinde temel bir URL belirtin:
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);
Ayrıca, yazdırma için bir web sayfasını aşağıda gösterildiği gibi loadDataWithBaseURL()
yöntemini loadUrl()
ile değiştirerek de yükleyebilirsiniz.
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");
Basılı dokümanlar oluşturmak için WebView
kullanırken aşağıdaki sınırlamaları göz önünde bulundurmanız gerekir:
- Dokümana sayfa numaraları da dahil olmak üzere üstbilgi veya altbilgi ekleyemezsiniz.
- HTML dokümanının yazdırma seçenekleri, sayfa aralıklarını yazdırma özelliğini içermez. Örneğin: 10 sayfalık bir HTML dokümanında 2 ila 4. sayfayı yazdırma desteklenmez.
WebView
örneği, aynı anda yalnızca bir yazdırma işini işleyebilir.- Yatay özellikler gibi CSS yazdırma özelliklerini içeren HTML dokümanları desteklenmez.
- Yazdırma işlemini tetiklemek için HTML dokümanında JavaScript kullanamazsınız.
Not: Bir düzene dahil edilen WebView
nesnesinin içeriği de doküman yüklendikten sonra yazdırılabilir.
Daha özelleştirilmiş bir yazdırma çıktısı oluşturmak ve yazdırılan sayfada oluşturulan içerik üzerinde tam denetime sahip olmak istiyorsanız bir sonraki derse atlayın: Özel bir dokümanı yazdırma.
Yazdırma işi oluşturun
WebView
oluşturup HTML içeriğinizi yükledikten sonra uygulamanız, yazdırma işleminin bir kısmını tamamlamak üzere hazır olur. Sonraki adımlar PrintManager
cihazına erişme, yazdırma adaptörü oluşturma ve son olarak yazdırma işi oluşturmadır. Aşağıdaki örnekte, bu adımların nasıl gerçekleştirileceği gösterilmektedir:
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); }
Bu örnekte, uygulama tarafından kullanılması için gerekli olmayan PrintJob
nesnesinin bir örneği kaydedilir. Uygulamanız, işlenmekte olan yazdırma işinin ilerleme durumunu izlemek için bu nesneyi kullanabilir. Bu yaklaşım, uygulamanızdaki yazdırma işinin durumunu tamamlanma, hata veya kullanıcı iptali açısından izlemek istediğinizde kullanışlıdır. Yazdırma çerçevesi, yazdırma işi için otomatik olarak bir sistem bildirimi oluşturduğundan uygulama içi bildirim oluşturmanız gerekmez.