HarmonyOS 鴻蒙應用開發基礎:轉換整個PDF文檔為圖片功能

在許多應用場景中,將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@Componentstruct 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 和 webpquality: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.pswp.cn/bicheng/82168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82168.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法】: 前綴和算法(利用o(1)的時間復雜度快速求區間和)

前綴和算法&#xff1a;高效處理區間求和的利器 目錄 引言什么是前綴和前綴和的基本實現前綴和的作用前綴和的典型應用場景前綴和的優缺點分析實戰例題解析 引言 區間求和問題的普遍性暴力解法的時間復雜度問題前綴和算法的核心思想 什么是前綴和 前綴和的數學定義 通俗來…

NDVI諧波擬合(基于GEE實現)

在遙感影像中&#xff0c;我們常用 NDVI&#xff08;歸一化植被指數&#xff09;來衡量地表植被的綠度。它簡單直觀&#xff0c;是生態監測、農情分析的基礎工具。但你是否注意到&#xff1a; NDVI 雖然“綠”&#xff0c;卻常常“亂”。 因為云層、觀測頻率、天氣干擾&#xf…

基于Python+YOLO模型的手勢識別系統

本項目是一個基于Python、YOLO模型、PyQt5的實時手勢識別系統&#xff0c;通過攝像頭或導入圖片、視頻&#xff0c;能夠實時識別并分類不同的手勢動作。系統采用訓練好的深度學習模型進行手勢檢測和識別&#xff0c;可應用于人機交互、智能控制等多種場景。 1、系統主要功能包…

黑馬點評--短信登錄實現

短信登錄 導入黑馬點評項目 導入資料中提供的SQL文件 其中的核心表有&#xff1a; tb_user &#xff1a;用戶表 tb_user_info &#xff1a;用戶詳情表 tb_shop&#xff1a;用戶信息表 tb_shop_type&#xff1a;商戶類型表 tb_blog&#xff1a;用戶日記表&#xff08;達人…

AWS EC2實例安全遠程訪問最佳實踐

EC2 遠程連接方案對比 遠程訪問 Amazon EC2 實例主要有以下四種方式&#xff1a; Secure Shell (SSH) 遠程訪問AWS Systems Manager 會話管理器適用于 Linux 實例的 EC2 Serial ConsoleAmazon EC2 Instance Connect SSH 遠程訪問 SSH&#xff08;Secure Shell&#xff09;廣…

Idea如果有參數,怎么debug

如上圖&#xff0c;輸入輸出路徑是需要運行的時候給參數。 那么 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); 給上面的代碼給參數的步驟為 1.在類名或者方法名上右鍵&#xff0c;選擇More Run/Debug…

Oracle Apps R12——報表入門2:單表——報表開發流程

☆開發思路 開發表報代碼流程中有幾個重要的組件和重要的知識點需要搞懂&#xff0c;才能得心應手。報表通常是通過表格的形式來存在的&#xff0c;我們一般在開發代碼的時候在【輸出】中打印HTML,Css格式的表格&#xff0c;并把查詢到的數據插入其中&#xff0c;即可完成一個報…

Servlet的繼承關系和生命周期

1.繼承關系&#xff1a; javax.servlet.Servlet接口->javax.servlet.GenericServlet抽象類 ->javax.servlet.http.HttpServlet抽象子類 2.相關方法&#xff1a; javax.servlet.Servlet&#xff1a; &#xff08;1&#xff09;void init(config) -初始化方法 &…

PEFT庫PromptTuningConfig 配置

