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
相关产品推荐
相关产品推荐

