¿Cómo abrir un archivo PDF local en WebView en Android?

Quiero abrir un archivo PDF local (tarjeta SD) en una WebView.

Ya probé esto:

webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setPluginsEnabled(true); webview.getSettings().setAllowFileAccess(true); File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf"); final Uri uri = Uri.fromFile(file); webview.loadUrl(uri.toString()); 

Pero aún no lo está abriendo, así que ¿cómo puedo abrir un PDF en WebView?

Lo sé, esta pregunta es vieja.

Pero realmente me gusta el enfoque de Xamarin para hacer uso del pdf.js de Mozilla. Funciona en versiones anteriores de Android, no necesita una aplicación especial de PDF Viewer para esto y puede visualizar fácilmente un PDF dentro de la jerarquía de vistas de sus aplicaciones.

Git para esto: https://mozilla.github.io/pdf.js/

Opciones predeterminadas adicionales (como zoom estándar): https://github.com/mozilla/pdf.js/wiki/Viewer-options

Simplemente agregue los archivos pdfjs a su directorio de Activos:

enter image description here

Y llámalo de la siguiente manera:

 // Assuming you got your pdf file: File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf"); webview = (WebView) findViewById(R.id.webview); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true); settings.setAllowFileAccessFromFileURLs(true); settings.setAllowUniversalAccessFromFileURLs(true); settings.setBuiltInZoomControls(true); webview.setWebChromeClient(new WebChromeClient()); webview.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + file.getAbsolutePath() + "#zoom=page-width"); 

Cosa genial: si quieres reducir la cantidad de funcionalidades / controles. Vaya al archivo Assets / pdfjs / web / viewer.html y marque ciertos controles como ocultos. Con

 style="display: none;" 

Por ejemplo, si no te gusta la barra de herramientas correcta:

  

Como @Sameer respondió en su comentario anterior, la única solución para ver el PDF en la vista web es a través del visor en línea de Google Docs, que procesará y enviará una versión legible a su aplicación.

Anteriormente discutido aquí

  • Abrir PDF en una WebView
  • Abra un archivo pdf dentro de una vista web.

No puedes. Usando un Intento, puede abrir el PDF en una aplicación de visor externo como Acrobat Reader:

 try { Intent intentUrl = new Intent(Intent.ACTION_VIEW); intentUrl.setDataAndType(uri, "application/pdf"); intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mActivity.startActivity(intentUrl); } catch (ActivityNotFoundException e) { Toast.makeText(mActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show(); } 

Después de pasar por varios mensajes me encontré con esta simple respuesta en Quora, que prácticamente hace el trabajo. Los siguientes son pasos:

Agregue esta dependencia en su archivo gradle:

 compile 'com.github.barteksc:android-pdf-viewer:2.0.3' 

activity_main.xml

   

MainActivity.java

 package pdfviewer.pdfviewer; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.github.barteksc.pdfviewer.PDFView; import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener; import com.github.barteksc.pdfviewer.listener.OnPageChangeListener; import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle; import com.shockwave.pdfium.PdfDocument; import java.util.List; public class MainActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener{ private static final String TAG = MainActivity.class.getSimpleName(); public static final String SAMPLE_FILE = "sample_pdf.pdf"; PDFView pdfView; Integer pageNumber = 0; String pdfFileName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pdfView= (PDFView)findViewById(R.id.pdfView); displayFromAsset(SAMPLE_FILE); } private void displayFromAsset(String assetFileName) { pdfFileName = assetFileName; pdfView.fromAsset(SAMPLE_FILE) .defaultPage(pageNumber) .enableSwipe(true) .swipeHorizontal(false) .onPageChange(this) .enableAnnotationRendering(true) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .load(); } @Override public void onPageChanged(int page, int pageCount) { pageNumber = page; setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount)); } @Override public void loadComplete(int nbPages) { PdfDocument.Meta meta = pdfView.getDocumentMeta(); printBookmarksTree(pdfView.getTableOfContents(), "-"); } public void printBookmarksTree(List tree, String sep) { for (PdfDocument.Bookmark b : tree) { Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx())); if (b.hasChildren()) { printBookmarksTree(b.getChildren(), sep + "-"); } } } } 

Debes asegurarte de que tu carpeta de recursos contiene sample_pdf.pdf (la biblioteca también admite abrir pdf desde Uri y SDCard)

enter image description here

Feliz encoding 🙂

Desde on-wards para Android OS 5.0 (lollipop) puede usar PdfRenderer instead of webview/library. Puede usar esta clase para mostrar los archivos PDF dentro de la aplicación.

Si desea admitir un sistema operativo más bajo, puede usar una biblioteca / otro enfoque mencionado en otra respuesta, ya que no hay soporte nativo.

Lea más sobre esto en los documentos , también puede referir este ejemplo

WebView no puede abrir un archivo .pdf. La solución más popular (la URL de Google Docs + su URL en WebView) solo muestra las imágenes convertidas por Google Docs. Sin embargo, todavía no hay una forma simple de abrir .pdf desde url.