Kotlin 下载并显示 PDF



嗨,我想使用 Kotlin 下载并显示 pdf。我想在下载时下载并显示带有pdf显示第一页的进度条。然后显示 PDF。我用 PDFKit 在 swift 中做到了,这非常简单,但我在 Kotlin 中找不到等效的。

我做了很多研究来在 Kotlin 中显示 pdf,但我没有得到太多结果,似乎这个主题并不是真的那么先我看了原生的 PdfRenderer,但大多数示例都是在 java 而不是 Kotlin 中,我不明白是什么:documented.getSeekableFileDescriptor((。

然后我看了pdfView库,它非常适合显示pdf,但只能从资产中显示,pdfView.fromStream似乎不起作用,我无法获得任何关于它如何工作的示例。此外,我想避免下载我想直接显示的pdf以避免长时间加载。

最后,我使用 okhttp 和改造来下载 pdf,但我无法使用 pdfView 来显示它,因为在 from 资产中,pdf 必须已经在项目中。

我发现从 和 url 下载 pdf 并使用 Kotlin 显示它非常困难,而且没有很好的文档记录。

因此,如果有人有任何建议,我会接受的。

这是我使用 pdfView.fromStream 的代码示例,这只加载一个 blanc 页面

private fun loadpdf(){
println("pdfview")
//PDF View
Thread(Runnable {
val input = URL(pdf_url).openStream()
val pdfView = this.findViewById<PDFView>(com.example.mylibrary.R.id.pdfView)
//pdfView.fromFile(file)
pdfView.fromStream(input)
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(true)
.enableDoubletap(true)
.defaultPage(0)
.enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
// spacing between pages in dp. To define spacing color, set view background
.spacing(0)
.pageFitPolicy(FitPolicy.WIDTH)
.load()
println("testpdf")
})
}

这是我使用 pdfView.fromAsset 的代码示例,这一个工作,但前提是文件已经在项目中,但我想从和 url 获取我的 pdf

private fun loadpdf(){
//PDF View
Thread(Runnable {
val pdfView = this.findViewById<PDFView>(com.example.mylibrary.R.id.pdfView)
pdfView.fromAsset("url")
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(true)
.enableDoubletap(true)
.defaultPage(0)
.enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
// spacing between pages in dp. To define spacing color, set view background
.spacing(0)
.pageFitPolicy(FitPolicy.WIDTH)
.load()
})
}

如果有人遇到这个问题,我通过使用协程解决了它:

将此依赖项添加到您的 gradle 构建中:

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2")

然后导入此行:

import kotlinx.coroutines.* 

在您的文件中。

然后使用启动协程方法,如下所示:

private fun loadpdf(pdfView: PDFView){
//PDF View
GlobalScope.launch{
val input : InputStream
input = URL(pdf_url).openStream()
pdfView.fromStream(input)
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(true)
.enableDoubletap(true)
.defaultPage(0)
.enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
// spacing between pages in dp. To define spacing color, set view background
.spacing(0)
.pageFitPolicy(FitPolicy.WIDTH)
.load()
}

你必须传递pdfView cos,你可以在asyctask中使用全局视图。

现在要添加进度条,您可以添加到xml中:

<ProgressBar
android:id="@+id/Progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:indeterminate="true"
android:minWidth="200dp"
android:minHeight="50dp" />

然后,您需要重写函数 loadComplete 以获取进度条的回调,并为活动实现 OnLoadCompleteListener 接口。

顺便说一句,如果您想使用 pdfView lib 显示每页页面,请添加:

.swipeHorizontal(true)
.pageSnap(true)
.autoSpacing(true)
.pageFling(true)

相关内容

  • 没有找到相关文章

最新更新