0

我想在嵌入 WebView 的应用程序中显示 PDF。 在我想在 URL 中使用获取参数之前,它工作正常。

因此,例如,这很好用:

https://drive.google.com/viewerng/viewer?embedded=true¶m=1&url=http://africau.edu/images/default/sample.pdf

但是,一旦我在给定的 URL 中放置了一个 get 参数,出于安全原因我无法显示,它就不起作用,例如:

https://drive.google.com/viewerng/viewer?embedded=true&url=http://{anydomain}/any.php?args1=1&args2=2

由于给定应用程序的商业模式,下载并显示然后删除 pdf 不是一种选择。由于给定 PDF 中的信息很敏感。我必须从一个 URL 显示一个嵌入的 PDF,无论我在哪里搜索,我都只找到了这个解决方案,谷歌的驱动器嵌入从很多角度来看都是可怕的,但最糟糕的是它不能很好地处理 GET 参数。

有小费吗?

编辑1:

我尝试了 URL 编码。Android 的 WebView 中的结果相同。我在 PC 浏览器中遇到相同的无编码我不认为问题出在编码上吗?

4

3 回答 3

0

对于问题中所述的问题,使用 Google 的代理是错误的解决方案。尽管问题正文指出“不能选择下载并显示然后删除 pdf”,但这实际上是唯一明智的选择:在您的应用程序中嵌入 PDF 渲染器,然后将 PDF 下载到私有应用程序存储中并使用您的内置 -在渲染器中查看它。尽管请记住,仍然可以通过 MITM-ing 设备捕获传输中的文件,或者使用 root 手机在静止状态(当它处于临时存储中时,无论是否私有),从而防止文件保存在设备上(在公共区域)无论如何都不过是令人讨厌的安全剧院。


也就是说,你真的应该对 URI 进行百分比转义。

由于我懒得启动自己的网络服务器,我用Pipedream验证了这一点。我注册了免费计划,打开https://drive.google.com/viewerng/viewer?embedded=true&param=1&url=https://███████████████.m.pipedream.net/blah%3Ffoobar=barfoo%26quux=12345(对应于https://███████████████.m.pipedream.net/blah?foobar=barfoo&quux=12345; 注意转义的?and &),这就是我在控制台中得到的:

Pipedream 控制台的屏幕截图

显然,只要 drive.google.com 端点接收到转义的查询参数,就可以正确传递查询参数。在您的情况下,URL 应该是https://drive.google.com/viewerng/viewer?embedded=true&url=http://{anydomain}/any.php%3Fargs1=1%26args2=2. 如果即使您正确执行了适当的转义,这在您的情况下仍然不起作用,那么您的问题就是其他问题。如果不更详细地了解您的配置,我将无法判断它是什么:这可能是未发送适当的会话 cookie 的问题,或者服务器可能禁止了 Google 的 IP 地址(毕竟,PDF 是由谷歌服务器)。

于 2021-08-10T13:20:19.010 回答
0

要在 webview 中加载 pdf,您必须设置一些 webview 设置。这就是我在 webview 中加载 pdf 的方式。它对我有用:

private fun init() {
        val bundle = intent.extras
        if (bundle != null) {
            pdfFile = bundle.getString(IntentValue.pdfFile)!!
            slug = bundle.getString(IntentValue.title)!!

            webView.scrollBarStyle = View.SCROLLBARS_OUTSIDE_OVERLAY

            webView.settings.javaScriptEnabled = true
            webView.settings.allowFileAccessFromFileURLs = true
            webView.settings.allowUniversalAccessFromFileURLs = true
            webView.settings.builtInZoomControls = true
            webView.settings.javaScriptEnabled = true
            webView.settings.pluginState = WebSettings.PluginState.ON
            webView.settings.domStorageEnabled = true
            webView.settings.loadWithOverviewMode = true

            webView.loadUrl("https://docs.google.com/viewer?url=$pdfFile")

            webView.webViewClient = object : WebViewClient() {
                override fun onPageFinished(view: WebView, url: String) {

                    if (view.title.equals("")) {
                        progress.visibility = View.VISIBLE
                        view.reload()
                    } else {
                        progress.visibility = View.GONE
                    }

                    view.settings.loadsImagesAutomatically = true

                }

                override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
                    if (url!!.endsWith(".pdf")) {
                        val intent = Intent(Intent.ACTION_VIEW)
                        intent.setDataAndType(Uri.parse(url), "application/pdf")
                        try {
                            startActivity(intent)
                        } catch (e: ActivityNotFoundException) {
                        }
                    } else {
                        webView.loadUrl("https://docs.google.com/viewer?url=$pdfFile")
                    }
                    return true
                }

                override fun onReceivedError(
                    view: WebView?,
                    errorCode: Int,
                    description: String?,
                    failingUrl: String?
                ) {
                    toast(description!!)
                }
            }

        }

        if (getStoragePermission()) {
            if (checkDocumentDownloaded("$slug.pdf")) {
                ivDownload.setImageResource(R.drawable.ic_downloaded)
            } else {
                ivDownload.setImageResource(R.drawable.ic_download)
            }
        }

        clickListener()
    }

    private fun checkPageFinished() {
        if (webView.contentHeight === 0) {

            webView.postDelayed(
                {
                    webView.loadUrl("https://docs.google.com/viewer?url=$pdfFile")
                },
                1000
            )
            webView.postDelayed(
                {
                    if (webView.contentHeight === 0) {
                        checkPageFinished()
                    }
                },
                1500
            )
        }
    }
于 2021-08-10T13:33:29.643 回答
-1

您应该对每个参数进行 URL 编码。不能加吗?像你一样

于 2021-08-05T13:40:02.303 回答