Hallo teman-teman, hari ini kita akan memilih library yang cocok untuk melakukan preview PDF dengan kotlin atau java di Android. Jadi ini adalah post yang tepat untuk kamu yang menyiapkan feature preview pdf. Disini kita akan membedakan berdasarkan 3 cara :

PdfRendererWebViewcom.github.barteksc.pdfviewer.PDFView
table 3 cara preview pdf

FLOW WEBVIEW

Dengan cara webview, caranya sangat mudah. Kamu tidak perlu menyiapkan download image karena hanya load pdf dengan preview dari google, seperti ini :

wvPdf.settings.javaScriptEnabled = true
wvPdf.loadUrl("https://docs.google.com/gview?embedded=true&url=$pdfUrl")
wvPdf.webViewClient = object : WebViewClient() {
     override fun onPageFinished(view: WebView?, url: String?)               {
     super.onPageFinished(view, url)
         pbLoad.gone()
     }
}

FLOW PDFRenderer

Untuk satu ini caranya atau sistemnya adalah dengan mendownload pdf kemudian diconvert menjadi bitmap dan ditampilkan dengan imageview. Sehingga karena di show pada imageview maka untuk feature lainnya seperti zoom, page. Harus dibuat manual ya

private fun downloadAndDisplayPdf(pdfUrl: String) {
        GlobalScope.launch(Dispatchers.IO) {
            var urlConnection: HttpURLConnection? = null
            var fileOutputStream: FileOutputStream? = null
            var input: InputStream? = null
            try {
                val url = URL(pdfUrl)
                urlConnection = url.openConnection() as HttpURLConnection
                input = urlConnection.inputStream

                val outputFile = File(cacheDir, "temp_pdf.pdf")
                fileOutputStream = FileOutputStream(outputFile)
                val buffer = ByteArray(1024)
                var bytesRead: Int
                while (input.read(buffer).also { bytesRead = it } != -1) {
                    fileOutputStream.write(buffer, 0, bytesRead)
                }

                // Display the PDF using PdfRenderer
                displayPdf(outputFile)
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                urlConnection?.disconnect()
                input?.close()
                fileOutputStream?.close()
            }
        }
    }

private fun displayPdf(pdfFile: File) {
        val parcelFileDescriptor: ParcelFileDescriptor =
            ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)
        pdfRenderer = PdfRenderer(parcelFileDescriptor)
        totalPage = pdfRenderer?.pageCount ?: 0

        // Display the first page of the PDF
        displayPage(0)
}

private fun downloadAndDisplayPdf(pdfUrl: String) {
        GlobalScope.launch(Dispatchers.IO) {
            var urlConnection: HttpURLConnection? = null
            var fileOutputStream: FileOutputStream? = null
            var input: InputStream? = null
            try {
                val url = URL(pdfUrl)
                urlConnection = url.openConnection() as HttpURLConnection
                input = urlConnection.inputStream

                val outputFile = File(cacheDir, "temp_pdf.pdf")
                fileOutputStream = FileOutputStream(outputFile)
                val buffer = ByteArray(1024)
                var bytesRead: Int
                while (input.read(buffer).also { bytesRead = it } != -1) {
                    fileOutputStream.write(buffer, 0, bytesRead)
                }

                // Display the PDF using PdfRenderer
                displayPdf(outputFile)
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                urlConnection?.disconnect()
                input?.close()
                fileOutputStream?.close()
            }
        }
    }

private fun displayPdf(pdfFile: File) {
        val parcelFileDescriptor: ParcelFileDescriptor =
            ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)
        pdfRenderer = PdfRenderer(parcelFileDescriptor)
        totalPage = pdfRenderer?.pageCount ?: 0

        // Display the first page of the PDF
        displayPage(0)
    }

private fun displayPage(pageIndex: Int) {
        runOnUiThread {
            currentPage = pageIndex
            val page = pdfRenderer?.openPage(currentPage)
            val bitmap = Bitmap.createBitmap(page!!.width, page.height, Bitmap.Config.ARGB_8888)
            page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)

            //Tampikan PDF
            pdfImageView.setImageBitmap(bitmap)
            page.close()
        }
}

FLOW LIB PDFView

Untuk yang ini, sudah sempurna ya. Feature sudah ready semua namun mungkin kamu harus pikirkan karena penggunaan library akan menambah size dari apk kamu dan juga umur dari library ketika tidak ada update.

val inputStream = withContext(Dispatchers.IO) {
    BufferedInputStream(URL(pdfUrl).openStream())
}

pvViewer.fromStream(inputStream)
        .fitEachPage(true)
        .spacing(10)
        .onError {
           back()
        }
        .load()

Kesimpulannya, setiap cara punya kelebihan dan kekurangan masing-masing. Teman-teman tinggal sesuaikan kebutuhannya, berikut table yang bisa kamu pikirkan ya :

BartekscPDFReaderWebview
Size+
Load++
Feature++
table positive dan negative

Detailnya, Webview sudah sangat keren, namun punya kekurangan saat load karena lebih lambat beberapa detik daripada cara lain. Sedangkan PDFReader, untuk load sudah sangat aman. Namun kekuranganya ada di feature (dimana kamu harus handle sendiri feature yang kamu inginkan, seperti zoom dan page) selain itu, karena PDFReader ini harus mendownload file terlebih dahulu maka akan berefek kepada size penggunaan aplikasi terkait cache. Terakhir, Barteksc sudah sangat unggul karena kelemahaannya hanya disisi penambahan size apk pada aplikasi kamu saja.

Itu dia kesimpulan kami, Semoga bermanfaat.

Categorized in:

Tagged in:

, ,