PhoneGap安卓应用使用jsPDF生成PDF报错:LocalFileSystem未定义
解决PhoneGap安卓应用中LocalFileSystem is not defined的问题
我明白你现在遇到的困境——网页端正常运行的PDF生成逻辑,到了安卓模拟器里就因为LocalFileSystem未定义报错。别着急,这是Cordova/PhoneGap应用里很常见的问题,主要是两个关键点没处理好,我来一步步帮你解决:
问题根源
- 缺少Cordova File插件:
LocalFileSystem这个对象并不是原生API,而是由Cordova的cordova-plugin-file插件提供的,没安装插件的话自然找不到这个变量。 - 未等待deviceready事件:Cordova的所有原生设备API(包括文件系统)必须在
deviceready事件触发后才能调用,网页端浏览器可能有环境模拟,但安卓模拟器里必须等这个事件确认设备就绪。
解决步骤
1. 安装Cordova File插件
首先在你的项目根目录下运行命令安装插件:
cordova plugin add cordova-plugin-file
安装完成后,记得重新构建安卓项目:
cordova build android
2. 调整代码逻辑,等待deviceready事件
把你的PDF生成和文件保存逻辑放在deviceready事件的回调里,同时注意jsPDF输出格式的转换——直接用doc.output()得到的是base64字符串,而Cordova的文件写入器更适合处理Blob对象,所以我们改用doc.output('blob')来获取正确的格式。
修改后的完整代码:
document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { console.log("设备已就绪,可以调用Cordova API了"); // 生成PDF文档 console.log("generating pdf..."); var doc = new jsPDF(); doc.text(20, 20, 'HELLO!'); doc.setFont("courier"); doc.setFontType("normal"); doc.text(20, 30, 'This is a PDF document generated using JSPDF.'); doc.text(20, 50, 'YES, Inside of PhoneGap!'); // 获取Blob格式的PDF输出 var pdfBlob = doc.output('blob'); console.log("PDF Blob已生成"); // 保存到设备本地文件系统 console.log("开始操作文件系统..."); window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) { console.log("文件系统名称:", fileSystem.name); console.log("根目录路径:", fileSystem.root.fullPath); fileSystem.root.getFile("test.pdf", {create: true, exclusive: false}, function(entry) { console.log("找到/创建文件:", entry.fullPath); entry.createWriter(function(writer) { writer.onwriteend = function(evt) { console.log("PDF文件写入成功!"); }; writer.onerror = function(evt) { console.error("写入错误:", evt.target.error.code); }; console.log("开始写入文件..."); writer.write(pdfBlob); }, function(error) { console.error("创建文件写入器失败:", error); }); }, function(error){ console.error("获取文件失败:", error); }); }, function(error){ console.error("请求文件系统失败:", error.code); }); }
3. 测试注意事项
- 确保模拟器已经正确加载了最新构建的应用,不要用旧的缓存包
- 可以在Chrome开发者工具里通过
chrome://inspect连接模拟器,查看控制台日志,方便调试
这样修改后,你的应用应该就能在安卓模拟器里正常生成并保存PDF文件了。
内容的提问来源于stack exchange,提问作者Nancy
相关产品推荐
相关产品推荐

