¿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.
- Android - Cómo ejecutar la intención de JavaScript
- Android webview rendimiento, ¿qué me falta?
- Cómo buscar texto en la vista web
- Vista web de Android POST
- Android WebView canGoBack siempre es cierto
- Webview html formulario de entrada no mostrar / permitir el teclado
- Android - después de cargar URL con webview puedo cambiar el color de fondo
- Google Drive, el visor de pdf ya no funciona en android
- No se carga el PDF de Android en el navegador y en WebView
- ¿Cómo crear PDF desde webview en android?
- Cómo cargar mi aplicación web móvil en una vista web desde Facebook ¿Aplicación nativa para Android?
- Vista web de Android dentro de un servicio?
- Establecer una imagen de fondo para una vista web en Android
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);
- Dependencias transitivas no resueltas para una biblioteca aar usando gradle
- ¿Cómo obtener el ancho de la cadena en Android?