Comment puis-je afficher un document pdf dans un Webview?

je veux afficher le contenu pdf sur webview. Voici mon code:

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

, j'obtiens un écran vide. J'ai mis internet autorisation.

85
demandé sur Diego Palomar 2010-04-17 00:40:20

7 réponses

vous pouvez utiliser Google Docs Viewer pour lire votre pdf en ligne:

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);
143
répondu anticafe 2015-11-03 22:57:48

si vous utilisez l'url view only, l'utilisateur n'est pas censé se connecter à son compte google.

https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf
27
répondu slott 2012-04-19 09:23:37

ouvrir un pdf en utilisant google docs est une mauvaise idée en termes d'expérience utilisateur. Il est vraiment très lent et ne répond pas.

Solution après API 21

depuis api 21, nous avons PdfRenderer qui aide à convertir un pdf en Bitmap. Je n'ai jamais utilisé mais il semble assez facile.

Solution pour n'importe quel niveau api

une autre solution est de télécharger le PDF et de le passer via intention à un application PDF dédiée qui fera un travail de banger l'affichage. Expérience utilisateur rapide et agréable, surtout si cette fonctionnalité n'est pas centrale dans votre application.

utilisez ce code pour télécharger et ouvrir le 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);
                    }
                }
            });
}

}

pour L'intention de travailler, vous devez créer un FileProvider pour accorder l'autorisation à l'application de réception pour ouvrir le fichier.

Voici comment vous l'implémentez: Dans votre Manifeste:

    <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>

crée finalement un file_paths.fichier xml dans les ressources foler

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

Espérons que cette aide =)

7
répondu JDenais 2018-01-17 06:54:04

vous pouvez utiliser le Mozilla pdf.projet js . En gros, il vous montrera le PDF. Jetez un oeil à leur exemple .

Je l'utilise uniquement sur le navigateur (bureau et mobile) et il fonctionne très bien.

4
répondu Paulo Fidalgo 2014-05-26 13:09:08

chargez avec progressDialog. Besoin de donner WebClient sinon il force à ouvrir dans le navigateur:

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);
3
répondu Naveen Kumar M 2016-11-16 07:50:34

C'est le utilisation réelle limite que google permet avant que vous obtenez l'erreur mentionnée dans les commentaires , si c'est une pdf une fois dans une vie que l'utilisateur ouvrira dans l'application, alors je me sens en toute sécurité. Bien qu'il soit conseillé de suivre l'approche native en utilisant le cadre intégré dans Android à partir de Android 5.0 / Lollipop, il est appelé PDFRenderer .

0
répondu war_Hero 2017-07-19 11:54:02

télécharger le code source d'ici ( Open pdf dans 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>

activité principale.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();
            }
        });
    }
}
0
répondu Deepshikha Puri 2018-06-12 05:42:35