首页 > 解决方案 > 如何显示带有注释且没有嵌入字体的 PDF?

问题描述

我想显示本地 PDF 文件(来自InputStream或本地File)。最低支持的 Android 版本并不那么重要。

主要假设:

我试过的:

1) AndroidPdfViewer (by barteksc)

网址

https://github.com/barteksc/AndroidPdfViewer

缺点:

优点:

Kotlin 代码示例:

pdf_view
    .fromStream(inputStream)
    .enableAnnotationRendering(true)
    .onLoad(::onLoadCompleted)
    .onPageChange(::onPageChanged)
    .onError(::onLoadError)
    .load()

2) WebView + Google Drive Viewer

网址

https://docs.google.com/gview?embedded=true&url=

缺点:

优点:

Kotlin 代码示例:

web_view.settings.run {
    javaScriptEnabled = true

    // For lowers than KITKAT
    pluginState = WebSettings.PluginState.ON
}

val pdfUrl = "http://your_url_to_pdf"

web_view.loadUrl("https://drive.google.com/viewerng/viewer?embedded=true&url=$pdfUrl")

3)WebView + pdf.js(由Mozilla)

网址

https://mozilla.github.io/pdf.js/

缺点:

优点:

Kotlin 代码示例:

val path: Uri = Uri.parse(Environment.getExternalStorageDirectory().toString() + "/test.pdf");

val pdfJs: String = "file:///android_asset/pdfviewer/index.html?file="

web_view.loadUrl(pdfJs + path);

4)安卓原生——PdfRenderer

网址

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer

缺点:

优点:

Kotlin 代码示例:

val file = File(application.cacheDir, FILENAME)

val descriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)

val pdfRenderer = PdfRenderer(descriptor)

val page = pdfRenderer.openPage(index)

val bitmap = Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888)

page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)

5) 在外部应用程序中打开 PDF

使用Intent(Intent.ACTION_VIEW)(with Urias application/pdf) 并开始startActivity()

缺点:

优点:

6) 商业 - PSPDFKit(由 PSPDFKit GmbH 提供)

缺点:

优点:

7) 商业 - MuPDF(由 Artifex 提供)

缺点:

优点:

非常古老的解决方案

例如vudroid,apdfviewer或来自https://code.google.com/archive/droidreader -多年以来未开发ebookdroid

标签: javaandroidkotlinpdf

解决方案


推荐阅读