HarmonyOS鸿蒙Next ArkTS生成PDF文件
HarmonyOS鸿蒙Next ArkTS生成PDF文件 在鸿蒙应用中如何实现本地生成PDF文件,麻烦问下哪位大神有什么思路可以提供一下么?
PDF Kit(PDF服务)包含pdfService和PdfView组件。
pdfService提供了加载和保存PDF文档、在PDF页面中添加文本内容、图片、批注、页眉页脚、水印、背景图片、书签、判断PDF文档是否加密及删除文档加密等相关的功能,对PDF文档的操作有更多的应用场景。
PdfView组件提供了文档预览功能,如:PDF文档预览、高亮显示、搜索关键字,批注等场景。
详见开发文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/pdf-introduction
PDF Kit更多的示例代码请参考CodeLab和SampleCode。
更多关于HarmonyOS鸿蒙Next ArkTS生成PDF文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
pdfService 模块为应用提供统一的管理PDF页面的页眉页脚、水印和背景、文档的多种批注风格和书签便捷的PDF能力。
如何生成本地pdf?
1、使用 createDocument 创建空白文档:
import { pdfService } from '@kit.PDFKit';
let pdfDocument = new pdfService.PdfDocument();
pdfDocument.createDocument(600, 900);
2、使用 addTextObject / addImageObject 在pdf中添加文本或图片:
const pdfPage: pdfService.PdfPage = pdfDocument.getPage(0);
const textStyle: pdfService.TextStyle = new pdfService.TextStyle;
const fontInfo = new pdfService.FontInfo();
fontInfo.fontPath = '/system/fonts/HarmonyOS_Sans.ttf';
textStyle.fontInfo = fontInfo;
textStyle.textSize = 20;
textStyle.textColor = 0x0000FF;
textStyle.isBold = true;
textStyle.isItalic = false;
pdfPage.addTextObject('这是一个pdf文档', 20, 520, textStyle);
3、使用 saveDocument 保存pdf文档:
const context = this.getUIContext().getHostContext() as Context;
const filePath = context.filesDir + '/test.pdf'
pdfDocument.saveDocument(filePath)
完整代码:
createPDF() {
// 创建pdf空白文档
const pdfDocument = new pdfService.PdfDocument();
pdfDocument.createDocument(600, 900);
// 添加文本内容
const pdfPage: pdfService.PdfPage = pdfDocument.getPage(0);
const textStyle: pdfService.TextStyle = new pdfService.TextStyle;
const fontInfo = new pdfService.FontInfo();
fontInfo.fontPath = '/system/fonts/HarmonyOS_Sans.ttf';
textStyle.fontInfo = fontInfo;
textStyle.textSize = 20;
textStyle.textColor = 0x0000FF;
textStyle.isBold = true;
textStyle.isItalic = false;
pdfPage.addTextObject('这是一个pdf文档', 20, 520, textStyle);
// 保存pdf
const context = this.getUIContext().getHostContext() as Context;
const filePath = context.filesDir + '/test.pdf'
pdfDocument.saveDocument(filePath)
}
在HarmonyOS Next中,使用ArkTS生成PDF文件,目前主要有两种主流思路:
1. 使用原生Canvas绘制并导出PDF
这是当前较为推荐的方式。核心是利用@ohos.graphics.canvas和@ohos.print等系统能力。
- 基本流程:
- 创建一个
PrintDocument对象,并指定页面尺寸(如A4)。 - 在
onPageStart回调中,获取对应页面的CanvasRenderingContext2D上下文。 - 使用Canvas API(如
fillText,drawImage,strokeRect等)在上下文中精确绘制文本、图形、表格等内容。 - 调用
PrintDocument的write方法将绘制好的页面数据写入。 - 重复步骤2-4生成多页。
- 最后调用
PrintDocument的end方法完成文档生成,并通过PrintJob输出为PDF文件。
- 创建一个
- 优点:纯原生实现,性能较好,可控性高。
- 挑战:需要手动计算分页、布局和样式,对于复杂文档(如富文本、复杂表格)实现成本较高。
2. 集成第三方C/C++库(通过NDK)
对于需要生成复杂格式PDF(如包含特定字体、加密、高级图形)的场景,可以考虑此方案。
- 基本流程:
- 将成熟的C/C++ PDF生成库(如Haru, libharu)的源代码集成到鸿蒙Native工程中。
- 通过NAPI框架封装库的核心API,暴露给ArkTS层调用。
- 在ArkTS中调用这些封装好的接口来生成PDF。
- 优点:功能强大,可以利用成熟开源库的丰富特性。
- 挑战:涉及Native开发,集成和调试复杂度高,需要处理平台适配和依赖管理。
当前建议:
对于大多数应用场景,首选方案1(Canvas绘制)。可以先从绘制简单文本和图片开始,逐步构建分页、样式管理等工具函数。官方文档中的PrintDocument和Canvas相关示例是重要的起点。
注意,HarmonyOS Next的API仍在持续演进,建议密切关注@ohos.print和图形子系统相关API的更新。


