You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter离线Viewer加载本地SVF/PDF文件问题求助

Flutter离线Autodesk Viewer本地文件加载解决方案

问题背景

我们正在搭建支持离线Viewer的Flutter应用,按照SVF提取示例将本地URL路径传入options参数时遇到问题。Flutter应用中的JS代码如下:

function initViewer(container) {
     const options = {
     env: "Local",
     document:
     "data/user/0/com.example.../...pdf",
     };
     viewer.start(
        options.document,
        options)

由于WebView组件无法直接访问移动应用的私有文档目录,难以推进此步骤。尝试修改pdf.js文件,但未找到读取本地路径的代码段,希望了解如何将数据字节传入start命令或通过其他方式启动Viewer。

解决思路与步骤

核心是绕开WebView访问私有目录的限制,将本地文件转为WebView可处理的格式传递给Viewer:

1. Flutter端读取本地文件并转为Base64

在Flutter代码中读取目标文件的字节数据,编码为Base64字符串:

import 'dart:convert';
import 'dart:io';

Future<String> convertFileToBase64(String localFilePath) async {
  File targetFile = File(localFilePath);
  List<int> fileBytes = await targetFile.readAsBytes();
  return base64Encode(fileBytes);
}

2. 将Base64数据传递给WebView中的JS

通过WebView的JavaScript通信能力,把Base64字符串传给前端:

// 假设已初始化WebViewController实例
String fileBase64 = await convertFileToBase64("你的应用内文件绝对路径");
await webViewController.evaluateJavascript('loadDocumentFromBase64("$fileBase64")');

3. 前端JS调整Viewer初始化逻辑

修改原有Viewer代码,先初始化实例,再接收Base64数据并转为Blob URL加载:

let viewerInstance;

function initViewer(container) {
  const options = {
    env: "Local"
  };
  // 初始化Viewer但暂不加载文档
  viewerInstance = new Autodesk.Viewing.GuiViewer3D(container);
  viewerInstance.start(options);
}

function loadDocumentFromBase64(base64Str) {
  // 将Base64解码为Uint8Array
  const byteChars = atob(base64Str);
  const byteNumbers = new Array(byteChars.length);
  for (let i = 0; i < byteChars.length; i++) {
    byteNumbers[i] = byteChars.charCodeAt(i);
  }
  const byteArray = new Uint8Array(byteNumbers);
  
  // 根据文件类型设置MIME,PDF用'application/pdf',SVF可对应调整
  const fileBlob = new Blob([byteArray], { type: 'application/pdf' });
  const blobUrl = URL.createObjectURL(fileBlob);
  
  // 加载文档到Viewer
  viewerInstance.loadDocument(blobUrl, { env: "Local" });
}

补充说明

  • 无需修改pdf.js,Autodesk Viewer原生支持通过Blob URL加载文档
  • 如果是SVF格式文件,调整Blob的type参数为对应MIME类型即可
  • 加载完成后可调用URL.revokeObjectURL(blobUrl)释放资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者MiguelG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:12:40