web-dev-qa-db-fra.com

Comment ouvrir local PDF fichier dans WebView dans Android?

Je souhaite ouvrir un fichier local (carte SD) PDF dans une vue Web.

J'ai déjà essayé ceci:

webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setPluginsEnabled(true);
webview.getSettings().setAllowFileAccess(true);
File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");

final Uri uri = Uri.fromFile(file);

webview.loadUrl(uri.toString());

Mais cela ne l’ouvre toujours pas, alors laissez-moi savoir comment puis-je ouvrir un PDF dans WebView?

16
Girish Patel

Je sais, cette question est ancienne.

Mais j'aime beaucoup l'approche de Xamarin pour utiliser le pdf.js de Mozilla. Cela fonctionne sur les anciennes versions d'Android, vous n'avez pas besoin d'une application spéciale PDF Viewer pour cela et vous pouvez facilement afficher un PDF à l'intérieur de la hiérarchie de vos vues d'applications.

Git pour cela: https://mozilla.github.io/pdf.js/

Options par défaut supplémentaires (comme le zoom standard): https://github.com/mozilla/pdf.js/wiki/Viewer-options

Ajoutez simplement les fichiers pdfjs à votre répertoire Assets:

 enter image description here

Et appelez ça de la manière suivante:

// Assuming you got your pdf file:
File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");

webview = (WebView) findViewById(R.id.webview);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file:///Android_asset/pdfjs/web/viewer.html?file=" + file.getAbsolutePath() + "#zoom=page-width");

Chose cool: Si vous voulez réduire le nombre de fonctionnalités/contrôles. Accédez au fichier Assets/pdfjs/web/viewer.html et marquez certains contrôles comme étant masqués . Avec.

style="display: none;"

Par exemple. Si vous n'aimez pas la bonne barre d'outils:

<div id="toolbarViewerRight" style="display: none;">...</div>
21
Lepidopteron

Comme @Sameer a répondu à votre commentaire ci-dessus, la seule solution permettant d'afficher PDF dans l'affichage Web consiste à utiliser le visualiseur en ligne de Google Documents qui restituera une version lisible à votre application.

Déjà discuté ici

4
James Wong

Vous ne pouvez pas. À l'aide d'une intention, vous pouvez ouvrir le PDF dans une application de visualisation externe telle qu'Acrobat Reader:

try
{
 Intent intentUrl = new Intent(Intent.ACTION_VIEW);
 intentUrl.setDataAndType(uri, "application/pdf");
 intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 mActivity.startActivity(intentUrl);
}
catch (ActivityNotFoundException e)
{
 Toast.makeText(mActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
}
2
CSmith

Après avoir lu plusieurs articles, je suis tombé sur ce réponse simple sur Quora qui fait à peu près tout le travail. Voici les étapes: -

Ajoutez cette dépendance dans votre fichier gradle:

compile 'com.github.barteksc:Android-pdf-viewer:2.0.3'

activity_main.xml

 <com.github.barteksc.pdfviewer.PDFView
    Android:id="@+id/pdfView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
     />

MainActivity.Java

package pdfviewer.pdfviewer;

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;

import Java.util.List;

public class MainActivity extends Activity implements OnPageChangeListener,OnLoadCompleteListener{
    private static final String TAG = MainActivity.class.getSimpleName();
    public static final String SAMPLE_FILE = "sample_pdf.pdf";
    PDFView pdfView;
    Integer pageNumber = 0;
    String pdfFileName;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        pdfView= (PDFView)findViewById(R.id.pdfView);
        displayFromAsset(SAMPLE_FILE);
    }

    private void displayFromAsset(String assetFileName) {
        pdfFileName = assetFileName;

        pdfView.fromAsset(SAMPLE_FILE)
                .defaultPage(pageNumber)
                .enableSwipe(true)

                .swipeHorizontal(false)
                .onPageChange(this)
                .enableAnnotationRendering(true)
                .onLoad(this)
                .scrollHandle(new DefaultScrollHandle(this))
                .load();
    }


    @Override    public void onPageChanged(int page, int pageCount) {
        pageNumber = page;
        setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
    }


    @Override    public void loadComplete(int nbPages) {
        PdfDocument.Meta meta = pdfView.getDocumentMeta();
        printBookmarksTree(pdfView.getTableOfContents(), "-");

    }

    public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
        for (PdfDocument.Bookmark b : tree) {

            Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

            if (b.hasChildren()) {
                printBookmarksTree(b.getChildren(), sep + "-");
            }
        }
    }

}

Vous devez vous assurer que votre dossier de ressources contient sample_pdf.pdf (la bibliothèque prend également en charge l’ouverture de fichiers PDF à partir d’Uri et de SDCard).

 enter image description here

Bonne codage :)

1
pallav bohara

À partir d'Android OS 5.0 (Lollipop), vous pouvez utiliser PdfRenderer instead of webview/library.. Vous pouvez utiliser cette classe pour afficher les fichiers PDF dans l'application. 

Si vous souhaitez prendre en charge un système d'exploitation inférieur, vous pouvez utiliser une bibliothèque/autre approche mentionnée dans une autre réponse car il n'y a pas de support natif.

En savoir plus à ce sujet dans docs , vous pouvez également vous référer à cet exemple exemple

0
war_Hero