Kotlin скачать и отобразить PDF - PullRequest
0 голосов
/ 04 октября 2019

Привет, я хотел бы скачать и отобразить PDF с помощью Kotlin. Я хочу загрузить и отобразить индикатор выполнения с первой страницей отображения PDF во время загрузки. Затем отобразите PDF. Я сделал это быстро с PDFKit, это было очень просто, но я не могу найти эквивалент в Kotlin.

Я провел много исследований, чтобы отобразить PDF в Kotlin, но я не получил большого результата, кажется, чтоэта тема на самом деле не такая первая, я посмотрел на PdfRenderer, который является родным, но большинство примеров в java, а не в Kotlin, и я не понимаю, что именно: documentmented.getSeekableFileDescriptor ().

Затем я посмотрел на pdfView libдействительно приятно отображать pdf, но только из ресурсов, pdfView.fromStream, похоже, не работает, и я не могу получить пример того, как это работает. Более того, я хотел бы избежать загрузки pdf, который я хочу отобразитьэто напрямую, чтобы избежать длительной загрузки.

Наконец, я использовал okhttp и retrofit, чтобы загрузить PDF, но я не могу использовать pdfView для его отображения, потому что в активе from PDF должен быть уже в проекте.

Я обнаружил, что загрузка pdf с и URL и отображение его с помощью Kotlin очень сложна и не очень задокументирована.

Так что, если у кого-то естьome предложение я возьму.

вот мой пример кода с использованием 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это работает, но только если файл уже находится в проекте, однако я хочу получить свой pdf и url

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()
        })
    }

1 Ответ

0 голосов
/ 04 октября 2019

Если у кого-то возникла эта проблема, я решил ее с помощью сопрограммы: добавьте эту зависимость в вашу сборку Gradle: реализацию ("org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.3.2")

затемimport: import kotlinx.coroutines. * в вашем файле.

Затем используйте следующие методы lauch coroutine:

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, и реализовать интерфейс OnLoadCompleteListener дляваша деятельность.

И, между прочим, если вы хотите отображать страницу на странице с помощью библиотеки pdfView, добавьте: .swipeHorizontal (true) .pageSnap (true) .autoSpacing (true) .pageFling (true)

...