Android webview kontrolüne load edilen html verilerini, android kitkat versiyon üstü cihazlarda geçerli olmak üzere yazdırma işlemini gerçekleştirebilirsiniz.
Activity oluşturma metodu içersine webView kontrol tanımlaması yapılarak setWebViewClient eventi ile yükleme işlemi tamamlanması ile aktif olan onPageFinished metodu içerisine, webview’e yüklenen verileri yazdırma işlemini gerçekleştirecek olan Printer() metodu çağırılarak yazdırma işlemine geçiş sağlanmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_print); webView = findViewById(R.id.webView); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return super.shouldOverrideUrlLoading(view, request); } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Toast.makeText(getApplicationContext(), "Tamamlandı", Toast.LENGTH_LONG).show(); Printer(); } }); new Load().execute((Void) null); } |
UI arayüz yavaşlama vb. kullanıcı deneyimini etkileyen sorunların oluşmaması, işlemlerin arka planda gerçekleştirilmesi için AsyncTask yapısı kullanılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Load extends AsyncTask<Void, Void, String> { String content = null; @Override protected String doInBackground(Void... arg0) { try { content = db.Texts("select id,title,context from Tablo"); } catch (Exception e) { } return content; } @Override protected void onPostExecute(final String arg) { super.onPostExecute(arg); webView.loadData(arg, "text/HTML", "UTF-8"); } } |
doInBackground metodu içerisinde yapılacak işlemler tanımlandıktan sonra elde edilen veri geri döndürülerek. onPostExecute metoduna argüman olarak aktarılmıştır, bu metot yapısın da işlemlerin bitmesi durumunda gerçekleştirilmesi istenen olaylar tanımlanmaktadır.
UTF-8 ile karakter sorunları düzeltilmiştir. webView kontrol nesnesine arg isimli argüman olarak döndürülen içerik verisi load edilerek onCreate içerisinde tanımladığımız istemci eventi tetiklenerek yükleme işleminin bitmesi beklenmektedir.
1 | webView.loadData(arg, "text/HTML", "UTF-8") |
İşlemlerin bitmesi ile Printer() metodu tetiklenerek, webView sayfasını yazdırmak için, yazıcı servisi çağrılarak ön izleme işlemi başlatılmıştır.
1 2 3 4 5 6 | @RequiresApi(api = Build.VERSION_CODES.KITKAT) private void Printer() { PrintManager printManager = (PrintManager) this.getSystemService(Context.PRINT_SERVICE); PrintDocumentAdapter printDocumentAdapter = webView.createPrintDocumentAdapter(); printManager.print("print_", printDocumentAdapter, new PrintAttributes.Builder().build()); } |
İlgili webView’e yüklenen sayfayı yazdırma işlemini activity oluşturulma esnasında onCreate() metodu ile başlatılmıştı. Bu başlatılma işleminden sonra yazıcı servisi iptal edilmesi veya kapatılması durumunda yazıcı servisini tekrar başlatmak için aşağıdaki kodu kullanabilirsiniz.
1 2 3 4 5 | public void Button_Print_Run(View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Printer(); } } |
İpucu: Uygulamalarınızda basit olarak pdf çıktısı almak istediğinizde, webView kontrolünün visibility özelliği ile kontrolü gizleyerek işlemlerin bitmesi ile kullanıcıya yazıcı servisini görüntüleyebilirsiniz.
Çıktı