【问题标题】:How to show PDF file from URL and show in WebView如何从 URL 显示 PDF 文件并在 WebView 中显示
【发布时间】:2017-11-02 10:54:51
【问题描述】:

我有一个 recyleView,它在单击账单时显示客户账单列表我需要显示详细账单(账单 Url - 当浏览器上的 URL 将其下载为 PDF 时 - 需要进行身份验证)我使用下面的代码下载PDF,我可以你PDF正在下载我的问题

a) 我如何在 webView 中显示它

b) 有没有其他方法可以在不下载/写入外部导演的情况下向用户展示此 PDF

 if(ContextCompat.checkSelfPermission(getActivity(),
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
                    webView.setDownloadListener(new DownloadListener() {

                        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
                            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                            request.setMimeType(mimeType);
                            //------------------------COOKIE!!------------------------
                            String cookies = CookieManager.getInstance().getCookie(url);
                            request.addRequestHeader("cookie", cookies);
                            //------------------------COOKIE!!------------------------
                            request.addRequestHeader("User-Agent", userAgent);
                            request.setDescription("Downloading file...");
                            request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                            request.allowScanningByMediaScanner();
                            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimeType));
                            DownloadManager dm = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
                            dm.enqueue(request);
                            Toast.makeText(getActivity().getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
                        }
                    });

                }else{
                    if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                        Toast.makeText(getActivity(),
                                "External storage permission required to save billing statements",
                                Toast.LENGTH_SHORT).show();
                    }
                    requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            REQUEST_EXTERNAL_STORAGE_RESULT);
                }

【问题讨论】:

    标签: android webview


    【解决方案1】:

    如何在 webView 中显示此内容

    WebView 没有呈现 PDF 的本机能力。您可以使用 Mozilla 的 PDF.jsWebView 中呈现 PDF,但这仅适用于 Android 4.4+,并且需要对 PDF.js 本身进行一些小的调整。

    有没有其他方法可以在不下载/写入外部导演的情况下向用户显示此 PDF

    您可以将其下载到内部存储(例如,getFilesDir()getCacheDir()),通过FileProvider 提供文件,并使用ACTION_VIEW 允许用户使用他们首选的 PDF 查看器查看 PDF。

    对于 Android 5.0+ 上的有限 PDF,Android SDK 中有 PdfRendererpdfium 可用于 Android,但它相当大。有关 PDF 查看选项的更多信息,请参阅this blog post

    您还可以研究商业 PDF 渲染库。

    【讨论】:

    • 感谢您指向您的博客文章,如果我理解正确,如果 webView 无法呈现此 PDF,我可以使用 Retrofit Client 下载文件并使用 ActionView 显示文件,这里不需要 webView
    • @Sam:是的,您可以使用 Retrofit 和 ACTION_VIEW 让用户查看 PDF 文件。如果您不想将 PDF 保存在外部存储中,请将其下载到内部存储并使用 FileProvider 获取 Uri 以与 ACTION_VIEW 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多