Passa ai contenuti principali

Android Studio - Visualizzare un PDF in app

In questo articolo vedremo come poter visualizzare un file PDF all'interno della propria applicazione.

Esistono varie librerie che possono essere utilizzate per visualizzare i file PDF nella nostra applicazione. In alcuni di questi esempi vedremo come utilizzare la libreria AndroidPdfViewer.

ESEMPIO 1:
In questo esempio vedremo come visualizzare un file PDF incorporato nell'applicazione.
Questa modalità aumenta le dimensioni del file APK (file di installazione dell'applicazione) in base alla dimensione del/dei file PDF inseriti nella cartella assets

Per prima cosa occorre aprire il file build.gradle ed inserire le seguenti righe
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
implementation 'com.mindorks.android:prdownloader:0.6.0'

Ecco come si presenta il file activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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=".MainActivity">
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Ora bisogna creare una funzione che permette di recuperare il file PDF dalla cartella assets
private fun getPdfNameFromAssets(): String {
//nome del file PDF che deve essere aperto
return "pdfTest.pdf"
}
view raw getPdfName1.kt hosted with ❤ by GitHub
Poi occorre creare una funzione per la visualizzazione del file PDF
private fun showPdfFromAssets(pdfName: String) {
pdfView.fromAsset(pdfName)
.password(null) //se protetto da password, inserire la password qui altrimenti null
.defaultPage(0) //impostazione della pagina da visualizzare all'apertura
//0 = pagina 1
.scrollHandle(DefaultScrollHandle(this)) //visualizza il numero della pagina corrente
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show()}
.load() //caricamento del file
}
view raw showPdf1.kt hosted with ❤ by GitHub
Ecco come si presenta il file MainActivity.kt
package com.dm.tutorialpdfview1
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//visualizzazione file PDF con il richiamo della funzione per recuperare il nome del file PDF da aprire
showPdfFromAssets(getPdfNameFromAssets())
}
//funzione che recupera il nome del file dalla cartella sssets
private fun getPdfNameFromAssets(): String {
//nome del file PDF che deve essere aperto
return "pdfTest.pdf"
}
//funzione per visualizzare il file PDF
private fun showPdfFromAssets(pdfName: String) {
pdfView.fromAsset(pdfName)
.password(null) //se protetto da password, inserire la password qui altrimenti null
.defaultPage(0) //impostazione della pagina da visualizzare all'apertura
//0 = pagina 1
.scrollHandle(DefaultScrollHandle(this)) //visualizza il numero della pagina corrente
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show() }
.load() //caricamento del file
}
}


Download Project
Download file APK


ESEMPIO 2:
In questo esempio vedremo come visualizzare un file PDF da un sito Web all'interno della WebView.
Questa modalità rispetto all'ESEMPIO 1, riduce notevolmente le dimensioni del file APK in quanto nessun file PDF è memorizzato al suo interno.

Per prima cosa inserire i permessi per l'accesso ad internet
<uses-permission android:name="android.permission.INTERNET"/>
Ecco come si presenta il file activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/webView" />
</androidx.constraintlayout.widget.ConstraintLayout>
Ora bisogna inserire un codice simile a quello utilizzato per la WebView
//impostazioni della webView
webView.webViewClient = WebViewClient()
webView.settings.setSupportZoom(true)
webView.settings.javaScriptEnabled = true
//ottiene l'indirizzo specificato nella funzione getPdfurl()
val url = getPdfUrl()
//indirizzo del visualizzatore PDF Google + l'url del documento PDF
webView.loadUrl("https://docs.google.com/gview?embedded=true&url=$url")
view raw webview_pdf.kt hosted with ❤ by GitHub
Infine bisogna creare una funzione che contiene l'indirizzo Web del file PDF
private fun getPdfUrl(): String {
//inserire l'indirizzo completo del file PDF sul Web
return "https://www.google.com/document/AndroidStudio.pdf"
}
view raw getPdfUrl.kt hosted with ❤ by GitHub
Ecco come si presenta il file MainActivity.kt
package com.dm.tutorialpdfview2
import android.graphics.Bitmap
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.webkit.WebView
import android.webkit.WebViewClient
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//impostazioni della webView
webView.webViewClient = WebViewClient()
webView.settings.setSupportZoom(true)
webView.settings.javaScriptEnabled = true
//ottiene l'indirizzo specificato nella funzione getPdfurl()
val url = getPdfUrl()
//indirizzo del visualizzatore PDF Google + l'url del documento PDF
webView.loadUrl("https://docs.google.com/gview?embedded=true&url=$url")
//progressBar
//non è indispensabile ma utile durante il caricamento del PDF
if(webView != null)
{
webView.webViewClient = object: WebViewClient(){
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
progressBar.visibility = View.VISIBLE
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
progressBar.visibility = View.GONE
super.onPageFinished(view, url)
}
}
}
//fine di progressBar
}
private fun getPdfUrl(): String {
//inserire l'indirizzo completo del file PDF sul Web
return "https://www.google.com/document/AndroidStudio.pdf"
}
}
Le righe dalla 27 alla 40 non sono obbligatorie ma risultano utili per verificare il caricamento del file PDF

