मैं एक वेबव्यू में एक पीडीएफ दस्तावेज़ कैसे प्रदर्शित कर सकता हूं?


115

मैं वेब सामग्री पर पीडीएफ सामग्री प्रदर्शित करना चाहता हूं। यहाँ मेरा कोड है:

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

मुझे एक खाली स्क्रीन मिल रही है। मैंने इंटरनेट की अनुमति भी निर्धारित की है।

जवाबों:


170

आप अपने PDF को ऑनलाइन पढ़ने के लिए Google PDF Viewer का उपयोग कर सकते हैं:

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
हाय सुनीत, अब तक यदि आप पीडीएफ पढ़ना चाहते हैं, तो आपको अपने एंड्रॉइड फोन पर एक पीडीएफ रीडर स्थापित करना होगा, या पीडीएफ ऑनलाइन रेंडर करने के लिए वेबव्यू का उपयोग करना होगा। क्षमा करें, लेकिन हम पीडीएफ ऑफ़लाइन पढ़ने के लिए दूसरी विधि का उपयोग नहीं कर सकते हैं।
प्रतिपक्षी

45
2 दिनों तक लगातार परीक्षण करने के बाद, मुझे Google डॉक्स पर एक त्रुटि मिली You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format....। इसलिए विश्वसनीय नहीं लगता।
शोभित पुरी

4
डॉक्स url अब ड्राइव पर पुनर्निर्देशित कर रहा है: " drive.google.com/viewerng/viewer?embedded=true&url= "
मर्फी

31
यह समाधान बिल्कुल भयानक है। तथ्य यह है कि आप में से कई अपने app में इस बदसूरत कुछ डाल पर विचार मुझे चिंतित करता है। यह पेज डेस्कटॉप के लिए बनाया गया है। यह साइट डेस्कटॉप के लिए स्पष्ट रूप से अनुकूलित है। मोबाइल पर इसका उपयोग करना एक अच्छा मोबाइल अनुभव नहीं है।
CLU

3
यदि आप ऑफ़लाइन हैं तो क्या होगा?
यरिलबिल्बिन

36

यदि आप केवल यूआरएल दृश्य का उपयोग करते हैं तो उपयोगकर्ता को वहां Google खाते में प्रवेश करने के लिए प्रेरित नहीं किया जाता है।

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

9

Google डॉक्स का उपयोग करके एक पीडीएफ खोलना उपयोगकर्ता अनुभव के मामले में एक बुरा विचार है। यह वास्तव में धीमी और अनुत्तरदायी है।

एपीआई 21 के बाद समाधान

Api 21 के बाद से, हमारे पास PdfRenderer है जो एक पीडीएफ को Bitmap में बदलने में मदद करता है। मैंने इसका कभी उपयोग नहीं किया है लेकिन यह काफी आसान है।

किसी भी एपीआई स्तर के लिए समाधान

अन्य समाधान पीडीएफ डाउनलोड करना है और इसे एक समर्पित पीडीएफ ऐप के इरादे से पारित करना है जो इसे प्रदर्शित करने वाला एक धमाकेदार काम करेगा। तेज और अच्छा उपयोगकर्ता अनुभव, खासकर अगर यह सुविधा आपके ऐप में केंद्रीय नहीं है।

पीडीएफ को डाउनलोड करने और खोलने के लिए इस कोड का उपयोग करें

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

}

काम करने के इरादे के लिए, आपको फ़ाइल खोलने के लिए प्राप्त एप्लिकेशन को अनुमति देने के लिए एक FileProvider बनाने की आवश्यकता है ।

यहाँ आप इसे कैसे लागू करते हैं: अपने घोषणापत्र में:

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

अंत में संसाधनों की फाइलर में एक file_paths.xml फ़ाइल बनाएँ

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

आशा है कि यह मदद करता है =)


1
Share_pdf परिसंपत्तियों के तहत एक निर्देशिका है?
कोडजॉम्बी

1
यह एक अच्छा उपाय है।
कोडजॉम्बी

9

इस कोड का उपयोग करें:

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

@ एथीरा किदिलम का उत्तर
सैमविनेशेयर यहाँ

7

यहाँ प्रगति के साथ लोड करें। WebClient देने की आवश्यकता है अन्यथा यह ब्राउज़र में खोलने के लिए मजबूर करता है:

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

