Откройте PDF-файл из Интернета, используя пользовательский вид

#android #pdf #pdf-reader

#Android #PDF #программа чтения pdf

Вопрос:

Мне нужно открыть PDF-файл из Интернета в моем пользовательском представлении. Мне просто нужна информация в формате PDF и кнопка «Назад».

Я видел следующую библиотеку: https://github.com/barteksc/AndroidPdfViewer

Я реализовал подобное, но это не работает.

Как я должен это сделать?

Планировка

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ReaderActivity">

    <com.github.barteksc.pdfviewer.PDFView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@ id/pdfView"/>

</LinearLayout>
 

Активность

 class ReaderActivity : BaseAppCompatActivity()
{
    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_reader)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        pdfView.fromUri(Uri.parse("https://si.ua.es/es/documentos/documentacion/pdf-s/mozilla12-pdf.pdf"))
            .pageSnap(true)
            .load()
    }
}
 

Ответ №1:

fromUri() предназначен для a Uri , который может использоваться ContentResolver , например, со content схемой.

Если вы знаете, что PDF-файл очень маленький, вы можете попробовать fromStream() вместо fromUri() . В противном случае вам нужно будет сначала загрузить PDF-файл (например, в getCacheDir() ), а затем использовать fromFile() , так как при попытке использования у вас может закончиться память fromStream() .

Комментарии:

1. PDF-файл будет состоять максимум из 2-3 страниц, так что я должен пойти fromStream() , я полагаю.

2. @Lechucico: Вы можете попробовать. Вам нужно будет получить InputStream доступ к содержимому PDF-файла из вашего любимого API HTTP-клиента (например, OkHttp).

Ответ №2:

Это решение, которое сработало для меня:

 val client = OkHttpClient()
val request = Request.Builder().url("URL TO PDF").build()

client.newCall(request).enqueue(object : Callback
{
    @Throws(IOException::class)
    override fun onResponse(call: Call, response: Response)
    {
        if (!response.isSuccessful)
        {
            throw IOException("Failed to download file: $response")
        }

        val stream = ByteArrayInputStream(response.body()?.bytes())
        pdfView.fromStream(stream).load()
    }

    override fun onFailure(call: Call, e: IOException)
    {
        e.printStackTrace()
    }
})
 

Где PDFView — это элемент, импортированный из этой библиотеки: https://github.com/barteksc/AndroidPdfViewer