我用的DevEco Studio版本:4.0
项目工程API版本:API9
本地模拟器:API9
参考:鸿蒙使用pdf.js加载pdf的方案和其定制化_jspdf 鸿蒙手机
我这里参考博主的最后一种方式使用pdf.js加载沙箱路径下pdf
这个pdf就可以预览
然后换了个pdf文件,如下
就报错了,然后啥也不显示,但是两个pdf我都是按照同样方法生成的
最后找出了原因:由于某些pdf数据长度过长导致webview参数传递错误,那么就可以考虑将过长的数据进行分割 ,一段一段的数据传递给html,最后在html中进行数据的拼接就可以了。
Arkts文件部分代码:
let base64 = new util.Base64Helper();
let data = base64.encodeSync(value)
console.info(`data长度:${data.length}`)
console.info(`data:${data}`)
let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true,fatal:true })
let retStr = textDecoder.decodeWithStream(data, { stream: false });
let lenth=retStr.length
let startindex=0
while(lenth>=35000)
{
var str=retStr.substring(startindex,startindex+35000)
this.webviewController.runJavaScript(`reciveData("${str}")`)
.catch((reason)=>{
console.info(`&&${reason}`)
})
startindex+=35000
lenth-=35000
}
if(lenth>0)
{
var lastStr=retStr.substring(startindex,retStr.length)
this.webviewController.runJavaScript(`reciveData("${lastStr}")`)
.catch((reason)=>{
console.info(`&&${reason}`)
})
}
this.webviewController.runJavaScript(`openFile()`)
.catch((reason)=>{
console.info(`&&${reason}`)
})
viewer.html添加代码
<script type="text/javascript">
var s=""
function reciveData(code){
s+=code
}
function base64ToBlob(base64) {
var bstr = atob(base64),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: "application/pdf",
});
}
function blobToFile(blob, fileName) {
return new File([blob], fileName);
}
function openFile() {
//base64转File对象
let fileName="test.pdf"
let blob = base64ToBlob(s)
let file = blobToFile(blob,fileName)
PDFViewerApplication.open({
url: URL.createObjectURL(file),
originalUrl: file.name
});
}
</script>
但是不知道为何总感觉展示的展示的pdf字体有点小