Bagaimana cara menampilkan dokumen pdf ke dalam Webview?


115

Saya ingin menampilkan konten pdf di webview. Ini kode saya:

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

Saya mendapatkan layar kosong. Saya telah mengatur izin internet juga.

Jawaban:


170

Anda dapat menggunakan Google Penampil PDF untuk membaca pdf Anda secara online:

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

1
hai sunit, sampai saat ini jika anda ingin membaca PDF, anda harus menginstal PDF reader di hp android anda, atau menggunakan webview untuk merender file PDF secara online. Maaf, kami tidak dapat menggunakan metode kedua untuk membaca PDF secara offline.
anticafe

45
Setelah mengujinya terus-menerus selama 2 hari, saya mendapat kesalahan pada dokumen Google yang mengatakan You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... Jadi sepertinya tidak bisa diandalkan.
Shobhit Puri

4
Url Dokumen sekarang dialihkan ke Drive: " drive.google.com/viewerng/viewer?embedded=true&url= "
Murphy

31
Solusi ini sangat buruk. Fakta bahwa begitu banyak dari Anda mempertimbangkan untuk memasukkan sesuatu yang seburuk ini di aplikasi Anda membuatku khawatir. Halaman ini dirancang untuk desktop. Situs ini jelas dioptimalkan untuk desktop. Menggunakan ini di seluler bukanlah pengalaman seluler yang baik.
clu

3
bagaimana jika Anda sedang offline?
yerlilbilgin

36

Jika Anda menggunakan url lihat saja, pengguna tidak diminta untuk masuk ke akun Google yang ada.

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

9

Membuka pdf menggunakan google docs adalah ide yang buruk dalam hal pengalaman pengguna. Ini sangat lambat dan tidak responsif.

Solusi setelah API 21

Sejak api 21, kami memiliki PdfRenderer yang membantu mengonversi pdf ke Bitmap. Saya belum pernah menggunakannya tetapi tampaknya cukup mudah.

Solusi untuk level api apa pun

Solusi lainnya adalah mengunduh PDF dan menyebarkannya melalui Intent ke aplikasi PDF khusus yang akan menampilkannya secara banger. Pengalaman pengguna yang cepat dan menyenangkan, terutama jika fitur ini tidak menjadi pusat aplikasi Anda.

Gunakan kode ini untuk mengunduh dan membuka 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);
                    }
                }
            });
}

}

Agar Intent berfungsi, Anda perlu membuat FileProvider untuk memberikan izin kepada aplikasi penerima untuk membuka file.

Berikut adalah cara Anda menerapkannya: Dalam Manifes Anda:

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

Terakhir buat file file_paths.xml di foler sumber daya

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

Semoga ini membantu =)


1
Apakah shared_pdf merupakan direktori dalam aset?
codezombie

1
Ini solusi yang bagus.
codezombie

9

Gunakan kode ini:

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 kidilam menjawab
Samwinishere Disini

7

Di sini memuat dengan progressDialog. Perlu memberikan WebClient jika tidak, paksa untuk membuka di 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);

Bagaimana saya bisa mengaktifkan fitur pencarian untuk pdf di webview
Anant Shah

4

Anda dapat menggunakan Mozilla pdf.js proyek. Pada dasarnya ini akan menampilkan PDF kepada Anda. Lihat contoh mereka .

Saya hanya menggunakannya di browser (desktop dan seluler) dan berfungsi dengan baik.


hai @paulo dapatkah Anda memberi saya contoh tentang bagaimana menggunakan ini dengan android?
Khalid ElSayed

1
@KhalidElSayed Saya pikir butelo telah berhasil dalam tujuan Anda: stackoverflow.com/a/21383356/505893
kebiru

Bisakah pdf.js digunakan secara lokal? Maksud saya, bisakah itu digunakan dalam aplikasi yang digunakan di LAN tanpa akses Internet, tetapi berkomunikasi dengan server lokal?
codezombie

2

Sebenarnya semua solusi cukup kompleks, dan saya menemukan solusi yang sangat sederhana (saya tidak yakin apakah ini tersedia untuk semua versi sdk). Ini akan membuka dokumen pdf di jendela pratinjau di mana pengguna dapat melihat dan menyimpan / berbagi dokumen:

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)


1
dapat memberi saya kode contoh untuk kelas DownloadListener
mohammedragabmohammedborik

@mohammedragabmohammedborik Kelas DownloadListener disertakan di Android, Anda tidak memerlukan kelas tambahan untuk menjalankan kode di atas.
Dion

2
Perhatikan bahwa ACTION_QUICK_VIEW hanya didukung dari Android N dan yang lebih baru.
pumpkee

@pumpkee Anda benar, itu menyebabkan masalah dalam kasus saya. Saya menambahkan kode di atas yang memeriksa apakah Quick View tersedia. Jika tidak, itu akan dibuka di browser.
Dion

0

Unduh kode sumber dari sini ( Buka pdf di 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();
            }
        });
    }
}

Anda membuka file Google Drive, yang bukan PDF seperti yang ada di kartu SD perangkat
OneCricketeer

Ya Dalam demo ini saya menunjukkan file pdf Google drive. Jika Anda ingin menampilkan pdf Anda dari sdcard, periksa demo ini. deepshikhapuri.wordpress.com/2017/04/24/…
Deepshikha Puri

0

Ini adalah batas penggunaan sebenarnya yang diizinkan Google sebelum Anda mendapatkan kesalahan yang disebutkan di komentar , jika ini adalah pdf sekali seumur hidup yang akan dibuka pengguna di aplikasi, maka saya merasa ini sepenuhnya aman. Meskipun disarankan untuk mengikuti pendekatan asli menggunakan kerangka kerja bawaan di Android dari Android 5.0 / Lollipop, ini disebut PDFRenderer .


Tautan ke "PDFRenderer" rusak.
Nate

@Nate terima kasih telah Membawa ini ke perhatian saya, saya benar-benar menghargainya, saya telah memperbarui tautannya, Karena penyaji PDF adalah API android asli, mereka telah memindahkan barang-barang di situs web, jadi di masa depan jika tautan yang diperbarui rusak lagi itu akan terjadi terbaik untuk mencari di situs pengembang Android.
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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.