HTML dokümanlarını yazdırma

Android'de basit bir fotoğrafın ötesindeki içerikleri bastırmak için metin ve grafiklerin dokümanı yazdır. Android çerçevesi, doküman oluşturmak için HTML'nin kullanılmasını sağlar ve minimum miktarda kodla yazdırabilirsiniz.

Android 4.4 (API düzeyi 19) sürümünde WebView sınıfı HTML içeriğinin yazdırılmasını etkinleştirin. Sınıf, yerel HTML kaynağı yüklemenize veya bir yazdırma işi oluşturup Android'in yazdırma hizmetlerine teslim edebilirsiniz.

Bu derste, metin ve grafik içeren bir HTML dokümanını hızlı bir şekilde nasıl yazdırmak için WebView düğmesini kullanın.

HTML belgesi yükleme

Bir HTML dokümanını WebView ile yazdırmak için HTML yüklenmesi gerekir bir HTML belgesinin nasıl oluşturulduğunu göstereceğim. Bu bölümde, bir HTML'nin nasıl oluşturulacağı açıklanmaktadır. dizesine yükleyin ve bunu, yazdırma için bir WebView içine yükleyin.

Bu görüntüleme nesnesi genellikle bir etkinlik düzeninin parçası olarak kullanılır. Ancak, uygulamanız WebView kullanmıyorsa sınıfın bir örneğini oluşturabilirsiniz için tasarladık. Bu özel yazdırma görünümünün temel adımları şunlardır:

  1. Yazdırma işi şundan sonra başlatan bir WebViewClient oluştur: HTML kaynağı yüklenir.
  2. HTML kaynağını WebView nesnesine yükleyin.

Aşağıdaki kod örneğinde, basit bir WebViewClient işleminin nasıl oluşturulacağı ve anında 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, önceki bölümde oluşturduğunuz WebViewClient öğesinin onPageFinished() yönteminde gerçekleştiğinden emin olun. Herhangi bir değişiklik olmadan Yükleme işlemi bittiğinde, yazdırma çıktısı eksik veya boş olabilir ya da tamamen başarısız olabilir.

Not: Yukarıdaki örnek kodda, yazdırma işi oluşturulmadan önce çöp toplanmamasını sağlamak için WebView nesnesinin bir örneği tutulur. Kendi uygulamanızda da aynısını yaptığınızdan emin olun. Aksi takdirde yazdırma işlemi başarısız olabilir.

Sayfaya grafik eklemek istiyorsanız grafik dosyalarını assets/ içine yerleştirin bir temel URL belirtin ve projenizin ilk parametresinde bir temel URL belirtin, loadDataWithBaseURL() yöntemini kullanarak aşağıdaki kod örneği:

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ı, loadDataWithBaseURL() yöntemi loadUrl() olarak gösterilir.

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üman oluşturmak için WebView kullanırken şunları göz önünde bulundurmalısınız: aşağıdaki sınırlamalara tabidir:

  • Dokümana, sayfa numaraları da dahil olmak üzere üstbilgi veya altbilgi ekleyemezsiniz.
  • HTML dokümanına ilişkin yazdırma seçenekleri, sayfayı yazdırma özelliğini içermiyor aralıkları, örneğin: 10 sayfalık bir HTML dokümanının 2-4. sayfasının yazdırılması desteklenmez.
  • WebView örneği, aynı anda yalnızca bir yazdırma işi işleyebilir.
  • Yatay özellikler gibi CSS yazdırma özellikleri içeren bir HTML dokümanı desteklenir.
  • Yazdırmayı tetiklemek için bir HTML dokümanında JavaScript kullanamazsınız.

Not: Dahil edilen bir WebView nesnesinin içeriği Düzen, bir doküman yüklendikten sonra da yazdırılabilir.

Daha özelleştirilmiş bir yazdırma çıktısı oluşturmak ve içerik üzerinde tam denetime sahip olmak isterseniz yazdırılan sayfaya çizim yapmak için, sonraki derse geçin: Özel doküman yazdırma dersi.

Bir WebView oluşturduktan ve HTML içeriğinizi yükledikten sonra, uygulamasının yazdırma işleminin bir parçası olarak neredeyse tamamlandı. Sonraki adımlar PrintManager, bir baskı adaptörü oluşturma ve son olarak da iş ilanlarına yazar. Aşağıdaki örnekte bu adımların nasıl uygulanacağı 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 örnek,PrintJob veya zorunlu olmayan işlemlerdir. Uygulamanız, devam ettirilir. Bu yaklaşım, bir riskin durumunu izlemek istediğinizde tamamlanması, hata veya kullanıcı iptali için başvurunuzdaki yazdırma işinin durumunu kontrol edebilmelisiniz. Oluşturuluyor Yazdırma çerçevesi otomatik olarak bir sistem oluşturduğundan uygulama içi bildirim gerekli değil bildirimi görürsünüz.