章
目
录
本文将为大家详细介绍如何在鸿蒙系统里借助PdfKit实现PDF文件的查看、编辑等功能,代码示例均基于鸿蒙系统环境。
一、整体介绍
本示例聚焦于展示如何运用PDFKit提供的功能,实现对PDF文件内容的查看与编辑等操作。其中,相关功能通过PDFKit服务接口@kit.PDFKit
引入。在正式讲解代码实现前,先了解一下最终的效果以及使用方法。
(一)效果预览
从实际运行效果来看,用户进入相关页面后,会看到几个操作选项,分别对应不同的PDF文件打开方式和预览功能。
(二)使用说明
进入应用页面后,有以下几个主要操作:
- 点击“Open the PDF file on the computer”,这一操作会调用picker打开本地的pdf文件。
- 点击“Opening a resource PDF file”,可以打开rawfile中的pdf文件。
- 点击“Opening the PdfView file for preview”,就能开启pdf预览功能。
二、实现思路与代码详解
实现这些功能的核心在于通过pdfService
和PdfView
组件来操作PDF文档。下面对各个功能点的实现代码进行详细解读。
(一)打开PDF文档
要打开PDF文档,需指定文件路径并创建PdfDocument
对象,示例代码如下:
// 定义要打开的PDF文件路径
let filePath = '/data/storage/el2/base/haps/View/files/input.pdf';
// 创建PdfDocument对象
let document: pdfService.PdfDocument = new pdfService.PdfDocument();
// 加载指定路径的PDF文档
document.loadDocument(filePath);
在这段代码中,先设定了要打开的PDF文件的路径,接着创建PdfDocument
对象,最后通过该对象的loadDocument
方法加载指定路径的PDF文档。
(二)将PDF转换为图片
把PDF转换为图片时,要先确定输出图片的保存路径,然后调用convertToImage
方法,代码如下:
// 获取文件保存目录,并拼接输出图片的目录路径
let path: string = getContext().filesDir + "/outputImg/";
// 创建输出图片的目录
fs.mkdir(path);
// 将PDF文档的第一页转换为图片并保存到指定路径
const result: boolean = this.document.convertToImage(path, 0);
这里先获取应用的文件目录,拼接出输出图片的目录路径,并创建该目录。然后使用document
对象的convertToImage
方法,将PDF文档的第一页(参数0
表示第一页)转换为图片并保存到指定路径,result
用于接收转换操作的结果,true
表示转换成功,false
表示失败。
(三)添加页眉页脚
添加页眉页脚时,需创建HeaderFooterInfo
对象,并设置各种属性,示例如下:
// 创建页眉页脚信息对象
let hfInfo: pdfService.HeaderFooterInfo = new pdfService.HeaderFooterInfo();
// 创建字体信息对象
hfInfo.fontInfo = new pdfService.FontInfo();
// 设置字体路径,确保该字体路径存在
hfInfo.fontInfo.fontPath = font.getFontByName("HarmonyOS Sans")?.path;
hfInfo.fontInfo.fontName = '';
hfInfo.textSize = 10;
// 设置字符集
hfInfo.charset = pdfService.CharsetType.PDF_FONT_DEFAULT_CHARSET;
hfInfo.underline = false;
// 设置文本颜色,这里的颜色值是十六进制表示
hfInfo.textColor = 0x00000000;
hfInfo.leftMargin = 1.0;
hfInfo.topMargin = 40.0;
hfInfo.rightMargin = 1.0;
hfInfo.bottomMargin = 40.0;
// 设置页眉左侧文本,其中包含日期和页码的占位符
hfInfo.headerLeftText = "left H <<dd.mm.yyyy>> <<1/n>>";
hfInfo.headerCenterText = "center H <<m/d/yyyy>> <<1/n>>";
hfInfo.headerRightText = "right H <<m/d>><<1>>";
// 设置页脚左侧文本
hfInfo.footerLeftText = "left F <<m/d>><<1>>";
hfInfo.footerCenterText = "center F <<m/d>><<1>>";
hfInfo.footerRightText = "right F <<dd.mm.yyyy>><<1>>";
// 在第1页到第5页添加页眉页脚,最后两个参数表示是否添加页眉和页脚
this.document.addHeaderFooter(hfInfo, 1, 5, true, true);
这段代码先创建了HeaderFooterInfo
对象,对字体、文本大小、颜色、边距以及页眉页脚的具体文本内容进行设置,最后调用addHeaderFooter
方法,在指定的页面范围内添加页眉页脚。
(四)添加水印
添加水印的实现方式如下:
// 创建文本水印信息对象
let wminfo: pdfService.TextWatermarkInfo = new pdfService.TextWatermarkInfo();
// 设置水印类型为文本水印
wminfo.watermarkType = pdfService.WatermarkType.WATERMARK_TEXT;
wminfo.content = "This is Watermark";
wminfo.textSize = 30;
wminfo.textColor = 200;
// 创建字体信息对象并设置字体路径
wminfo.fontInfo = new pdfService.FontInfo();
wminfo.fontInfo.fontPath = font.getFontByName("HarmonyOS Sans").path;
wminfo.opacity = 0.5;
wminfo.isOnTop = true;
wminfo.rotation = 45;
wminfo.scale = 1.5;
wminfo.opacity = 0.5;
// 设置水印垂直对齐方式为顶部对齐
wminfo.verticalAlignment = pdfService.WatermarkAlignment.WATERMARK_ALIGNMENT_TOP;
// 设置水印水平对齐方式为左侧对齐
wminfo.horizontalAlignment = pdfService.WatermarkAlignment.WATERMARK_ALIGNMENT_LEFT;
wminfo.horizontalSpace = 1.0;
wminfo.verticalSpace = 1.0;
// 在第0页到第18页添加水印,最后两个参数表示是否覆盖原有内容
this.document.addWatermark(wminfo, 0, 18, true, true);
在这段代码里,创建TextWatermarkInfo
对象,设置水印的各种属性,如类型、内容、字体、颜色、透明度、对齐方式等,然后使用addWatermark
方法在指定页面范围内添加水印。
(五)添加页面背景图片
为PDF页面添加背景图片的代码如下:
// 创建背景信息对象
let bginfo: pdfService.BackgroundInfo = new pdfService.BackgroundInfo();
// 设置背景图片路径
bginfo.imagePath = this.backGroundImgPath = getContext().filesDir + "/background.png";
bginfo.backgroundColor = 50;
bginfo.isOnTop = true;
bginfo.rotation = 45;
bginfo.scale = 0.5;
bginfo.opacity = 0.3;
// 设置背景垂直对齐方式为顶部对齐
bginfo.verticalAlignment = pdfService.BackgroundAlignment.BACKGROUND_ALIGNMENT_TOP;
// 设置背景水平对齐方式为左侧对齐
bginfo.horizontalAlignment = pdfService.BackgroundAlignment.BACKGROUND_ALIGNMENT_LEFT;
bginfo.horizontalSpace = 1.0;
bginfo.verticalSpace = 1.0;
// 在第2页到第18页添加背景图片,最后两个参数表示是否覆盖原有内容
this.document.addBackground(bginfo, 2, 18, true, true);
这里创建BackgroundInfo
对象,设置背景图片路径、颜色、透明度、旋转角度、对齐方式等属性,再通过addBackground
方法在指定页面添加背景图片。
(六)添加书签
添加书签时,涉及创建书签、设置书签属性等操作,代码如下:
// 创建第一个书签
let mark1: pdfService.Bookmark = this.document.createBookmark();
// 创建第二个书签
let mark2: pdfService.Bookmark = this.document.createBookmark();
// 将第一个书签插入到文档中,父书签为null,页码为1
this.document.insertBookmark(mark1, null, 1);
// 将第二个书签插入到文档中,父书签为mark1,页码为1
this.document.insertBookmark(mark2, mark1, 1);
// 获取第一个书签的目标信息对象
let destInfo: pdfService.DestInfo = mark1.getDestInfo();
// 设置目标页面的显示模式为FIT_MODE_XYZ
destInfo.fitMode = pdfService.FitMode.FIT_MODE_XYZ;
destInfo.pageIndex = 1;
destInfo.left = 20;
destInfo.top = 30;
destInfo.zoom = 1.5;
// 设置第一个书签的目标信息
mark1.setDestInfo(destInfo);
// 获取第一个书签的书签信息对象
let bookInfo: pdfService.BookmarkInfo = mark1.getBookmarkInfo();
bookInfo.title = "这里是跳到第一页的书签";
bookInfo.titleColor = 12;
bookInfo.isBold = true;
bookInfo.isItalic = true;
// 设置第一个书签的书签信息
mark1.setBookmarkInfo(bookInfo);
这段代码展示了如何创建书签、插入书签、设置书签的目标页面显示属性以及书签的标题、颜色、字体样式等信息。
(七)通过PdfView组件实现预览功能
- 打开pdf文件
借助PdfView
组件打开pdf文件的代码如下:
// 获取应用上下文
let context = getContext() as common.UIAbilityContext;
// 获取应用的文件目录
let dir = context.filesDir;
// 拼接要打开的PDF文件路径
let filePath = dir + `/input.pdf`;
// 创建PdfController对象
this.controller = new pdfViewManager.PdfController();
// 加载PDF文档
let loadResult: pdfService.ParseResult = await this.controller.loadDocument(filePath);
PdfView({
controller: this.controller,
pageFit: pdfService.PageFit.FIT_WIDTH,
showScroll: true
})
.id('pdfview_app_view')
.layoutWeight(1)
这段代码首先获取应用上下文和文件目录,拼接出要打开的PDF文件路径。然后创建PdfController
对象,通过该对象加载PDF文档。最后创建PdfView
组件,并设置相关属性,如控制器、页面适应方式、是否显示滚动条等。
2. 设置预览方式
设置预览方式的代码与打开pdf文件的代码部分重复,同样是先加载文档,再创建PdfView
组件并设置属性:
// 获取应用上下文
let context = getContext() as common.UIAbilityContext;
// 获取应用的文件目录
let dir = context.filesDir;
// 拼接要打开的PDF文件路径
let filePath = dir + `/input.pdf`;
// 创建PdfController对象
this.controller = new pdfViewManager.PdfController();
// 加载PDF文档
let loadResult: pdfService.ParseResult = await this.controller.loadDocument(filePath);
PdfView({
controller: this.controller,
pageFit: pdfService.PageFit.FIT_WIDTH,
showScroll: true
})
.id('pdfview_app_view')
.layoutWeight(1)
在实际应用中,可根据需求调整pageFit
等属性来改变预览效果。
3. 设置监听
为了实现与用户的交互,还可以设置一些监听事件,比如文本选中、图片选中和页码变化的监听,代码如下:
// 文本选中监听回调
this.controller.registerTextSelectedListener((textSelect: pdfViewManager.TextSelectedParam) => {
hilog.info(0x0000, '', 'registerTextSelectedListener'+textSelect.text);
});
// 图片选中监听回调
this.controller.registerImageSelectedListener((imageSelect: pdfViewManager.ImageSelectedParam) => {
hilog.info(0x0000, '', 'registerImageSelectedListener'+imageSelect.toString());
});
// 页码变化监听回调
this.controller.registerPageChangedListener((pageIndex: number) => {
hilog.info(0x0000, '', 'registerPageChangedListener'+pageIndex.toString());
});
这些监听回调函数会在相应的事件发生时被触发,方便开发者获取相关信息并进行后续处理。
4. 搜索关键字
在PDF文档中搜索关键字的代码如下:
this.controller.searchKey(this.inputStr, (index: number) => {
hilog.info(0x0000, '', 'searchKey result index:'+index);
});
在这段代码中,this.inputStr
是要搜索的关键字,通过searchKey
方法进行搜索,搜索结果会在回调函数中返回,index
表示关键字所在的页码(如果未找到,index
可能为特定的错误值)。
通过以上步骤,我们就可以在鸿蒙系统中利用PdfKit实现对PDF文件的多种操作和预览功能。希望这些代码示例和解释能帮助大家在实际开发中更好地运用PdfKit。