HarmonyOS鸿蒙Next中Vue项目使用pdfjs时,如何让web组件支持file://读取文件并兼容web worker?

HarmonyOS鸿蒙Next中Vue项目使用pdfjs时,如何让web组件支持file://读取文件并兼容web worker? Vue项目中使用到了pdfjs,用到了web worker,请问是否有办法让web组件支持file://读取文件时,支持web worker?

3 回复

为了加载安全,在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,可以按照以下步骤操作:

  1. 配置Web组件:在鸿蒙Next中,Web组件默认不支持file://协议。需要在config.json中配置Web组件的fileAccess属性为true,以允许访问本地文件。

  2. 使用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';
    
  3. 处理文件路径:在Vue组件中,使用file://协议加载PDF文件时,确保路径正确。可以通过@ohos.file.fs模块获取文件路径,并将路径转换为file://格式。

  4. 兼容性处理:在鸿蒙Next中,Web Worker与主线程的通信需要确保兼容性。可以在Web Worker脚本中使用postMessageonmessage进行数据传递,确保pdfjs在主线程和Web Worker之间的通信正常。

  5. 测试与调试:在开发过程中,使用鸿蒙Next的调试工具检查Web组件的文件读取和Web Worker的运行情况,确保功能正常。

通过以上步骤,可以在鸿蒙Next的Vue项目中实现pdfjs对file://协议的支持,并兼容Web Worker。

在HarmonyOS鸿蒙Next中,Vue项目使用pdfjs时,要让web组件支持file://读取文件并兼容web worker,需注意以下几点:

  1. 跨域问题:file://协议通常存在跨域限制,需确保pdfjs库支持本地文件读取。可以通过修改pdfjs源码或配置本地服务器来绕过限制。

  2. Web Worker路径:Web Worker脚本需通过file://加载,需确保路径正确。可使用pdfjs-dist的workerSrc属性设置Worker路径。

  3. 安全策略:鸿蒙系统可能有严格的安全策略,需在应用配置中允许file://协议的使用。

  4. 兼容性测试:在不同设备和鸿蒙版本上测试,确保功能正常。

回到顶部