Nell'immagine viene visualizzato anteprima non disponibile in quanto il collegamento Web al file PDF non esiste.


Download Project
Download file APK


ESEMPIO 3:
In questo esempio vedremo come visualizzare un file PDF archiviato all'interno della memoria del dispositivo.

Per prima cosa occorre aprire il file build.gradle ed inserire le seguenti righe
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
implementation 'com.mindorks.android:prdownloader:0.6.0'

Ecco come si presenta il file activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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=".MainActivity">
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Ora all'interno della funzione onCreate() occorre inserire la chiamata alla funzione che permette di selezionare il file
//chiamata alla funzione che permette di scegliere il file PDF dalla memoria telefono
selectPdfFromStorage()
Al di fuori della funzione onCreate() inserire queste righe di codice
//codice del file PDF
companion object {
private const val PDF_SELECTION_CODE = 99
}
view raw objectPdf.kt hosted with ❤ by GitHub
Ora creiamo la funzione che permette di selezionare il file dalla memoria del dispositivo
//funzione che permette di scegliere il file PDF dalla memoria telefono
private fun selectPdfFromStorage() {
Toast.makeText(this, "Seleziona file PDF", Toast.LENGTH_LONG).show()
val browseStorage = Intent(Intent.ACTION_GET_CONTENT)
browseStorage.type = "application/pdf"
browseStorage.addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(
Intent.createChooser(browseStorage, "Seleziona PDF"), PDF_SELECTION_CODE
)
}
view raw selectPdf.kt hosted with ❤ by GitHub
Poi occorre creare la funzione onActivityResult() che permette di recuperare il risultato di un'altra Activity in questo caso la selezione del file PDF e la sua successiva visualizzazione
//funzione che resituisce il risultato di un Intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PDF_SELECTION_CODE && resultCode == Activity.RESULT_OK && data != null) {
//dichiarazione variabile che contiene il percorso in cui è memorizzato il file PDF
val selectedPdfFromStorage = data.data
showPdfFromUri(selectedPdfFromStorage)
}
}
Infine occorre creare una funzione per la visualizzazione del file PDF
//funzione per visualizzare il file PDF
private fun showPdfFromUri(uri: Uri?) {
pdfView.fromUri(uri)
.password(null) //se protetto da password, inserire la password qui altrimenti null
.defaultPage(0) //impostazione della pagina da visualizzare all'apertura
//0 = pagina 1
.scrollHandle(DefaultScrollHandle(this)) //visualizza il numero della pagina corrente
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show() }
.load() //caricamento del file
}
view raw showPdf3.kt hosted with ❤ by GitHub
Ecco come si presenta il file MainActivity.kt
package com.dm.tutorialpdfview3
import android.app.Activity
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//chiamata alla funzione che permette di scegliere il file PDF dalla memoria telefono
selectPdfFromStorage()
}
//codice del file PDF
companion object {
private const val PDF_SELECTION_CODE = 99
}
//funzione che permette di scegliere il file PDF dalla memoria telefono
private fun selectPdfFromStorage() {
Toast.makeText(this, "Seleziona file PDF", Toast.LENGTH_LONG).show()
val browseStorage = Intent(Intent.ACTION_GET_CONTENT)
browseStorage.type = "application/pdf"
browseStorage.addCategory(Intent.CATEGORY_OPENABLE)
startActivityForResult(
Intent.createChooser(browseStorage, "Seleziona PDF"), PDF_SELECTION_CODE
)
}
//funzione che resituisce il risultato di un Intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PDF_SELECTION_CODE && resultCode == Activity.RESULT_OK && data != null) {
//dichiarazione variabile che contiene il percorso in cui è memorizzato il file PDF
val selectedPdfFromStorage = data.data
showPdfFromUri(selectedPdfFromStorage)
}
}
//funzione per visualizzare il file PDF
private fun showPdfFromUri(uri: Uri?) {
pdfView.fromUri(uri)
.password(null) //se protetto da password, inserire la password qui altrimenti null
.defaultPage(0) //impostazione della pagina da visualizzare all'apertura
//0 = pagina 1
.scrollHandle(DefaultScrollHandle(this)) //visualizza il numero della pagina corrente
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show() }
.load() //caricamento del file
}
}



