HarmonyOS 鸿蒙应用开发基础:转换整个PDF文档为图片功能

news2025/12/18 12:20:15

在许多应用场景中,将PDF文档的每一页转换为单独的图片文件是非常有帮助的。这可以用于文档的分享、扫描文档的电子化存档、或者进行进一步的文字识别处理等。本文将介绍如何使用华为HarmonyOS提供的PDF处理服务将整个PDF文档转换为图片,并将这些图片存放在指定的文件夹中。以往想实现这个功能都需要一些收费的插件,现在鸿蒙直接支持。

场景介绍

假设我们有一个PDF文档,想要将其所有的页面转换为图片格式,并且希望每一页都生成一张单独的图片文件。所有生成的图片文件需要存储在一个指定的文件夹中,以便后续的处理和使用。HarmonyOS的PDF服务提供了将PDF文档转换为图片的功能,支持多种图片格式,具体可以参考ImageFormat。

接口说明
接口名描述
convertToImage(path: string, format: ImageFormat, onProgress?: Callback<number>): boolean转换PDF文档为图片。
  • 接口名: convertToImage
  • 描述: 将PDF文档的每一页转换为图片,并存储在指定的目录中。
  • 参数:
    • path: string:指定输出图片的文件夹路径。
    • format: ImageFormat:指定图片的输出格式。
    • onProgress?: Callback<number>:可选参数,用于监听转换进度的回调函数。
示例代码

下面是一个完整的示例代码,演示如何将PDF文档的所有页面转换为PNG格式的图片,并存储在应用的沙箱目录下的output文件夹中。

import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { pdfService } from '@kit.PDFKit';

@Entry
@Component
struct PdfPage {
  private pdfDocument: pdfService.PdfDocument = new pdfService.PdfDocument();
  private context = getContext() as common.UIAbilityContext;
  private loadResult: pdfService.ParseResult = pdfService.ParseResult.PARSE_ERROR_FORMAT;

  aboutToAppear(): void {
    // 确保应用沙箱目录下有input.pdf文档
    let filePath = this.context.filesDir + '/input.pdf';
    this.loadResult = this.pdfDocument.loadDocument(filePath);
  }

  build() {
    Column() {
      // 转换PDF文档的按钮
      Button('convertToImage').onClick(async () => {
        if (this.loadResult === pdfService.ParseResult.PARSE_SUCCESS) {
          // 设置输出路径
          let outputPath = getContext().filesDir + '/output/';
          // 创建输出目录
          fs.mkdir(outputPath);
          
          // 将所有的页面转化为png图片,并存储在output文件夹里
          let res = this.pdfDocument.convertToImage(outputPath, pdfService.ImageFormat.PNG);
          
          // 记录转换结果日志
          hilog.info(0x0000, 'PdfPage', 'convertToImage %{public}s!', res ? 'success' : 'fail');
        }
      })
    }
  }
}
代码解析
  1. 导入必要的模块:首先,我们需要导入一些必要的模块,包括文件IO操作模块fileIo、上下文模块common、日志记录模块hilog,以及PDF处理模块pdfService
  2. 加载PDF文档:在aboutToAppear生命周期方法中,我们通过loadDocument方法加载PDF文档。这里假设PDF文档的路径为应用沙箱目录下的input.pdf
  3. 创建输出目录:在点击按钮触发的事件处理函数中,我们首先检查PDF文档是否成功加载。如果成功,我们将创建一个用于存放输出图片的文件夹,路径为应用沙箱目录下的output文件夹。
  4. 转换为图片:然后,调用convertToImage方法,将PDF文档的所有页面转换为PNG格式的图片,并存放在刚刚创建的output文件夹中。
  5. 日志记录:最后,我们使用hilog.info方法记录转换的结果,以便于调试和日志查看。
转换指定页面为图片

DF文档页面转换为图片,或将页面的指定区域转换为图片时使用。

