HarmonyOS鸿蒙Next中Vue项目使用pdfjs时,如何让web组件支持file://读取文件并兼容web worker?
HarmonyOS鸿蒙Next中Vue项目使用pdfjs时,如何让web组件支持file://读取文件并兼容web worker? Vue项目中使用到了pdfjs,用到了web worker,请问是否有办法让web组件支持file://读取文件时,支持web worker?
为了加载安全,在ArkWeb内核中,不允许 file 协议或者 resource 协议访问 URL 上下文中来自跨域的请求,因此在使用 Web 组件加载本地离线资源的时候,Web 组件针对 file 协议和 resource 协议会进行跨域访问的拦截。
可以通过解决方案为构造虚拟域名,通过加载域名的方式进行规避,详见:https://gitee.com/openharmony/docs/pulls/40014/files
import web_webview from '@ohos.web.webview';
@Entry
@Component
export default struct MarkingPaper {
webController: web_webview.WebviewController = new web_webview.WebviewController();
// 构造域名和本地文件的映射表
schemeMap = new Map([
["https://www.example.com/index.html", "index.html"],
["https://www.example.com/assets/index-xxx.js", "assets/index-xxxx.js"],
["https://www.example.com/assets/polyfills-xxxx.js", "assets/polyfills-legacy-xxx.js"],
["https://www.example.com/assets/index-legacy-xxx.js", "assets/index-legacy-xxx.js"],
["https://www.example.com/assets/index-xxx.css", "assets/index-xxx.css"],
])
// 构造本地文件和构造返回的格式mimeType
mimeTypeMap = new Map([
["index.html", 'text/html'],
["assets/index-xxx.js", "text/javascript"],
["assets/polyfills-xxxx.js", "text/javascript"],
["assets/index-xxxx.js", "text/javascript"],
["assets/index-xxx.css", "text/css"],
])
build() {
Stack({ alignContent: Alignment.Top }) {
Web({ src: 'https://www.example.com/index.html', controller: this.webController })
.domStorageAccess(true)
.mixedMode(MixedMode.All)
.width('100%')
.height('100%')
.onInterceptRequest((event) => {
if (!event) {
return;
}
// 此处匹配自己想要加载的本地离线资源,进行资源拦截替换,绕过跨域
if (this.schemeMap.has(event.request.getRequestUrl())) {
let rawfileName: string = this.schemeMap.get(event.request.getRequestUrl())!;
let mimeType = this.mimeTypeMap.get(rawfileName);
if (typeof mimeType === 'string') {
let response = new WebResourceResponse();
// 构造响应数据,如果本地文件在rawfile下,可以通过如下方式设置
response.setResponseData($rawfile(rawfileName));
response.setResponseEncoding('utf-8');
response.setResponseMimeType(mimeType);
response.setResponseCode(200);
response.setReasonMessage('OK');
response.setResponseIsReady(true);
return response;
}
}
return null;
})
}
}
}
也可以使用Web组件的PDF文档预览能力:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/web/web-pdf-preview.md
可借助于三方库pdfjs预览,具体可参考:https://gitee.com/openharmony-tpc/pdfViewer,
链接内有完整的工程,可以直接运行:https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/feature/webpdfviewer
更多关于HarmonyOS鸿蒙Next中Vue项目使用pdfjs时,如何让web组件支持file://读取文件并兼容web worker?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,若要在Vue项目中使用pdfjs并让web组件支持file://协议读取文件,同时兼容Web Worker,可以按照以下步骤操作:
-
配置Web组件:在鸿蒙Next中,Web组件默认不支持
file://协议。需要在config.json中配置Web组件的fileAccess属性为true,以允许访问本地文件。 -
使用Web Worker:在Vue项目中,确保pdfjs的Web Worker脚本路径正确。可以通过
pdfjs-dist库的workerSrc属性设置Web Worker的路径。例如:import * as pdfjsLib from 'pdfjs-dist'; pdfjsLib.GlobalWorkerOptions.workerSrc = 'path/to/pdf.worker.js'; -
处理文件路径:在Vue组件中,使用
file://协议加载PDF文件时,确保路径正确。可以通过@ohos.file.fs模块获取文件路径,并将路径转换为file://格式。 -
兼容性处理:在鸿蒙Next中,Web Worker与主线程的通信需要确保兼容性。可以在Web Worker脚本中使用
postMessage和onmessage进行数据传递,确保pdfjs在主线程和Web Worker之间的通信正常。 -
测试与调试:在开发过程中,使用鸿蒙Next的调试工具检查Web组件的文件读取和Web Worker的运行情况,确保功能正常。
通过以上步骤,可以在鸿蒙Next的Vue项目中实现pdfjs对file://协议的支持,并兼容Web Worker。
在HarmonyOS鸿蒙Next中,Vue项目使用pdfjs时,要让web组件支持file://读取文件并兼容web worker,需注意以下几点:
-
跨域问题:file://协议通常存在跨域限制,需确保pdfjs库支持本地文件读取。可以通过修改pdfjs源码或配置本地服务器来绕过限制。
-
Web Worker路径:Web Worker脚本需通过file://加载,需确保路径正确。可使用pdfjs-dist的workerSrc属性设置Worker路径。
-
安全策略:鸿蒙系统可能有严格的安全策略,需在应用配置中允许file://协议的使用。
-
兼容性测试:在不同设备和鸿蒙版本上测试,确保功能正常。

