Làm cách nào để hiển thị tài liệu pdf thành Chế độ xem web?


115

Tôi muốn hiển thị nội dung pdf trên webview. Đây là mã của tôi:

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

Tôi đang nhận được một màn hình trống. Tôi cũng đã đặt quyền truy cập internet.

Câu trả lời:


170

Bạn có thể sử dụng Trình xem PDF của Google để đọc pdf của mình trực tuyến:

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
Xin chào bạn, cho đến thời điểm hiện tại nếu bạn muốn đọc PDF, bạn phải cài đặt trình đọc PDF trên điện thoại Android của mình hoặc sử dụng webview để hiển thị tệp PDF trực tuyến. Rất tiếc, chúng tôi không thể sử dụng phương pháp thứ hai để đọc PDF ngoại tuyến.
anticafe

45
Sau khi liên tục kiểm tra nó trong 2 ngày, tôi đã gặp lỗi trên Google docs nói You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... Vì vậy, có vẻ không đáng tin cậy.
Shobhit Puri

4
Url của Tài liệu hiện đang chuyển hướng đến Drive: " drive.google.com/viewerng/viewer?embedded=true&url= "
Murphy

31
Giải pháp này là hoàn toàn khủng khiếp. Thực tế là rất nhiều người trong số các bạn cho rằng việc đưa thứ gì đó xấu xí thế này vào ứng dụng của mình khiến tôi lo lắng. Trang này được thiết kế cho máy tính để bàn. Trang web này rõ ràng được tối ưu hóa cho máy tính để bàn. Sử dụng tính năng này trên thiết bị di động không phải là trải nghiệm di động tốt.
clu

3
nếu bạn đang ngoại tuyến thì sao?
yerlilbilgin

36

Nếu bạn sử dụng url chỉ xem, người dùng không được đề xuất đăng nhập vào tài khoản google đó.

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

9

Mở một bản pdf bằng google docs là một ý tưởng tồi về mặt trải nghiệm người dùng. Nó thực sự chậm và không phản hồi.

Giải pháp sau API 21

Kể từ api 21, chúng tôi có PdfRenderer giúp chuyển đổi pdf sang Bitmap. Tôi chưa bao giờ sử dụng nó nhưng nó có vẻ đủ dễ dàng.

Giải pháp cho mọi cấp độ api

Giải pháp khác là tải xuống PDF và chuyển nó qua Intent đến một ứng dụng PDF chuyên dụng sẽ thực hiện công việc hiệu quả hơn khi hiển thị nó. Trải nghiệm người dùng nhanh và tốt, đặc biệt nếu tính năng này không phải là trọng tâm trong ứng dụng của bạn.

Sử dụng mã này để tải xuống và mở 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);
                    }
                }
            });
}

}

Để Intent hoạt động, bạn cần tạo FileProvider để cấp quyền cho ứng dụng nhận mở tệp.

Đây là cách bạn triển khai nó: Trong Manifest của bạn:

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

Cuối cùng tạo tệp file_paths.xml trong tài nguyên foler

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

Hy vọng điều này sẽ giúp =)


1
Shared_pdf là một thư mục trong phần tử?
codezombie

1
Đây là một giải pháp tốt.
codezombie

9

Sử dụng mã này:

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 câu trả lời
Samwinishere đây

7

Tại đây tải với processDialog. Cần cung cấp cho WebClient nếu không nó buộc phải mở trong trình duyệt:

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

Làm thế nào tôi có thể kích hoạt tính năng tìm kiếm pdf trong webview
Anant Shah

4

Bạn có thể sử dụng dự án Mozilla pdf.js. Về cơ bản, nó sẽ hiển thị cho bạn bản PDF. Hãy xem ví dụ của họ .

Tôi chỉ sử dụng nó trên trình duyệt (máy tính để bàn và thiết bị di động) và nó hoạt động tốt.


chào @paulo, bạn có thể vui lòng cung cấp cho tôi ví dụ về cách sử dụng cái này với android không?
Khalid ElSayed

1
@KhalidElSayed Tôi nghĩ rằng butelo đã khuất phục trong mục tiêu của bạn: stackoverflow.com/a/21383356/505893
bluish

Có thể sử dụng pdf.js cục bộ không? Ý tôi là nó có thể được sử dụng trong một ứng dụng được sử dụng trong mạng LAN không có truy cập Internet nhưng giao tiếp với máy chủ cục bộ không?
codezombie

2

Trên thực tế, tất cả các giải pháp đều khá phức tạp và tôi đã tìm thấy một giải pháp thực sự đơn giản (tôi không chắc liệu nó có khả dụng cho tất cả các phiên bản sdk hay không). Nó sẽ mở tài liệu pdf trong cửa sổ xem trước nơi người dùng có thể xem và lưu / chia sẻ tài liệu:

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
có thể cho tôi mã ví dụ cho DownloadListener lớp
mohammedragabmohammedborik

@mohammedragabmohammedborik Lớp DownloadListener được bao gồm trong Android, bạn không cần thêm bất kỳ lớp nào để chạy đoạn mã trên.
Dion

2
Lưu ý rằng ACTION_QUICK_VIEW chỉ được hỗ trợ từ android N trở lên.
pumpkee

@pumpkee Bạn nói đúng, điều đó gây ra sự cố trong trường hợp của tôi. Tôi đã thêm mã ở trên để kiểm tra xem Chế độ xem nhanh có khả dụng hay không. Nếu không, nó sẽ được mở trong trình duyệt.
Dion

0

Tải xuống mã nguồn từ đây ( Mở pdf trong 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();
            }
        });
    }
}

Bạn đang mở một tập tin trên Google Drive, mà không phải là bất kỳ PDF như một trên thẻ SD của thiết bị
OneCricketeer

Có Trong bản demo này, tôi đang hiển thị tệp pdf của Google drive. Nếu bạn muốn hiển thị pdf của mình từ sdcard thì hãy kiểm tra bản trình diễn này. deepshikhapuri.wordpress.com/2017/04/24/…
Deepshikha Puri

0

Đây là giới hạn sử dụng thực tế mà google cho phép trước khi bạn nhận được lỗi được đề cập trong các nhận xét , nếu đó là bản pdf một lần trong đời mà người dùng sẽ mở trong ứng dụng thì tôi cảm thấy nó hoàn toàn an toàn. Mặc dù người ta khuyên bạn nên làm theo cách tiếp cận gốc bằng cách sử dụng khuôn khổ tích hợp sẵn trong Android từ Android 5.0 / Lollipop, nó được gọi là PDFRenderer .


Liên kết đến "PDFRenderer" bị hỏng.
Nate

@Nate cảm ơn bạn đã chú ý đến vấn đề này của tôi Tôi thực sự yêu thích nó, tôi đã cập nhật liên kết, Vì trình kết xuất PDF là một API Android gốc, họ đã di chuyển mọi thứ trong trang web, vì vậy trong tương lai nếu liên kết cập nhật bị hỏng một lần nữa, nó sẽ tốt nhất để tìm kiếm trong trang web của nhà phát triển 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.