Download Project
Download file APK


ESEMPIO 4:
In questo esempio vedremo come visualizzare un file PDF recuperato dal Web all'interno di un PDFView. Simile all'ESEMPIO 3 ma il file è un link Web. In pratica quando viene avviata l'applicazione viene scaricato il file PDF indicato e visualizzato all'interno del PDFView, rispetto all'ESEMPIO 2 è possibile avere maggior controllo sulla visualizzazione del file.

Per prima cosa inserire i permessi per l'accesso ad internet
<uses-permission android:name="android.permission.INTERNET"/>
E poi occorre aprire il file build.gradle ed inserire le seguenti righe
implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'
implementation 'com.mindorks.android:prdownloader:0.6.0'

Ecco come si presenta il file activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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=".MainActivity">
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Ora all'interno della funzione onCreate() occorre inserire l'inizializzazione della libreria download PDF e la chiamata alla funzione che si occupa di scaricare il file dal Web
//inizializzazione della libreria PRDownloader
PRDownloader.initialize(applicationContext)
//download del file PDF dal Web
val fileName = "myFile.pdf"
downloadPdfFromInternet(FileUtils.getPdfUrl(), FileUtils.getRootDirPath(this), fileName)
Poi occorre creare la funzione che si occupa di visualizzare il file PDF scaricato
//visualizzazione del file PDF
private fun showPdfFromFile(file: File) {
pdfView.fromFile(file)
.password(null)
.defaultPage(0)
.scrollHandle(DefaultScrollHandle(this))
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show()
}
.load()
}
view raw showPdf4.kt hosted with ❤ by GitHub
Poi occorre creare la funzione che si occupa di scaricare il file dal Web
//download del file dal Web
//ATTENZIONE! il file PDF NON viene salvato nella memoria del dispositivo
private fun downloadPdfFromInternet(url: String, dirPath: String, fileName: String) {
PRDownloader.download(url, dirPath, fileName)
.build()
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
Toast.makeText(this@MainActivity, "Download completato", Toast.LENGTH_LONG).show()
val downloadedFile = File(dirPath, fileName)
showPdfFromFile(downloadedFile)
}
override fun onError(error: com.downloader.Error?) {
Toast.makeText(this@MainActivity, "Errore durante il download del file: $error", Toast.LENGTH_LONG).show()
}
})
}
view raw downloadPDF.kt hosted with ❤ by GitHub
Infine bisogna creare un object con queste righe di codice (questo può essere anche un file di tipo object all'interno della cartella Java dove c'è il file MainActivity.kt)
//oggetto FileUtilis contiene il link Web del file e la cartella dove è stato scaricato il file
object FileUtils {
fun getPdfUrl(): String {
//inserire l'indirizzo completo del file PDF sul Web
return "https://www.google.com/document/AndroidStudio.pdf"
}
fun getRootDirPath(context: Context): String {
return if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
val file: File = ContextCompat.getExternalFilesDirs(
context.applicationContext,
null
)[0]
file.absolutePath
} else {
context.applicationContext.filesDir.absolutePath
}
}
}
Ecco come si presenta il file MainActivity.kt
package com.dm.tutorialpdfview4
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.widget.Toast
import androidx.core.content.ContextCompat
import com.downloader.OnDownloadListener
import com.downloader.PRDownloader //Importazione della Libreria: PRDownload
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//inizializzazione della libreria PRDownloader
PRDownloader.initialize(applicationContext)
//download del file PDF dal Web
val fileName = "myFile.pdf"
downloadPdfFromInternet(FileUtils.getPdfUrl(), FileUtils.getRootDirPath(this), fileName)
}
//visualizzazione del file PDF
private fun showPdfFromFile(file: File) {
pdfView.fromFile(file)
.password(null)
.defaultPage(0)
.scrollHandle(DefaultScrollHandle(this))
.onPageError { page, _ ->
Toast.makeText(this, "Error at page: $page", Toast.LENGTH_LONG).show()
}
.load()
}
//download del file dal Web
//ATTENZIONE! il file PDF NON viene salvato nella memoria del dispositivo
private fun downloadPdfFromInternet(url: String, dirPath: String, fileName: String) {
PRDownloader.download(url, dirPath, fileName)
.build()
.start(object : OnDownloadListener {
override fun onDownloadComplete() {
Toast.makeText(this@MainActivity, "Download completato", Toast.LENGTH_LONG).show()
val downloadedFile = File(dirPath, fileName)
showPdfFromFile(downloadedFile)
}
override fun onError(error: com.downloader.Error?) {
Toast.makeText(this@MainActivity, "Errore durante il download del file: $error", Toast.LENGTH_LONG).show()
}
})
}
//oggetto FileUtilis contiene il link Web del file e la cartella dove è stato scaricato il file
object FileUtils {
fun getPdfUrl(): String {
//inserire l'indirizzo completo del file PDF sul Web
return "//https://www.google.com/document/AndroidStudio.pdf"
}
fun getRootDirPath(context: Context): String {
return if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
val file: File = ContextCompat.getExternalFilesDirs(
context.applicationContext,
null
)[0]
file.absolutePath
} else {
context.applicationContext.filesDir.absolutePath
}
}
}
}

