首页 > 其他分享 >在鸿蒙中如何实现pdf预览功能?

在鸿蒙中如何实现pdf预览功能?

时间:2024-08-14 16:25:49浏览次数:8  
标签:web 预览 鸿蒙 文件 let pdf webview

在开发鸿蒙App时,你是否做过pdf预览功能,是否也和我一样碰壁了,那么来看看我是如何解决的吧,废话少说,直接上代码。

在鸿蒙中如何实现pdf预览功能?

一、预览本地pdf文件

预览本地的pdf文件很简单,使用Web组件加载即可。
pdf文件目录:harmonyApp\entry\src\main\resources\rawfile\test.pdf
具体代码如下:

import web_webview from '@ohos.web.webview';

@Entry
@Component
struct Index {
  webviewController: web_webview.WebviewController = new web_webview.WebviewController();

  build() {
    Column() {
      // src-本地pdf文件
      Web({ src: $rawfile('test.pdf'), controller: this.webviewController })
        .layoutWeight(1)
        .domStorageAccess(true)
    }
    .height('100%')
  }
}

二、预览线上的pdf文件

这里的线上的pdf文件是指可以在浏览器直接打开预览的pdf文件,还有一种是在浏览器打开是直接进入下载的,那么就需要我们进一步处理了,第三点有详解。
这样的文件预览也很简单,使用Web组件加载即可。
具体代码如下:

import web_webview from '@ohos.web.webview';

@Entry
@Component
struct Index {
  webviewController: web_webview.WebviewController = new web_webview.WebviewController();

  build() {
    Column() {
      // 线上pdf链接
      Web({ src: 'http://www.cztouch.com/upfiles/soft/testpdf.pdf', controller: this.webviewController })
        .layoutWeight(1)
        .domStorageAccess(true)
    }
    .height('100%')
  }
}

三、预览沙箱目录中pdf的文件(重点)

这种就比较麻烦了,有的pdf链接在浏览器打开直接跳转下载不会预览,那么就需要我们下载到沙箱目录中,再预览沙箱目录中的pdf文件。
我这里用到了一个pdfviewer工具,可从我的百度网盘免费获取
拿到文件夹后,放在以下目录:
项目目录:harmonyApp\entry\src\main\resources\rawfile
具体实现代码如下:

import router from '@ohos.router';
import web_webview from '@ohos.web.webview';
import { BusinessError, request } from '@kit.BasicServicesKit';
import showToast from '../../common/utils/ToastUtils';
import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
import { util } from '@kit.ArkTS';

interface IBase64 {
  base64: string;
  fileName: string;
}

@Entry
@Component
struct Index2 {
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  // pdf文件路径
  @State fileUrl: string = ''
  // 本地沙箱文件地址
  @State tempFilePath: string = ''
  // 是否显示按钮
  @State isShowBtn: boolean = true;

  build() {
    Stack() {
      Column() {
        // 页面内容
        Scroll(){
          Column(){
            if(this.tempFilePath){
              if(this.isShowBtn){
                Button('打开文件').onClick(()=>{
                  this.isShowBtn = false;
                })
              }else{
                Web({ src: $rawfile('pdfviewer/viewer.html'), controller: this.controller })
                  .onProgressChange((event)=>{
                    console.log("newProgress", event?.newProgress)
                  })
                  .domStorageAccess(true) // 设置是否开启文档对象模型存储接口(DOM Storage API)权限,默认未开启。
                  .onPageEnd(()=>{
                    let file = this.sandBoxPdfToBase64(this.tempFilePath);
                    this.controller.runJavaScript(`openFile("${file.base64}", "${file.fileName}")`);
                  })
              }
            }
          }.width('100%').height('100%')
        }
        .edgeEffect(EdgeEffect.Fade)
        .width('100%')
        .layoutWeight(1)
        .align(Alignment.TopStart)
      }
      .height('100%')
      .backgroundColor(Color.White)
    }
  }

  // 沙箱pdf文件转base64方法
  sandBoxPdfToBase64(url: string) {
    let file = fs.openSync(url, fs.OpenMode.READ_WRITE); // 打开文件
    let stat = fs.statSync(url); // 获取文件状态
    let buf = new ArrayBuffer(stat.size); // 创建一个ArrayBuffer对象
    let base64 = new util.Base64Helper(); // 实例化Base64Helper
    let num = fs.readSync(file.fd, buf); // 读取文件
    let data = base64.encodeSync(new Uint8Array(buf.slice(0, num))) //  转换成Uint8Array
    let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true })
    let retStr = textDecoder.decodeWithStream(data, { stream: false }); // 可以把Uint8Array转码成base64
    let fileName = file.name
    fs.closeSync(file);
    return { base64: retStr, fileName: fileName } as IBase64;
  }

  // 下载pdf文件,获取沙箱文件目录
  getTempFile(fileUrl:string){
    let context = getContext(this) as common.UIAbilityContext;
    const fileFullName = fileUrl.split('/')[fileUrl.split('/').length - 1]
    let tempFilePath = `${context.filesDir}/${fileFullName}`;
    //文件如果已经存在,就删除
    if (fs.accessSync(tempFilePath)) {
      fs.unlink(tempFilePath)
    }
    request.downloadFile(getContext(), { url: fileUrl,filePath: tempFilePath }).then((data: request.DownloadTask) => {
      let downloadTask: request.DownloadTask = data;
      let progressCallback = (receivedSize: number, totalSize: number) => {
        // 这里可以自行编写下载进度条
        showToast(`下载大小${receivedSize},总大小${totalSize}`);
      };
      let completeCallback = ()=>{
        showToast("下载完毕");
        this.tempFilePath = tempFilePath;
      }
      downloadTask.on('progress', progressCallback);
      downloadTask.on('complete', completeCallback)
    }).catch((err: BusinessError) => {
      console.error(`Failed to request the download. Code: ${err.code}, message: ${err.message}`);
    })
  }

  // 组件生命周期:组件即将出现时回调该接口
  aboutToAppear() {
    console.log('进入页面')
    // 你的pdf链接
    this.fileUrl = (router.getParams() as Record<string, string>).url || '';
    this.getTempFile((router.getParams() as Record<string, string>).url as string);
  }
}

