¿Cómo puedo mostrar un documento PDF en una vista Web?

Quiero mostrar el contenido del pdf en webview. Aquí está mi código:

WebView webview = new WebView(this); setContentView(webview); webview.getSettings().setJavaScriptEnabled(true); webview.loadUrl("http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf"); 

Estoy recibiendo una pantalla en blanco. También he establecido el permiso de Internet.

Puede utilizar Google Docs Viewer para leer su pdf en línea:

 WebView webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); String pdf = "http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf"; webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf); 

Si utiliza la vista sólo url el usuario no está propted para iniciar sesión en cuenta de google.

 https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf 

Puede utilizar el proyecto Mozilla pdf.js. Básicamente le mostrará el PDF. Echa un vistazo a su ejemplo .

Sólo lo uso en el navegador (escritorio y móvil) y está funcionando bien.

Aquí se carga con progressDialog. Necesidad de dar WebClient de lo contrario fuerza para abrir en el navegador:

 final ProgressDialog pDialog = new ProgressDialog(context); pDialog.setTitle(context.getString(R.string.app_name)); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); WebView webView = (WebView) rootView.findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); pDialog.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); pDialog.dismiss(); } }); String pdf = "http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf"; webView.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf); 

Descargar el código fuente desde aquí ( Abrir pdf en webview android )

Activity_main.xml

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <WebView android:layout_width="match_parent" android:background="#ffffff" android:layout_height="match_parent" android:id="@+id/webview"></WebView> </RelativeLayout> 

MainActivity.java

 package com.pdfwebview; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { WebView webview; ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); listener(); } private void init() { webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); pDialog = new ProgressDialog(MainActivity.this); pDialog.setTitle("PDF"); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); webview.loadUrl("https://drive.google.com/file/d/0B534aayZ5j7Yc3RhcnRlcl9maWxl/view"); } private void listener() { webview.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); pDialog.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); pDialog.dismiss(); } }); } } 

¡Gracias!

Este es el límite de uso real que google permite antes de obtener el error mencionado en los comentarios , si es una vez en la vida pdf que el usuario se abrirá en la aplicación, entonces me siento completamente seguro. Aunque se aconseja seguir el enfoque nativo utilizando el marco incorporado en Android desde Android 5.0 / Lollipop, se llama PDFRenderer .

La apertura de un pdf utilizando google docs es una mala idea en cuanto a la experiencia del usuario. Es muy lento y no responde.

Solución después de API 21 Desde api 21, tenemos PdfRenderer que ayuda a convertir un pdf a Bitmap.

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html

Nunca lo he usado pero parece bastante fácil.

Solución para cualquier nivel de api Otra solución es descargar el PDF y pasarlo a través de Intent a una aplicación PDF dedicada que hará un trabajo banger mostrándolo. Experiencia de usuario rápida y agradable, especialmente si esta característica no es central en tu aplicación.

Utilice este código para descargar y abrir el PDF

 public class PdfOpenHelper { public static void openPdfFromUrl(final String pdfUrl, final Activity activity){ Observable.fromCallable(new Callable<File>() { @Override public File call() throws Exception { try{ URL url = new URL(pdfUrl); URLConnection connection = url.openConnection(); connection.connect(); // download the file InputStream input = new BufferedInputStream(connection.getInputStream()); File dir = new File(activity.getFilesDir(), "/shared_pdf"); dir.mkdir(); File file = new File(dir, "temp.pdf"); OutputStream output = new FileOutputStream(file); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0, count); } output.flush(); output.close(); input.close(); return file; } catch (IOException e) { e.printStackTrace(); } return null; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<File>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(File file) { String authority = activity.getApplicationContext().getPackageName() + ".fileprovider"; Uri uriToFile = FileProvider.getUriForFile(activity, authority, file); Intent shareIntent = new Intent(Intent.ACTION_VIEW); shareIntent.setDataAndType(uriToFile, "application/pdf"); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (shareIntent.resolveActivity(activity.getPackageManager()) != null) { activity.startActivity(shareIntent); } } }); } 

}

Para que la Intención funcione, debe crear un FileProvider para conceder permiso a la aplicación receptora para abrir el archivo. https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Aquí es cómo lo implementas: En tu Manifiesto:

  <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 

Finalmente cree un archivo file_paths.xml en los recursos foler

 <?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="shared_pdf" path="shared_pdf"/> </paths> 

Espero que esto ayude =)

Esto funcionó para mí:

 webViewReportViewing.loadUrl("http://docs.google.com/gview?embedded=true&url=" +reportFileUrl); 
  • Hacer que el inicio de sesión en facebook funcione con una vista Web de Android
  • Detección automática de número de teléfono, correo electrónico y enlace URL en Webview - Android sdk
  • La casilla de comentarios de Facebook no se muestra en la vista web de Android
  • Precargar la vista Web en la actividad A y pasarla a la actividad B para una carga más rápida
  • WebView en un cuadro de diálogo (carga de activos) y no presentado
  • Android webView saveState
  • Android: Callbacks con componente WebView?
  • Generar mapa de bits de HTML en Android
  • Cómo manejar las devoluciones de llamada en la vista web
  • Vista web de Android lenta
  • Cómo hacer un Scroll Listener para WebView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.