Nell'immagine non viene visualizzato alcun file PDF in quanto il collegamento Web al file PDF non esiste.


Download Project
Download file APK


Commenti

Post popolari in questo blog

Android Studio - Impostare lingua app

In questo articolo vedremo come poter selezionare la lingua all'interno della nostra app. Nel precedente articolo in cui si parlava del file string.xml , la lingua dell'app veniva selezionata automaticamente in base alle impostazioni del dispositivo, mentre qui vedremo come poter selezionare a proprio piacimento la lingua che dovrà avere la nostra app indipendentemente dall'impostazione del dispositivo. Per prima cosa creare il layout Ecco un esempio do come può essere il file activity_main.xml Ora creare le stringhe di testo all'interno del file string.xml Ora creare la traduzione del file string.xml nelle varie lingua come descritto in questo articolo Il risultato sarà una serie di file string.xml delle varie lingue impostate. Ora queste di seguito sono tre funzioni che servono per: selezione della lingua salvataggio della selezione nelle preferenze dell'app caricamento della lingua quando si avvia l'app Ecco come si presenta il file Main...

Android Studio - Rinominare il progetto

Rinominare il progetto Android Studio ATTENZIONE!: non eseguire questa procedura se l'app è stata pubblicata su Google Play Store Quando si vuole cambiare nome al progetto: nome cartella in cui è contenuto il progetto package name bisogna eseguire questi passaggi: Andare nella cartella dove è contenuto il progetto Creare una copia del progetto in questione Rinominare la cartella copiata con il nome dell'app (non usare spazi tra le parole) Ora è necessario dire ad Android Studio il nome del nuovo progetto  Aprire Android Studio Aprire il progetto creato in precedenza Una volta caricato il progetto cliccare Build Cliccare Clean Project Attendere che venga eseguito il processo di "pulitura" Cliccare ancora su Build Cliccare su Rebuild Project Attendere che venga ricostruito il progetto Ora aprire la cartella app fino a visualizzare la cartella java Cliccare sull'ingranaggio  Deselezionare la voce Compact Middle Packa...

Arduino - Lettura tensione potenziometro e display LCD

Leggere il valore di un poteziometro (parte 2) Oggi vedremo come leggere il valore in tensione di un potenziometro collegato al pin Analogico A0 di Arduino.