Kotlin 下载并显示 PDF
Kotlin download and display a PDF
您好,我想使用 Kotlin 下载和显示 pdf。我想在 downloading.Then 显示 PDF 时下载并显示带有 pdf 显示第一页的进度条。我在 swift 中使用 PDFKit 完成了它,它非常简单,但我在 Kotlin 中找不到等效项。
我做了很多研究以在 Kotlin 中显示 pdf 但我没有得到太多结果,似乎这个主题并不是真的所以首先我查看了原生的 PdfRenderer 但大多数例子都在 java 而不是 Kotlin,我不明白什么是:documented.getSeekableFileDescriptor().
然后我查看了 pdfView 库,它非常适合显示 pdf,但仅来自资产,pdfView.fromStream 似乎不起作用,我找不到任何例子来说明它是如何 work.More 以上 我想避免下载pdf 我想直接显示它以避免长时间加载。
最后我使用 okhttp 和 retrofit 下载了 pdf,但是我不能使用 pdfView 来显示它,因为在 from asset 中,pdf 必须已经在项目中。
我发现从 url 下载 pdf 并用 Kotlin 显示它非常困难,而且没有很好的文档记录。
所以如果有人有什么建议,我会采纳。
这是我使用 pdfView.fromStream 的代码示例,这只会加载一个空白页面
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")
然后导入:在您的文件中导入 kotlinx.coroutines.*。
然后使用lauch协程方法如下:
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 因为你可以在 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 以获取对您的 progressera 的回调并为您的 activity.
实现 OnLoadCompleteListener 接口
顺便说一句,如果您想使用 pdfView 库添加每页显示一页:
.swipeHorizontal(真)
.pageSnap(真)
.autoSpacing(真)
.pageFling(真)
您好,我想使用 Kotlin 下载和显示 pdf。我想在 downloading.Then 显示 PDF 时下载并显示带有 pdf 显示第一页的进度条。我在 swift 中使用 PDFKit 完成了它,它非常简单,但我在 Kotlin 中找不到等效项。
我做了很多研究以在 Kotlin 中显示 pdf 但我没有得到太多结果,似乎这个主题并不是真的所以首先我查看了原生的 PdfRenderer 但大多数例子都在 java 而不是 Kotlin,我不明白什么是:documented.getSeekableFileDescriptor().
然后我查看了 pdfView 库,它非常适合显示 pdf,但仅来自资产,pdfView.fromStream 似乎不起作用,我找不到任何例子来说明它是如何 work.More 以上 我想避免下载pdf 我想直接显示它以避免长时间加载。
最后我使用 okhttp 和 retrofit 下载了 pdf,但是我不能使用 pdfView 来显示它,因为在 from asset 中,pdf 必须已经在项目中。
我发现从 url 下载 pdf 并用 Kotlin 显示它非常困难,而且没有很好的文档记录。
所以如果有人有什么建议,我会采纳。
这是我使用 pdfView.fromStream 的代码示例,这只会加载一个空白页面
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
获取我的 pdfprivate 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")
然后导入:在您的文件中导入 kotlinx.coroutines.*。
然后使用lauch协程方法如下:
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 因为你可以在 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 以获取对您的 progressera 的回调并为您的 activity.
实现 OnLoadCompleteListener 接口顺便说一句,如果您想使用 pdfView 库添加每页显示一页: .swipeHorizontal(真) .pageSnap(真) .autoSpacing(真) .pageFling(真)