HTML dokümanlarını yazdırma

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:

  1. HTML kaynağı yüklendikten sonra yazdırma işi başlatan bir WebViewClient oluşturun.
  2. 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.

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.