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 :
PdfRenderer | WebView | com.github.barteksc.pdfviewer.PDFView |
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 :
Barteksc | PDFReader | Webview | |
Size | – | – | + |
Load | + | + | – |
Feature | + | – | + |
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.