web-dev-qa-db-ja.com

pdfドキュメントをWebviewに表示するにはどうすればよいですか?

Pdfコンテンツをwebviewに表示したい。ここに私のコードがあります:

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

空白の画面が表示されます。インターネットの許可も設定しました。

102
shriya

Googleドキュメントビューアーを使用して、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("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
156
anticafe

ビューのみのURLを使用する場合、ユーザーはGoogleアカウントへのログインを求められません。

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

Googleドキュメントを使用してPDFを開くことは、ユーザーエクスペリエンスの観点から悪い考えです。本当に遅くて応答しません。

API 21後のソリューション

API 21以降、PDFをビットマップに変換するのに役立つ 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 を作成して、受信側アプリにファイルを開く許可を付与する必要があります。

実装方法は次のとおりです。マニフェスト内:

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

最後に、リソースfolerでfile_paths.xmlファイルを作成します

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

これがお役に立てば幸いです=)

8
JDenais

ここで、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);
6
Naveen Kumar M

このコードを使用してください:

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

Mozilla pdf.js プロジェクトを使用できます。基本的には、PDFが表示されます。 を見てください。

ブラウザ(デスクトップとモバイル)でのみ使用し、正常に動作しています。

4
Paulo Fidalgo

実際、すべてのソリューションはかなり複雑であり、本当に簡単なソリューションを見つけました(すべてのSDKバージョンで使用できるかどうかはわかりません)。ユーザーがドキュメントを表示および保存/共有できるプレビューウィンドウでPDFドキュメントを開きます。

webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
     val i = Intent(Intent.ACTION_QUICK_VIEW)
     i.data = Uri.parse(url)
     startActivity(i)
})

(コトリン)

0
Dion

これは、実際の使用法です limit コメントで言及されたエラーを取得する前にGoogleが許可しますユーザーがアプリで開く生涯PDF Android 5.0/LollipopのAndroidの組み込みフレームワークを使用してネイティブアプローチに従うことをお勧めしますが、これは PDFRenderer と呼ばれます。

0
war_Hero