¿Cómo puedo mostrar un documento pdf en una vista web?

Quiero mostrar los contenidos de PDF en la vista web. 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"); 

Me aparece una pantalla en blanco. He establecido el permiso de internet también.

Puede usar 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 usa la URL solo para ver, el usuario no tiene previsto iniciar sesión en su cuenta de google.

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

Abrir un pdf usando Google Docs es una mala idea en términos de experiencia del usuario. Es muy lento y no responde.

Solución después de API 21

Desde la API 21, tenemos PdfRenderer que ayuda a convertir un pdf a Bitmap. 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 de PDF dedicada que hará un trabajo de banger que lo muestre. Experiencia de usuario rápida y agradable, especialmente si esta característica no es central en su aplicación.

Use 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() { @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() { @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 otorgar permiso a la aplicación receptora para abrir el archivo.

Así es como lo implementa: en su Manifiesto:

     

Finalmente crea un archivo file_paths.xml en los recursos foler

 < ?xml version="1.0" encoding="utf-8"?>    

Espero que esto ayude =)

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

Solo lo uso en el navegador (de escritorio y móvil) y funciona bien.

Aquí carga con progressDialog. Necesidad de dar WebClient de lo contrario, obligar a 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); 

Este es el límite de uso real que Google permite antes de que aparezca el error mencionado en los comentarios , si se trata de un único archivo en la vida que el usuario abrirá en la aplicación, entonces creo que es completamente seguro. Aunque se recomienda seguir el enfoque nativo utilizando el marco incorporado en Android de Android 5.0 / Lollipop, se llama PDFRenderer .

Descargue el código fuente desde aquí ( PDF abierto en webview android )

activity_main.xml

    

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