接口说明
接口名描述
getPagePixelMap(): image.PixelMap获取当前页的图片。
getCustomPagePixelMap(matrix: PdfMatrix, isGray: boolean, drawAnnotations: boolean): image.PixelMap获取指定PdfPage区域的图片内容。
getAreaPixelMap(matrix: PdfMatrix, bitmapwidth: number, bitmapHeight: number, isGray: boolean, drawAnnotations: boolean): image.PixelMap获取指定PdfPage区域的图片内容,并指定图片的宽和高。
示例代码
  1. 调用loadDocument方法加载PDF文档。
  2. 调用getPage方法获取某个页面。
  3. 调用getPagePixelMap或getCustomPagePixelMap方法获取当前页面或者页面区域,这时获取的是image.PixelMap图像类型。
  4. 将image.PixelMap图像类型转化为二进制图片文件并保存,参考以下方法pixelMap2Buffer。
import { pdfService } from '@kit.PDFKit';
    import { image } from '@kit.ImageKit';
    import { fileIo as fs } from '@kit.CoreFileKit';
    import { common } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    @Entry
    @Component
    struct PdfPage {
      private pdfDocument: pdfService.PdfDocument = new pdfService.PdfDocument();
      private context = getContext() as common.UIAbilityContext;
      private loadResult: pdfService.ParseResult = pdfService.ParseResult.PARSE_ERROR_FORMAT;
    
      aboutToAppear(): void {
        // 确保沙箱目录有input.pdf文档
        let filePath = this.context.filesDir + '/input.pdf';
        this.loadResult = this.pdfDocument.loadDocument(filePath);
      }
    
      // 将 pixelMap 转成图片格式
      pixelMap2Buffer(pixelMap: image.PixelMap): Promise<ArrayBuffer> {
        return new Promise((resolve, reject) => {
          /**
           设置打包参数
           format:图片打包格式,只支持 jpg 和 webp
           quality:JPEG 编码输出图片质量
           bufferSize:图片大小,默认 10M
           */
          let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 98 }
          // 创建ImagePacker实例
          const imagePackerApi = image.createImagePacker()
          imagePackerApi.packToData(pixelMap, packOpts).then((buffer: ArrayBuffer) => {
            resolve(buffer)
          }).catch((err: BusinessError) => {
            reject()
          })
        })
      }
    
      build() {
        Column() {
          // 获取为图片并保存到应用沙箱
          Button('getPagePixelMap').onClick(async () => {
            if (this.loadResult === pdfService.ParseResult.PARSE_SUCCESS) {
              let page = this.pdfDocument.getPage(0)
              let pixmap: image.PixelMap = page.getPagePixelMap();
              if (!pixmap) {
                return
              }
              const imgBuffer = await this.pixelMap2Buffer(pixmap)
              const file =
                fs.openSync(this.context.filesDir + `/${Date.now()}.png`, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
              await fs.write(file.fd, imgBuffer)
              // 关闭文档
              await fs.close(file.fd)
            }
          })
          // 获取指定PdfPage区域的图片内容。
          Button('getCustomPagePixelMap').onClick(async () => {
            if (this.loadResult === pdfService.ParseResult.PARSE_SUCCESS) {
              let page = this.pdfDocument.getPage(0);
              let matrix = new pdfService.PdfMatrix();
              matrix.x = 100;
              matrix.y = 100;
              matrix.width = 500;
              matrix.height = 500;
              matrix.rotate = 0;
              let pixmap: image.PixelMap = page.getCustomPagePixelMap(matrix, false, false);
              if (!pixmap) {
                return;
              }
              const imgBuffer = await this.pixelMap2Buffer(pixmap);
              const file =
                fs.openSync(this.context.filesDir + `/${Date.now()}.jpeg`, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
              await fs.write(file.fd, imgBuffer);
              // 关闭文件
              await fs.close(file.fd);
            }
          })
          // 获取指定PdfPage区域的图片内容
          Button('getAreaPixelMap').onClick(async () => {
            if (this.loadResult === pdfService.ParseResult.PARSE_SUCCESS) {
              let page = this.pdfDocument.getPage(0);
              let matrix = new pdfService.PdfMatrix();
              matrix.x = 100;
              matrix.y = 100;
              matrix.width = 500;
              matrix.height = 500;
              matrix.rotate = 0;
              let pixmap: image.PixelMap = page.getAreaPixelMap(matrix, 400, 400, true, false);
              if (!pixmap) {
                return
              }
              const imgBuffer = await this.pixelMap2Buffer(pixmap)
              const file =
                fs.openSync(this.context.filesDir + `/${Date.now()}.bmp`, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
              await fs.write(file.fd, imgBuffer)
              // 关闭文件
              await fs.close(file.fd);
            }
          })
        }
      }
    }
总结

通过上述步骤和代码,我们可以轻松地实现将一个PDF文档的所有页面转换为单独的图片文件,并存放在指定的文件夹中。这种方法对于需要对PDF文档进行处理或分享的场景非常有用。请注意,实际开发中需要处理各种异常情况,确保程序的健壮性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架

【前端启航篇】Vue3 项目初始化与基础布局&#xff1a;搭建美观易用的管理界面骨架 前言技术选型回顾与准备准备工作第一步&#xff1a;进入前端项目并安装 Element Plus第二步&#xff1a;在 Vue3 项目中引入并配置 Element Plus第三步&#xff1a;设计基础页面布局组件第四步…

C++ 前缀和数组

一. 一维数组前缀和 1.1. 定义 前缀和算法通过预处理数组&#xff0c;计算从起始位置到每个位置的和&#xff0c;生成一个新的数组&#xff08;前缀和数组&#xff09;。利用该数组&#xff0c;可以快速计算任意区间的和&#xff0c;快速求出数组中某一段连续区间的和。 1.2. …

细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐

细胞冻存的原理 细胞冻存的基本原理是利用低温环境抑制细胞的新陈代谢&#xff0c;使细胞进入一种“休眠”状态。在低温条件下&#xff0c;细胞的生物活动几乎停止&#xff0c;从而实现长期保存。然而&#xff0c;细胞在冷冻过程中可能会因为细胞内外水分结冰形成冰晶而受损。…

快速上手Linux火墙管理

实验网络环境&#xff1a; 主机IP网络f1192.168.42.129/24NATf2&#xff08;双网卡&#xff09; 192.168.42.128/24 192.168.127.20/24 NAT HOST-NOLY f3192.168.127.30/24HOST-ONLY 一、iptables服务 1.启用iptables服务 2.语法格式及常用参数 语法格式&#xff1a;参数&…

[创业之路-375]:企业战略管理案例分析 - 华为科技巨擘的崛起:重构全球数字化底座的超级生命体

在人类文明从工业时代&#xff08;机械、电气、自动化&#xff09;迈向数字智能&#xff08;硬件、软件、算法、虚拟、智能&#xff09;时代的临界点上&#xff0c;一家中国企业正以令人震撼的姿态重塑全球科技版图。从通信网络的底层架构到智能终端的生态闭环&#xff0c;从芯…

AI基础知识(05):模型提示词、核心设计、高阶应用、效果增强

目录 一、核心设计原则 二、高阶应用场景 三、突破性技巧 以下是针对DeepSeek模型的提示词设计思路及典型应用场景示例&#xff0c;帮助挖掘其潜在能力&#xff1a; 一、核心设计原则 1. 需求明确化&#xff1a;用「角色定位任务目标输出格式」明确边界 例&#xff1a;作为历…

推测解码算法在 MTT GPU 的应用实践

前言​ 目前主流的大模型自回归解码每一步都只生成一个token, 尽管kv cache等技术可以提升解码的效率&#xff0c;但是单个样本的解码速度依然受限于访存瓶颈&#xff0c;即模型需要频繁从内存中读取和写入数据&#xff0c;此时GPU的利用率有限。为了解决这种问题&#xff0c;…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面&#xff0c;以支持酒店运营的不同方面和参与者。其中&#xff0c;管理端和商户端是两个核心组成部分&#xff0c;它们各自承担着不同的职责和功能。 软件版本&#xff1a;Axure RP 9 预览地址&#xff1a;https://556i1e.axshare.…

写实交互数字人在AI招聘中的应用方案

随着科技的进步&#xff0c;越来越多的行业开始探索如何利用人工智能提升效率和服务质量。其中&#xff0c;写实交互数字人技术以其高度拟真的交互体验和丰富的情感表达能力&#xff0c;在人力资源领域特别是招聘环节中展现出了巨大潜力。本文将探讨写实交互数字人在AI招聘中的…

房贷利率计算前端小程序

利率计算前端小程序 视图效果展示如下&#xff1a; 在这里插入代码片 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

在Visual Studio中进行cuda编程

首先下载与CUDA Toolkit匹配的Visual Studio版本 比如我的CUDA Toolkit版本是12.6&#xff0c;那么我可以使用2022的Visual Studio。 查看Toolkit版本 nvcc -V 配置 ok&#xff0c;让我们开始Visual Studio的nvcc编译器配置 参考例文https://github.com/apachecn/succinc…

Fastrace:Rust 中分布式追踪的现代化方案

原文链接&#xff1a;Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服务架构中&#xff0c;分布式追踪对于理解应用程序的行为至关重要。虽然 tokio-rs/tracing 在 Rust 中被广泛使用&#xff0c;但它存在一些显著的挑战&#xf…

Linux云计算训练营笔记day13【CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM】

Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]] 目录 Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]1.find练习2.vim高级使用2.1 命令模式:2.2 插入模式:2.3 末行模式: 3. vimdiff4. ping5.…

