pdf 문서를 Webview에 어떻게 표시 할 수 있습니까?


115

웹뷰에 pdf 내용을 표시하고 싶습니다. 내 코드는 다음과 같습니다.

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

Google PDF 뷰어를 사용하여 온라인에서 PDF를 읽을 수 있습니다.

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
안녕하세요, 지금까지 PDF를 읽으려면 Android 폰에 PDF 리더를 설치하거나 웹뷰를 사용하여 PDF 파일을 온라인으로 렌더링해야합니다. 죄송합니다. 두 번째 방법으로 PDF를 오프라인으로 읽을 수 없습니다.
anticafe 2011-06-06

45
2 일 동안 지속적으로 테스트 한 후 Google 문서에서라는 오류가 발생했습니다 You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... 따라서 신뢰할 수없는 것 같습니다.
Shobhit Puri 2014

4
워드 프로세서 URL은 이제 드라이브로 리디렉션됩니다 : " drive.google.com/viewerng/viewer?embedded=true&url= "
머피

31
이 솔루션은 절대적으로 끔찍합니다. 많은 분들이 앱에 이렇게 추한 것을 넣는 것을 고려하고 있다는 사실이 저를 걱정합니다. 이 페이지는 데스크톱 용으로 설계되었습니다. 이 사이트는 분명히 데스크톱에 최적화되어 있습니다. 모바일에서 이것을 사용하는 것은 좋은 모바일 경험이 아닙니다.
clu 2019-04-29

3
오프라인 상태라면 어떨까요?
yerlilbilgin 19 년

36

보기 전용 URL을 사용하는 경우 사용자는 Google 계정에 로그인하도록 제안되지 않습니다.

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

9

Google 문서를 사용하여 PDF를 여는 것은 사용자 경험 측면에서 나쁜 생각입니다. 정말 느리고 반응이 없습니다.

API 21 이후 솔루션

api 21 이후 로 pdf를 Bitmap으로 변환하는 데 도움 이되는 PdfRenderer 가 있습니다 . 나는 그것을 사용한 적이 없지만 충분히 쉬운 것 같습니다.

모든 API 레벨을위한 솔루션

다른 해결책은 PDF를 다운로드하고 Intent를 통해 전용 PDF 앱으로 전달하여이를 표시하는 작업을 수행하는 것입니다. 특히이 기능이 앱의 중심이 아닌 경우 빠르고 좋은 사용자 경험.

이 코드를 사용하여 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가 작동 하려면 수신 앱에 파일을 열 수있는 권한을 부여 하는 FileProvider 를 만들어야 합니다.

이를 구현하는 방법은 다음과 같습니다. 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>

마지막으로 리소스 폴더에 file_paths.xml 파일을 만듭니다.

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

희망이 =)


1
shared_pdf는 자산 아래의 디렉토리입니까?
codezombie dec.

1
이것은 좋은 해결책입니다.
codezombie

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

@Athira의 kidilam 답변
여기 Samwinishere

7

여기서 progressDialog를로드합니다. 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);

웹보기에서 PDF 검색 기능을 활성화하려면 어떻게해야합니까?
Anant Shah

4

Mozilla pdf.js 프로젝트를 사용할 수 있습니다 . 기본적으로 PDF를 보여줍니다. 그들의 예를보십시오 .

브라우저 (데스크톱 및 모바일)에서만 사용하고 잘 작동합니다.


안녕 @paulo 당신은 안드로이드와 함께 이것을 사용하는 방법에 대한 예를 제공해 주시겠습니까?
Khalid ElSayed 2014-06-02

1
@KhalidElSayed 나는 butelo가 당신의 목표에 성공했다고 생각합니다 : stackoverflow.com/a/21383356/505893
푸르스름한

pdf.js를 로컬에서 사용할 수 있습니까? 인터넷 액세스가없는 LAN에서 사용되지만 로컬 서버와 통신하는 응용 프로그램에서 사용할 수 있습니까?
codezombie

2

실제로 모든 솔루션이 매우 복잡했고 정말 간단한 솔루션을 찾았습니다 (모든 SDK 버전에서 사용할 수 있는지 확실하지 않습니다). 사용자가 문서를보고 저장 / 공유 할 수있는 미리보기 창에서 pdf 문서가 열립니다.

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

(코 틀린)


1
DownloadListener 클래스 나에게 예제 코드를 제공 할 수 있습니다
mohammedragabmohammedborik

@mohammedragabmohammedborik DownloadListener 클래스는 Android에 포함되어 있으므로 위 코드를 실행하기 위해 추가 클래스가 필요하지 않습니다.
Dion 19

2
ACTION_QUICK_VIEW는 Android N 이상에서만 지원됩니다.
pumpkee

@pumpkee 당신이 맞아요, 제 경우에 문제를 일으켰습니다. 빠른보기를 사용할 수 있는지 확인하는 위의 코드를 추가했습니다. 그렇지 않으면 브라우저에서 열립니다.
Dion

0

여기에서 소스 코드를 다운로드하십시오 ( Webview Android에서 PDF 열기 ).

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

기기의 SD 카드에있는 것과 같은 PDF가 아닌 Google 드라이브 파일을 여는 중입니다
OneCricketeer

예이 데모에서는 Google 드라이브 pdf 파일을 보여줍니다. sdcard에서 pdf를 표시하려면이 데모를 확인하십시오. deepshikhapuri.wordpress.com/2017/04/24/…
Deepshikha Puri

0

이것은 댓글에 언급 된 오류가 발생하기 전에 Google이 허용 하는 실제 사용 제한 입니다 . 사용자가 앱에서 열 수있는 평생 pdf 인 경우 완전히 안전하다고 느낍니다. Android 5.0 / Lollipop에서 Android에 내장 된 프레임 워크를 사용하는 기본 접근 방식을 따르는 것이 좋지만 PDFRenderer 라고 합니다 .


"PDFRenderer"에 대한 링크가 끊어졌습니다.
Nate

@Nate 관심을 가져 주셔서 감사합니다. 정말 감사합니다. 링크를 업데이트했습니다 .PDF 렌더러는 기본 Android API이므로 웹 사이트에서 물건을 옮겼으므로 나중에 업데이트 된 링크가 다시 끊어지면 나중에 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.