首页 > 解决方案 > 动态 URL PDF 在 WebView 中显示为“无可用预览”

问题描述

只有在访问了几乎所有 Stack Overflow 链接以获得相同的答案之后,我才不得不写这个,

我正在尝试在WebView. 我知道它WebView不支持正常显示 PDF,所以我使用其他答案中建议的 G-Drive URL 扩展名。此外,业务团队要求在我们的应用程序本身中打开 PDF,这样我就无法启动Intent其他 PDF 查看器。我下载了 PdfViewer 库,但它使 APK 的大小大大超出了预期。

这个 URL 实际上是一个 GET 请求。每次我点击请求时,服务器都会根据请求参数在运行时生成 PDF 并立即返回它,而不会将其存储在服务器上。

PDF 网址:

http://server_ip_number/pata/retail/v4/reports_pdf?search=Test&min_amount=0.0&max_amount=0.0(出于安全原因不能透露IP地址)

此请求还需要一些用于 auth 的标头,我将在下面详细发布。

这就是我目前正在做的事情;

class AllUsersWebViewActivity : BaseActivity() {


    private val pdfActualUrl = "https://drive.google.com/viewerng/viewer?embedded=true&url=http://server_ip_number/pata/retail/v4/reports_pdf?search=Test&min_amount=0.0&max_amount=0.0"

    //This random dummy URL opens perfectly, it does not need any headers or GET params, just normal `loadUrl()` works.
    private val workingDummyUrl = "https://drive.google.com/viewerng/viewer?embedded=true&url=https://mindorks.s3.ap-south-1.amazonaws.com/courses/MindOrks_Android_Online_Professional_Course-Syllabus.pdf"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_all_users_report_web_view)
        wv_web.settings.javaScriptEnabled = true
        wv_web.clearCache(true)
        wv_web.loadUrl(URLEncoder.encode(pdfUrl, "ISO-8859-1"), mapOf( //map of necessary headers 
                "Authorization" to "Auth_TOKEN",
                "VersionId" to "1.0.0",
                "companyID" to "2",
                "DeviceId" to "my_device_id",
                "token" to "SECURE_TOKEN"
        ))
    }

笔记:

  1. 当我在 PostMan 上使用标题和参数点击上述 GET 请求时,它会立即下载 PDF 文件。

  2. DownloadManager我使用所有标题和参数尝试了相同的 GET 请求, PDF 文件已成功下载

但是当我尝试它时,WebView它只会显示No Preview Available.

我究竟做错了什么?

标签: androidgetandroid-webview

解决方案


您提供的标头最多会影响 Google 的 Web 服务器对https://drive.google.com/viewerng/viewer请求的行为。Google 不会将这些信息传递给其他服务器http://server_ip_number/pata/retail/v4/reports_pdf


推荐阅读