Bir pdf belgesini bir Web görünümünde nasıl görüntüleyebilirim?


115

Web görünümünde pdf içeriğini görüntülemek istiyorum. İşte kodum:

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

Boş bir ekran görüyorum. İnternet iznini de ayarladım.

Yanıtlar:


170

PDF dosyanızı çevrimiçi olarak okumak için Google PDF Görüntüleyiciyi kullanabilirsiniz:

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
merhaba sunit, şimdiye kadar PDF'yi okumak istiyorsanız, Android telefonunuza bir PDF okuyucu yüklemeli veya PDF dosyasını çevrimiçi işlemek için web görünümünü kullanmalısınız. Maalesef PDF'yi çevrimdışı okumak için ikinci yöntemi kullanamayız.
anticafe

45
2 gün boyunca ısrarla test ettikten sonra, Google dokümanlarında bir hata aldım You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... Yani güvenilir görünmüyor.
Shobhit Puri

4
Dokümanlar url'si şimdi Drive'a yeniden yönlendiriliyor: " drive.google.com/viewerng/viewer?embedded=true&url= "
Murphy

31
Bu çözüm kesinlikle korkunç. Birçoğunuzun uygulamanıza bu kadar çirkin bir şey koymayı düşünmesi beni endişelendiriyor. Bu sayfa masaüstü için tasarlanmıştır. Bu site açıkça masaüstü için optimize edilmiştir. Bunu mobil cihazlarda kullanmak iyi bir mobil deneyim değil.
clu

3
ya çevrimdışıysan?
yerlilbilgin

36

Yalnızca görüntüleme url'sini kullanırsanız, kullanıcının orada google hesabına giriş yapması istenmez.

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

9

Google docs kullanarak bir pdf açmak, kullanıcı deneyimi açısından kötü bir fikirdir. Gerçekten yavaş ve tepkisiz.

API 21'den sonraki çözüm

API 21'den beri, bir pdf'i Bitmap'e dönüştürmeye yardımcı olan PdfRenderer'a sahibiz . Hiç kullanmadım ama yeterince kolay görünüyor.

Herhangi bir API seviyesi için çözüm

Diğer bir çözüm, PDF'yi indirmek ve onu görüntüleyen bir banger işi yapacak olan özel bir PDF uygulamasına Intent aracılığıyla iletmektir. Hızlı ve güzel bir kullanıcı deneyimi, özellikle bu özellik uygulamanızın merkezinde değilse.

PDF'yi indirmek ve açmak için bu kodu kullanın

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

}

Niyetin çalışması için, alıcı uygulamaya dosyayı açma izni vermek üzere bir FileProvider oluşturmanız gerekir .

İşte bunu nasıl uygulayacağınız: Manifest'inizde:

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

Son olarak kaynaklar dosyasında bir file_paths.xml dosyası oluşturun

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

Umarım bu yardımcı olur =)


1
Shared_pdf, varlıkların altındaki bir dizin mi?
codezombie

1
Bu güzel bir çözüm.
codezombie

9

Bu kodu kullanın:

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 answer
Samwinishere İşte

7

İşte progressDialog ile yükleyin. WebClient vermeniz gerekir, aksi takdirde tarayıcıda açmaya zorlar:

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

Web görünümünde pdf için arama özelliğini nasıl etkinleştirebilirim
Anant Shah

4

Mozilla pdf.js projesini kullanabilirsiniz . Temel olarak size PDF'yi gösterecektir. Onların bir göz atın örneğin .

Sadece tarayıcıda (masaüstü ve mobil) kullanıyorum ve iyi çalışıyor.


merhaba @paulo, bunun android ile nasıl kullanılacağı konusunda bana bir örnek verebilir misiniz?
Khalid ElSayed

1
@KhalidElSayed Butelo'nun amacınızda başarılı olduğunu düşünüyorum: stackoverflow.com/a/21383356/505893
mavimsi

Pdf.js yerel olarak kullanılabilir mi? Demek istediğim, İnternet erişimi olmayan bir LAN'da kullanılan ancak yerel bir sunucu ile iletişim kuran bir uygulamada kullanılabilir mi?
codezombie

2

Aslında tüm çözümler oldukça karmaşıktı ve gerçekten basit bir çözüm buldum (tüm sdk sürümleri için mevcut olup olmadığından emin değilim). Pdf belgesini, kullanıcının belgeyi görüntüleyebileceği ve kaydedebileceği / paylaşabileceği bir önizleme penceresinde açacaktır:

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
DownloadListener sınıfı için bana örnek kod verebilir
mohammedragabmohammedborik

@mohammedragabmohammedborik DownloadListener sınıfı Android'de bulunmaktadır, yukarıdaki kodu çalıştırmak için herhangi bir ek sınıfa ihtiyacınız yoktur.
Dion

2
ACTION_QUICK_VIEW sürümünün yalnızca android N ve sonraki sürümlerde desteklendiğini unutmayın.
pumpkee

@pumpkee Haklısın, bu benim durumumda bir soruna neden oldu. Hızlı Görünüm'ün kullanılabilir olup olmadığını kontrol etmesi için yukarıdaki kodu ekledim. Aksi takdirde tarayıcıda açılacaktır.
Dion

0

Kaynak kodunu buradan indirin ( pdf'yi web görünümünde android'de açın )

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

Cihazın SD kartındakine benzer PDF olmayan bir Google Drive dosyasını
açıyorsunuz

Evet Bu demoda Google sürücü pdf dosyasını gösteriyorum. Pdf'nizi sdcard'dan göstermek istiyorsanız, bu demoyu kontrol edin. deepshikhapuri.wordpress.com/2017/04/24/…
Puri

0

Bu, Google'ın yorumlarda belirtilen hatayı almadan önce izin verdiği gerçek kullanım sınırıdır , kullanıcının uygulamada açacağı ömür boyu bir pdf ise tamamen güvende hissediyorum. Android 5.0 / Lollipop'tan Android'de yerleşik çerçeveyi kullanarak yerel yaklaşımı izlemeniz tavsiye edilse de, buna PDFRenderer denir .


"PDFRenderer" bağlantısı kesildi.
Nate

@Nate, Bunu dikkatime çektiğiniz için teşekkürler Gerçekten takdir ediyorum, bağlantıyı güncelledim, PDF oluşturucu yerel bir android API olduğu için web sitesindeki şeyleri taşıdılar, bu nedenle gelecekte güncellenmiş bağlantı tekrar kesilirse Android geliştirici web sitesinde arama yapmak en iyisidir.
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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.