Ionic4+Capacitor+pdfMake生成PDF在Android模拟器打开提示格式无效求助
解决Capacitor中pdfMake生成的PDF无法打开的问题
嘿,我帮你排查了下代码和问题描述,你遇到的“PDF格式无效”问题主要是两个关键错误导致的,咱们一步步来修复:
1. 错误的文件编码设置
你在Filesystem.writeFile里用了encoding: FilesystemEncoding.ASCII,这完全搞错了!Base64编码的二进制数据必须用FilesystemEncoding.BASE64来写入,ASCII编码会直接破坏Base64的结构,导致生成的文件彻底损坏。
2. 未处理pdfMake返回的Base64前缀
pdfMake的getBase64方法返回的字符串默认带有data:application/pdf;base64,这样的前缀,这个前缀属于URI标识,不是PDF文件的有效内容,必须先去掉再写入,否则阅读器会识别到无效的开头字符,判定文件格式错误。
修复后的完整代码
// 获取并处理Base64数据(移除前缀) this.pdfObj.getBase64((data) => { // 拆分字符串,只保留真正的Base64内容 this.pdfBase64 = data.split('base64,')[1]; console.log(this.pdfBase64); }); downloadPdf() { const { Filesystem } = Plugins; if (this.plt.is('cordova')) { console.log('3'); const fileName = 'defectreport.pdf'; try { Filesystem.writeFile({ path: fileName, data: this.pdfBase64, directory: FilesystemDirectory.Data, // 修正为BASE64编码 encoding: FilesystemEncoding.BASE64 }).then((writeFileResult) => { console.log('File Written'); Filesystem.getUri({ directory: FilesystemDirectory.Data, path: fileName }).then((getUriResult) => { console.log(getUriResult); const path = getUriResult.uri; this.fileOpener.open(path, 'application/pdf') .then(() => console.log('File is opened')) .catch(error => console.log('Error opening file', error)); }, (error) => { console.log(error); }); }); console.log('writeFile complete'); } catch (error) { console.error('Unable to write file', error); } } }
额外验证建议
- 可以先把处理后的
pdfBase64字符串复制出来,用在线Base64转PDF工具验证,确认数据本身是有效的 - 写入文件后,用
Filesystem.readFile读取回来对比Base64数据,排查写入过程是否有损坏
另外提一句:如果你的Capacitor版本是3及以上,其实已经支持直接写入Blob了,但如果你还在用旧版本,上面的Base64处理方案是最稳妥的。
内容的提问来源于stack exchange,提问作者MadMac
相关产品推荐
相关产品推荐

