HarmonyOS鸿蒙Next华为 Mate 70 Pro系统3.0.0 小程序webview pdfjs使用问题

HarmonyOS鸿蒙Next华为 Mate 70 Pro系统3.0.0 小程序webview pdfjs使用问题 小程序内嵌h5,h5使用pdfjs时报错failed to fetch,安卓和ios正常

5 回复

这确实是一个在 HarmonyOS(鸿蒙)系统上开发 H5 或小程序时比较典型的兼容性问题。

问题核心: pdfjs 报错 failed to fetch,意味着 JavaScript 代码试图通过网络请求(通常是 fetch API)去获取 PDF 文件,但在 HarmonyOS 的 webview 环境中这个请求被拦截、阻止或无法正确执行。而在 Android 和 iOS 上,webview 对本地文件或跨域请求的处理相对宽松或机制不同,所以运行正常。

原因分析:

  1. HarmonyOS Webview 的 Fetch 支持问题: 早期版本的 HarmonyOS webview 对现代 Web API(如 fetch)的支持可能不如 Chrome (Android) 或 WebKit (iOS) 完善,或者存在特定的配置要求。
  2. 文件路径/协议问题:
    • H5 页面通常是加载在 file:// 协议或者是小程序的自定义协议下。
    • pdfjs 尝试加载 PDF 时,如果传入的是相对路径或 file:// 路径,HarmonyOS 的安全策略可能禁止了 fetch 去读取本地文件系统资源。
    • 如果 PDF 是网络资源,可能是跨域(CORS)策略在鸿蒙系统上被更严格地执行了。
  3. 小程序沙箱限制: 如果是在小程序的 web-view 组件中,小程序容器本身对网络请求有白名单限制,且对本地文件访问有严格的沙箱隔离。鸿蒙系统可能对 web-view 内部的 fetch 请求做了额外的拦截。

解决方案建议:

你可以尝试以下几种方案来解决这个问题:

方案一:使用 XMLHttpRequest 替代 fetch (推荐)

pdfjs 内部通常会自动检测环境,但有时在特定环境下检测失效。你可以尝试在引入 pdfjs 之前,强制让环境支持 fetch,或者修改 pdfjs 的加载逻辑。

更直接的方法是,在调用 pdfjs.getDocument() 时,不要直接传 URL,而是先通过其他方式获取数据流。

方案二:将文件转换为 Base64 (最稳妥)

这是解决 webview 本地文件读取问题最通用的办法。

  1. 获取文件流: 在小程序端(鸿蒙侧),通过小程序的文件 API 读取 PDF 文件。
  2. 转 Base64: 将文件内容转换为 Base64 字符串。
  3. 传给 H5: 通过 postMessage 将 Base64 字符串传给 web-view 内的 H5 页面。
  4. 加载: H5 接收到 Base64 后,直接交给 pdfjs 渲染。

H5 代码示例:

// 假设 base64Data 是从小程序传过来的
const loadingTask = pdfjsLib.getDocument({ data: atob(base64Data) });
loadingTask.promise.then(function(pdf) {
  // 渲染逻辑
});

方案三:检查并配置网络白名单与跨域

如果 PDF 是网络文件:

  1. 确保 PDF 的域名已添加到小程序的 requestdownloadFile 合法域名列表中。
  2. 确保服务器端返回了正确的 Access-Control-Allow-Origin: * 头,因为鸿蒙 webview 可能会严格执行 CORS。

方案四:使用 url 参数时的特殊处理

如果你必须使用 URL 加载,尝试将本地文件路径转换为可以通过网络访问的形式(如果可能),或者检查 pdfjs 的版本。较新的 pdfjs 版本对环境的兼容性更好。

总结建议: 考虑到这是鸿蒙 3.0(相对较老的版本)且是在小程序环境中,方案二(Base64 传输) 是成功率最高、兼容性最好的方案,因为它完全绕过了 webview 内部对文件路径和 fetch 网络请求的限制。

更多关于HarmonyOS鸿蒙Next华为 Mate 70 Pro系统3.0.0 小程序webview pdfjs使用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬非常感谢

有没有详细的报错信息

在HarmonyOS Next(3.0.0)小程序WebView中使用pdfjs需注意:WebView需启用JavaScript、允许加载本地资源;pdfjs版本建议≤2.16.105,避免高版本API冲突;部分PDF动态表单或加密文件可能渲染失败,可降级为图片流预览。若文件路径含中文,需先URI编码。

在 HarmonyOS Next 小程序内嵌 H5 使用 pdfjs 出现 failed to fetch,安卓和 iOS 正常,通常是因为 WebView 对 fetch 请求的 CORS 策略更加严格,或对 PDF 文件来源的 URL scheme(如 blob:/data-uri)支持不足。

解决方案

  1. 若 PDF 来自远程 URL,请确保服务端响应头包含 Access-Control-Allow-Origin: * 或匹配的小程序 origin。
  2. 若加载本地文件,避免直接使用 blob URL 传递给 pdfjs,可改用 pdfjsLib.getDocument({ data: arrayBuffer }) 方式,通过小程序 bridge 读取文件数据并转为 ArrayBuffer 传入。
  3. 可尝试在 pdfjs 内部将 fetch 降级为 XMLHttpRequest,因为 HarmonyOS WebView 对 xhr 的跨域支持更完整(修改 pdf.js 中 NetworkManager 的实现)。
回到顶部