web-dev-qa-db-fra.com

Comment afficher un document pdf dans une vue Web?

Je souhaite 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");

Je reçois un écran vide. J'ai mis la permission d'Internet aussi.

102
shriya

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);
156
anticafe

Si vous utilisez la vue uniquement, l'utilisateur n'est pas susceptible de se connecter à son compte Google.

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

L'ouverture d'un fichier PDF à l'aide de Google Documents est une mauvaise idée en termes d'expérience utilisateur. C'est vraiment lent et insensible.

Solution après API 21

Depuis api 21, nous avons PdfRenderer , qui aide à convertir un fichier PDF en Bitmap. Je ne l'ai jamais utilisé mais cela semble assez facile.

Solution pour tout niveau d'api

Une autre solution consiste à télécharger le PDF et le transmettre via Intent à une application PDF dédiée qui effectuera un travail de banger en l'affichant. Expérience utilisateur simple et rapide, 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 que l’intention fonctionne, vous devez créer un FileProvider afin d’autoriser l’application réceptrice à ouvrir le fichier.

Voici comment vous le mettez en œuvre: 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>

Enfin, créez un fichier chemin_fichier.xml dans le répertoire des ressources.

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

J'espère que cela aide =)

8
JDenais

Ici charger avec progressDialog. Besoin de donner WebClient sinon il oblige à 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("https://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
6
Naveen Kumar M

Utilisez ce code:

private void pdfOpen(String fileUrl){

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setPluginState(WebSettings.PluginState.ON);

        //---you need this to prevent the webview from
        // launching another browser when a url
        // redirection occurs---
        webView.setWebViewClient(new Callback());

        webView.loadUrl(
                "http://docs.google.com/gview?embedded=true&url=" + fileUrl);

    }

    private class Callback extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(
                WebView view, String url) {
            return (false);
        }
    }
5
Athira

Vous pouvez utiliser le projet Mozilla pdf.js . Fondamentalement, il va vous montrer le PDF. Jetez un oeil à leur exemple .

Je ne l'utilise que sur le navigateur (ordinateur de bureau et mobile) et tout fonctionne correctement.

4
Paulo Fidalgo

En fait, toutes les solutions étaient assez complexes et j'ai trouvé une solution très simple (je ne sais pas si elle est disponible pour toutes les versions de SDK). Il ouvrira le document pdf dans une fenêtre d’aperçu dans laquelle l’utilisateur pourra visualiser et sauvegarder/partager le document:

webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
     val i = Intent(Intent.ACTION_QUICK_VIEW)
     i.data = Uri.parse(url)
     startActivity(i)
})

(Kotlin)

0
Dion

C’est la utilisation réelle limite que Google autorise avant d’obtenir l’erreur mentionnée dans les commentaires , si c’est une fois dans un durée de vie pdf que l'utilisateur va ouvrir dans l'application, alors je me sens tout à fait en sécurité. Bien qu'il soit conseillé de suivre l'approche native en utilisant le framework intégré dans Android à partir de Android 5.0/Lollipop, il s'appelle PDFRenderer .

0
war_Hero