黑马Java基础笔记-15

Set 无索引&#xff0c;无序&#xff0c;不可重复 HashSet object类中默认hashCode的方法是根据地址值。 如果集合中存储的是自定义对象&#xff0c;必须要重写hashCode和equals方法。 底层原理 jdk8以前&#xff1a;数组 链表 jdk8及以后&#xff1a;数组 链表 红黑…

软件设计师“排序算法”真题考点分析——求三连

一、考点分值占比与趋势分析 综合知识题分值统计表 年份考题数量总分值分值占比考察重点2018222.67%时间复杂度/稳定性判断2019334.00%算法特性对比分析2020222.67%空间复杂度要求2021111.33%算法稳定性判断2022334.00%综合特性应用2023222.67%时间复杂度计算2024222.67%分治…

Visual Studio 2019/2022:当前不会命中断点,还没有为该文档加载任何符号。

1、打开调试的模块窗口&#xff0c;该窗口一定要在调试状态下才会显示。 vs2019打开调试的模块窗口 2、Visual Studio 2019提示未使用调试信息生成二进制文件 未使用调试信息生成二进制文件 3、然后到debug目录下看下确实未生成CoreCms.Net.Web.WebApi.pdb文件。 那下面的…

vue--ofd/pdf预览实现

背景 实现预览ofd/pdf超链接功能 业务实现 pdf的预览 实现方式&#xff1a; 直接使用 <iframe :src"${url}#navpanes0&toolbar0" /> 实现pdf的预览。 navpanes0 隐藏侧边栏toolbar0 隐藏顶部工具栏 使用pdf.js&#xff0c;代码先行&#xff1a; <tem…

Python 爬虫之requests 模块的应用

requests 是用 python 语言编写的一个开源的HTTP库&#xff0c;可以通过 requests 库编写 python 代码发送网络请求&#xff0c;其简单易用&#xff0c;是编写爬虫程序时必知必会的一个模块。 requests 模块的作用 发送网络请求&#xff0c;获取响应数据。 中文文档&#xf…

【MySQL】CRUD

CRUD 简介 CRUD是对数据库中的记录进行基本的增删改查操作 Create&#xff08;创建&#xff09;Retrieve&#xff08;读取&#xff09;Update&#xff08;更新&#xff09;Delete&#xff08;删除&#xff09; 一、新增&#xff08;Create&#xff09; 语法&#xff1a; I…

Spring Boot微服务架构(三):Spring Initializr创建CRM项目

使用Spring Initializr创建CRM项目 一、创建项目前的准备 访问Spring Initializr网站&#xff1a; 打开浏览器访问 https://start.spring.io/或者直接使用IDE&#xff08;如IntelliJ IDEA或Eclipse&#xff09;内置的Spring Initializr功能 项目基本信息配置&#xff1a; Proj…