这里附有将pdf文件下载到沙箱目录代码,可选择使用(不必须)。

四、建议

建议在真机查看预览效果,模拟器展示效果不好,初次加载,第一页总是黑的,有大佬知道怎么解决,请指教~~

标签:web,预览,鸿蒙,文件,let,pdf,webview
From: https://blog.csdn.net/twk857857/article/details/141192492

相关文章

  • 启动应用程序出现PdfPreviewHandler.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个PdfPreviewHandler.dll文件(挑选合适的版本......
  • 【专题】2024无人驾驶网约车乘坐意愿调查报告合集PDF分享(附原数据表)
     原文链接:https://tecdat.cn/?p=37335 科技迅猛发展,无人驾驶技术从科幻走进现实,2024年无人驾驶网约车成热议话题。阅读原文,获取专题报告合集全文,解锁文末208份无人驾驶网约车相关行业研究报告。报告表明,近60%受访者期待,00后更积极,80后较谨慎。性别上男性更乐观,城市级别......
  • 小白学习微信小程序的图片处理和预览技巧
    微信小程序的图片处理和预览技巧可以通过使用微信提供的API和组件来实现。在本文中,我们将详细介绍以下几个方面的内容:图片的上传和下载:包括用户上传图片和从服务器上下载图片的方法。图片的编辑和处理:包括图片的裁剪、旋转、缩放等操作。图片的预览和查看:包括在小程序中展示图......
  • PDF编辑不再愁!3个超实用技巧,让你的文档秒变高大上
    在数字化时代,PDF文件因为能在不同设备上保持格式不变,而且不容易被修改,成了我们学习和工作的好帮手。但是,要编辑PDF文件时,我们可能会遇到一些难题。别急,今天我要分享一些超实用的工具,让你的文件用PDF编辑起来既简单又高效。技巧一:OCR技术让图片转文字变得简单福昕全能PDF工具......
  • 破防了!加班狗常用的TOP4 PDF编辑器2024年集锦
    我们天天都得跟一堆文件打交道,尤其是PDF文件。PDF的好处是,不管在哪个设备上打开,内容和格式都保持原样,而且不容易被改。不过,有时候这也让人挺头疼的,因为想改点什么就麻烦了。幸好,技术一直在进步,现在市面上有很多好用的PDF编辑器,它们就像魔法棒,让编辑文档变得轻松又快速。今天,我......
  • PDF编辑不求人!这三款免费版编辑器助你轻松搞定!
    作为一名办公室文员,每天和PDF文件打交道那是家常便饭。打印合同、整理报告、编辑资料,PDF文件简直就是我的工作小伙伴。不过,说起编辑PDF,那可真是个技术活。以前,我总是为这事儿头疼,直到遇见了几款pdf编辑器免费版,简直是让我大开眼界,工作效率也噌噌往上涨!1.福昕PDF编辑器网址:ht......
  • 【鸿蒙学习】HarmonyOS应用开发者基础 - 应用程序框架基础
    从第一节的学习到现在,学习的人数越来越少,要相信,坚持学习下去的将会获得相应的收获。加油少年!!!一、应用框架基础1.应用  用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。一个应用所对应的软件包文件,称为“应用程序包”。2.Module......
  • 【原创软件】第8期:pdf转图片软件FAST_PDF2PNG,可选分辨率快速pdf转图片
    一、背景因为经常处理扫描件,需要将扫描件或者电子书先转为图片进行优化处理。为了省去人工时间,制作了一个软件FAST_PDF2PNG。尽管已经有不少软件可以完成该功能,但是杀鸡焉用牛刀。本工具仅约4M,小巧方便。(优点:速度快,比pdf补丁丁更快,可选分辨率72-1200dpi,含有进度条,多线程处理不卡......
  • 预训练PDF数据格式转换
      大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学习和......
  • 鸿蒙-JS-第二周day01
    数组1什么是数组1)数组是值的有序集合。2)每个值叫做一个元素。3)每个元素在数组中有一个位置,以数字表示,称为索引(有时也称为下标)。4)数组的元素可以是任何类型。5)数组索引从0开始,数组最大能容纳4294967295个元素。2创建数组2.1使用数组直接量//......