HarmonyOs pdf预览

 我用的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字体有点小

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值