मैं वेबवार्ता में पीडीएफ के लिए खोज सुविधा को कैसे सक्षम कर सकता हूं
अनंत शाह

4

आप मोज़िला pdf.js परियोजना का उपयोग कर सकते हैं । मूल रूप से यह आपको पीडीएफ दिखाएगा। उनके उदाहरण पर एक नज़र डालें ।

मैं केवल ब्राउज़र (डेस्कटॉप और मोबाइल) पर इसका उपयोग करता हूं और यह ठीक काम कर रहा है।


hi @paulo क्या आप मुझे उदाहरण दे सकते हैं कि Android के साथ इसका उपयोग कैसे करें?
खालिद अलसयेद

1
@KhalidElSayed मुझे लगता है कि बुटेलो ने आपके उद्देश्य में आत्महत्या कर ली है: stackoverflow.com/a/21383356/505893
नीले रंग

क्या pdf.js का स्थानीय रूप से उपयोग किया जा सकता है? मेरा मतलब है कि इसका उपयोग ऐसे एप्लिकेशन में किया जा सकता है जिसका उपयोग LAN में बिना इंटरनेट एक्सेस के किया जाता है, लेकिन स्थानीय सर्वर के साथ संचार करता है?
कोडजॉम्बरी

2

वास्तव में सभी समाधान काफी जटिल थे, और मुझे वास्तव में सरल समाधान मिला (मुझे यकीन नहीं है कि यह सभी एसडीके संस्करणों के लिए उपलब्ध है)। यह एक पूर्वावलोकन विंडो में पीडीएफ दस्तावेज़ को खोलेगा जहाँ उपयोगकर्ता दस्तावेज़ को देखने और सहेजने / साझा करने में सक्षम है:

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 वर्ग के लिए मुझे उदाहरण कोड दे सकते हैं
mohammedragabmohammedborik

@mohammedragabmohammedborik DownloadListener वर्ग एंड्रॉइड में शामिल है, आपको ऊपर दिए गए कोड को चलाने के लिए किसी अतिरिक्त वर्ग की आवश्यकता नहीं है।
डायोन

2
ध्यान दें कि ACTION_QUICK_VIEW केवल Android N और ऊपर की ओर से समर्थित है।
कद्दू

@pumpkee तुम सही हो, कि मेरे मामले में एक समस्या है। मैंने ऊपर कोड जोड़ा है कि यह जांचता है कि क्विक व्यू उपलब्ध है या नहीं। अन्यथा इसे ब्राउज़र में खोला जाएगा।
डायोन

0

यहां से सोर्स कोड डाउनलोड करें ( वेबवॉच में पीडीएफ खोलें )

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

आप एक Google ड्राइव फ़ाइल खोल रहे हैं, जो डिवाइस के एसडी कार्ड पर एक की तरह कोई पीडीएफ नहीं है
OneCricketeer

हां इस डेमो में मैं Google ड्राइव पीडीएफ फाइल दिखा रहा हूं। अगर आप sdcard से अपना pdf दिखाना चाहते हैं तो इस डेमो को देखें। deepshikhapuri.wordpress.com/2017/04/24/…
दीपशिखा पुरी

0

यह वास्तविक उपयोग की सीमा है जो Google आपको टिप्पणियों में उल्लिखित त्रुटि प्राप्त करने से पहले अनुमति देता है , यदि यह जीवनकाल के पीडीएफ में एक बार है कि उपयोगकर्ता ऐप में खुल जाएगा तो मैं इसे पूरी तरह से सुरक्षित महसूस करता हूं। यद्यपि एंड्रॉइड 5.0 / लॉलीपॉप से ​​एंड्रॉइड में अंतर्निहित ढांचे का उपयोग करके मूल दृष्टिकोण का पालन करने की सलाह दी जाती है, इसे पीडीएफ फाइलर कहा जाता है ।


"PDFRenderer" का लिंक टूट गया है।
नट

@ मेरे ध्यान में इसे लाने के लिए धन्यवाद, मैं वास्तव में इसे स्पष्ट करता हूं, मैंने लिंक को अपडेट कर दिया है, चूंकि पीडीएफ रेंडरर एक देशी एंड्रॉइड एपीआई है, इसलिए उन्होंने वेबसाइट में चीजों को स्थानांतरित कर दिया है, इसलिए भविष्य में यदि अपडेट किया गया लिंक फिर से टूट गया है तो यह होगा। 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.