PEFT庫 PromptTuningConfig 配置 "Prompt Tuning"的參數高效微調 PromptTuningConfig 核心參數解析 1. task_type="CAUSAL_LM" 作用:指定任務類型為因果語言模型(Causal LM)。說明:因果語言模型從左到右生成文本(如GPT系列),這與任務需求匹配(模…

【438. 找到字符串中所有字母異位詞】

Leetcode算法練習 筆記記錄 438. 找到字符串中所有字母異位詞 438. 找到字符串中所有字母異位詞 思路就是我們要找和p相同的詞&#xff0c;可以先排個序&#xff0c;每次取一個和p的size長度相同的窗口去滑動&#xff0c;符合就記錄&#xff0c;不符合繼續滑動。 public List&l…

React Hooks底層執行邏輯詳解、自定義Hooks、FiberScheduler

React Hooks底層執行邏輯詳解 React Hooks 在表面上看像普通的函數調用&#xff0c;背后卻隱藏著一套復雜而高效的運行時機制。要理解 React Hooks 的底層執行邏輯&#xff0c;需要從 React 如何管理組件的狀態與副作用入手。 &#x1f9e0; 一、React 為什么引入 Hooks&#…

Windows命令實用工具——tcping 命令工具安裝及基礎使用

Windows命令實用工具——tcping 命令工具安裝及使用 一、tcping 命令簡介二、tcping 的安裝1、tcping 官網下載安裝包2、將軟件包復制到 Windws 系統的 System32 目錄下面3、查看 tcping 命令是否安裝成功 三、tcping 工具簡單使用方法 一、tcping 命令簡介 tcping 的主要功能…

智慧化工園區安全風險管控平臺建設方案(Word)

1 項目概況 1.1 園區概況 1.1.1 XX化工園區簡況 1.1.2 企業現狀 1.1.3 園區發展方向 1.1.4 園區信息化現狀 1.2 項目建設背景 1.2.1 政策背景 1.3 項目建設需求分析 1.3.1 政策需求分析 1.3.2 安全生產監管需求分析 1.3.3 應急協同管理需求分析 1.3.4 工業互聯網安…

【動手學深度學習】2.3. 線性代數

目錄 2.3. 線性代數1&#xff09;標量2&#xff09;向量3&#xff09;矩陣4&#xff09;張量5&#xff09;張量的基本性質6&#xff09;降維7&#xff09;點積8&#xff09;矩陣-向量積9&#xff09;矩陣-矩陣乘法10&#xff09;范數11&#xff09; 小結 2.3. 線性代數 本節將…

如何在項目當中使用redis進行范圍搜索

目錄 如何將地理位置數據保存到 Redis 中以支持范圍查詢 Redis 中的 GEO 類型是什么&#xff1f; 如何保存 GEO 數據到 Redis 分段解釋&#xff1a; RedisKey.POSTS_ANIMALS_LOCATIONS new Point(longitude, latitude) 如何進行范圍搜索 Redis GEO 范圍搜索核心語句 1…

物聯網低功耗保活協同優化方案:軟硬件與WiFi網關動態聯動

目錄 一、總體方案概述 二、架構組成 2.1 系統拓撲 2.2 硬件端(MCU + WiFi 模組) 2.3 WiFi 網關 2.4 云端服務器 三、低功耗保活技術設計模式 3.1 模式一:定時喚醒 + MQTT 保活 3.1.1 設備端 3.1.2 優勢 3.2 模式二:網關保活代理 + 本地網絡喚醒 3.2.1 網關功能…

UniApp+Vue3微信小程序二維碼生成、轉圖片、截圖保存整頁

二維碼生成工具使用uqrcode/js&#xff0c;版本4.0.7 官網地址&#xff1a;uQRCode 中文文檔&#xff08;不建議看可能會被誤導&#xff09; 本項目采用了npm引入方式&#xff0c;也可通過插件市場引入&#xff0c;使用上會略有不同 準備工作&#xff1a; 安裝&#xff1a;pnpm…

Zenmap代理情況下無法掃描ip

原因是開了代理會報錯 error “only ethernet devices can be used for raw scans on Windows” 在掃描參數后加 -sT -Pn&#xff0c;但會導致結果太多 例如&#xff1a;nmap -sT -T4 -A -v -Pn 10.44.2.0/24 如果你只是想找沒人用的IP&#xff0c;你不需要搞復雜的原始層掃描&…

將多個值關聯到同一個 key的map(key可以重復的map)示例

在 Java 中&#xff0c;標準的 Map 接口要求 key 必須唯一&#xff0c;如果需要 key 可重復 且保持 插入順序 的數據結構&#xff0c;可以使用以下方案&#xff1a; 1. 使用 List<Map.Entry<K, V>> 最直接的方式是用鏈表存儲鍵值對&#xff0c;允許重復 key&…

Arthas(阿爾薩斯)

一、Arthas 是什么&#xff1f; Arthas&#xff08;阿爾薩斯&#xff09;是阿里巴巴開源的一款 Java 在線診斷工具&#xff0c;基于 Java Agent 和字節碼增強技術實現。它無需重啟 JVM&#xff0c;即可動態追蹤代碼執行、實時查看 JVM 狀態、修改代碼邏輯&#xff0c;是生產環…