Wie kann ich ein PDF-Dokument in einer Webansicht anzeigen?

114

Ich möchte PDF-Inhalte in der Webansicht anzeigen. Hier ist mein 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");

Ich bekomme einen leeren Bildschirm. Ich habe auch die Internet-Erlaubnis eingestellt.

Shriya
quelle

Antworten:

168

Mit Google PDF Viewer können Sie Ihr PDF online lesen:

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("https://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
anticafe
quelle
1
Hallo Sunit, bis jetzt, wenn Sie PDF lesen möchten, müssen Sie einen PDF-Reader auf Ihrem Android-Handy installieren oder Webview verwenden, um PDF-Dateien online zu rendern. Leider können wir die zweite Methode nicht verwenden, um PDF offline zu lesen.
Anticafe
45
Nachdem ich es 2 Tage lang dauerhaft getestet habe, wurde in den Google-Dokumenten eine Fehlermeldung angezeigt You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... Scheint also nicht zuverlässig zu sein.
Shobhit Puri
4
Die Docs-URL wird jetzt zu Drive umgeleitet: " drive.google.com/viewerng/viewer?embedded=true&url= "
Murphy
31
Diese Lösung ist absolut schrecklich. Die Tatsache, dass so viele von Ihnen erwägen, etwas so Hässliches in Ihre App zu integrieren, macht mir Sorgen. Diese Seite ist für den Desktop konzipiert. Diese Seite ist eindeutig für den Desktop optimiert. Die Verwendung auf Mobilgeräten ist keine gute mobile Erfahrung.
Clu
3
Was ist, wenn Sie offline sind?
Yerlilbilgin
35

Wenn Sie nur die URL "Ansicht" verwenden, wird der Benutzer nicht aufgefordert, sich bei seinem Google-Konto anzumelden.

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

Das Öffnen eines PDFs mit Google Docs ist im Hinblick auf die Benutzererfahrung eine schlechte Idee. Es ist sehr langsam und reagiert nicht.

Lösung nach API 21

Seit API 21 haben wir PdfRenderer, mit dessen Hilfe ein PDF in Bitmap konvertiert werden kann. Ich habe es nie benutzt, aber es scheint einfach genug zu sein.

Lösung für jedes API-Level

Eine andere Lösung besteht darin, das PDF herunterzuladen und über Intent an eine dedizierte PDF-App zu übergeben, die einen Banger-Job ausführt, bei dem es angezeigt wird. Schnelle und nette Benutzererfahrung, insbesondere wenn diese Funktion in Ihrer App nicht zentral ist.

Verwenden Sie diesen Code, um das PDF herunterzuladen und zu öffnen

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

}}

Damit die Absicht funktioniert, müssen Sie einen FileProvider erstellen , um der empfangenden App die Berechtigung zum Öffnen der Datei zu erteilen.

So implementieren Sie es: In Ihrem Manifest:

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

Erstellen Sie abschließend eine Datei file_paths.xml im Ressourcenordner

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

Hoffe das hilft =)

JDenais
quelle
1
Ist shared_pdf ein Verzeichnis unter Assets?
Codezombie
1
Dies ist eine schöne Lösung.
Codezombie
9

Verwenden Sie diesen 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);
        }
    }
Athira
quelle
@ Athira Kidilam Antwort
Samwinishere Here
7

Hier mit progressDialog laden. Müssen Sie WebClient geben, sonst erzwingt es das Öffnen im Browser:

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);
Naveen Kumar M.
quelle
Wie kann ich die Suchfunktion für PDF in der Webansicht aktivieren
Anant Shah
4

Sie können das Mozilla pdf.js- Projekt verwenden. Grundsätzlich wird Ihnen das PDF angezeigt. Schauen Sie sich ihr Beispiel an .

Ich benutze es nur im Browser (Desktop und Mobile) und es funktioniert gut.

Paulo Fidalgo
quelle
hi @paulo kannst du mir bitte ein beispiel geben wie man das mit dem android benutzt?
Khalid ElSayed
1
@ KhalidElSayed Ich denke, dass Butelo in Ihrem Ziel erfolgreich war: stackoverflow.com/a/21383356/505893
bläulich
Können pdf.js lokal verwendet werden? Ich meine, kann es in einer Anwendung verwendet werden, die in einem LAN ohne Internetzugang verwendet wird, aber mit einem lokalen Server kommuniziert?
Codezombie
2

Eigentlich waren alle Lösungen ziemlich komplex und ich habe eine wirklich einfache Lösung gefunden (ich bin mir nicht sicher, ob sie für alle SDK-Versionen verfügbar ist). Das PDF-Dokument wird in einem Vorschaufenster geöffnet, in dem der Benutzer das Dokument anzeigen und speichern / freigeben kann:

webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
     val i = Intent(Intent.ACTION_QUICK_VIEW)
     i.data = Uri.parse(url)
     if (i.resolveActivity(getPackageManager()) != null) {
            startActivity(i)
     } else {
            val i2 = Intent(Intent.ACTION_VIEW)
            i2.data = Uri.parse(url)
            startActivity(i2)
     }
})

(Kotlin)

Dion
quelle
1
kann mir Beispielcode für DownloadListener Klasse geben
mohammedragabmohammedborik
@mohammedragabmohammedborik Die DownloadListener-Klasse ist in Android enthalten. Sie benötigen keine zusätzlichen Klassen, um den obigen Code auszuführen.
Dion
2
Beachten Sie, dass ACTION_QUICK_VIEW nur ​​von Android N und höher unterstützt wird.
Pumpkee
@pumpkee Du hast recht, das hat in meinem Fall ein Problem verursacht. Ich habe den obigen Code hinzugefügt, der prüft, ob die Schnellansicht verfügbar ist. Andernfalls würde es im Browser geöffnet.
Dion
0

Quellcode von hier herunterladen ( PDF in Webview Android öffnen )

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();
            }
        });
    }
}
Deepshikha Puri
quelle
Sie öffnen eine Google Drive-Datei, bei der es sich nicht um eine PDF-Datei auf der SD-Karte des Geräts handelt
OneCricketeer,
Ja In dieser Demo zeige ich die PDF-Datei des Google-Laufwerks. Wenn Sie Ihr PDF von der SD-Karte anzeigen möchten, überprüfen Sie diese Demo. deepshikhapuri.wordpress.com/2017/04/24/…
Deepshikha Puri
0

Dies ist das tatsächliche Nutzungslimit , das Google zulässt, bevor Sie den in den Kommentaren genannten Fehler erhalten. Wenn es sich um ein einmaliges PDF handelt, das der Nutzer in der App öffnet, fühle ich mich absolut sicher. Obwohl empfohlen wird, den nativen Ansatz mit dem in Android integrierten Framework von Android 5.0 / Lollipop zu verfolgen, heißt es PDFRenderer .

Mightian
quelle
Der Link zu "PDFRenderer" ist defekt.
Nate
@Nate danke, dass Sie mich darauf aufmerksam gemacht haben. Ich weiß es wirklich zu schätzen. Ich habe den Link aktualisiert. Da der PDF-Renderer eine native Android-API ist, haben sie die Dinge auf der Website verschoben. Wenn der aktualisierte Link in Zukunft erneut beschädigt wird, ist dies der Fall Am besten auf der Android-Entwickler-Website suchen.
Mightian
0
String webviewurl = "http://test.com/testing.pdf";
webView.getSettings().setJavaScriptEnabled(true); 
if(webviewurl.contains(".pdf")){
    webviewurl = "http://docs.google.com/gview?embedded=true&url=" + webviewurl;        }
webview.loadUrl(webviewurl);
jaigish
quelle