HarmonyOS鸿蒙Next ArkTS生成PDF文件

HarmonyOS鸿蒙Next ArkTS生成PDF文件 在鸿蒙应用中如何实现本地生成PDF文件,麻烦问下哪位大神有什么思路可以提供一下么?

5 回复

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更多的示例代码请参考CodeLabSampleCode

更多关于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)应用开发中,实现本地生成PDF文件主要有两种核心思路,可根据场景选择:

📄 方案一:使用PDF原生服务(适用于自定义内容) 通过@ohos.file.pdf模块直接创建PDF文档并添加内容(如图片/文本),适合需要精确控制PDF布局的场景。 实现步骤:

  1. 创建PDF文档

    let pdfDocument = new pdfService.PdfDocument();
    pdfDocument.createDocument(width, height); // 单位:点(1英寸=72点)
    
  2. 添加内容到页面

    const page = pdfDocument.getPage(0);
    // 添加图片(需先保存到沙箱)
    page.addImageObject(imagePath, x, y, width, height);
    
  3. 保存PDF文件

    const sandboxPath = getContext().filesDir;
    const docPath = sandboxPath + "/output.pdf";
    pdfDocument.saveDocument(docPath); // 返回布尔值表示成功状态
    

⚠️ 关键注意事项:

  • 图片处理:需先将图片保存到应用沙箱(使用getComponentSnapshot()截图 + saveImage()存本地)
  • 坐标系统:原点(0,0)位于页面左下角(非左上角),布局时需注意Y轴计算
  • 单位换算:推荐使用vp2px()/px2vp()处理像素与虚拟像素的转换

🌐 方案二:通过Web组件生成(适用于网页内容) 使用Web组件的createPdf()方法(API version 14+),适合将前端页面直接转为PDF。 实现步骤:

  1. 配置PDF参数

    pdfConfig: webview.PdfConfiguration = {
      width: 8.27, // A4纸宽度(英寸)
      height: 11.69, // A4纸高度(英寸)
      margin: 0, // 页边距
      shouldPrintBackground: true
    }
    
  2. 调用生成接口

    webviewController.createPdf(
      this.pdfConfig,
      (error, result: webview.PdfData) => {
        if (!error) {
          const pdfBuffer = result.pdfArrayBuffer().buffer;
          // 保存二进制数据到文件
        }
      }
    );
    
  3. 写入沙箱文件

    import { fileIo as fs } from '@kit.CoreFileKit';
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    fs.write(file.fd, pdfBuffer);
    

⚠️ 关键注意事项:

  • 权限要求:需在module.json5声明ohos.permission.INTERNET(网络资源适用)
  • CSS优化:使用@media print媒体查询优化PDF打印样式
  • 调试模式:开发阶段可启用setWebDebuggingAccess(true),正式发布需移除

🧩 方案对比

特性 PDF原生服务 Web组件生成
适用场景 动态生成图片/文本内容 转换现有网页/UI界面
精细控制 ★★★★☆ (可精确定位元素) ★★☆☆☆ (依赖前端布局)
复杂度 中 (需手动处理坐标) 低 (一键转换)
API要求 通用 HarmonyOS API 14+

推荐选择:

  • 需要插入本地图片/自定义文本 → 方案一
  • 已有现成Web页面需导出 → 方案二 两种方案均需操作应用沙箱路径(getContext().filesDir),生成后可通过@kit.ArkShare实现文件分享。

信息推荐

使用Web组件的PDF文档预览能力

pdf文档生成

使用Web组件保存前端页面为PDF

在HarmonyOS鸿蒙Next中使用ArkTS生成PDF文件,主要通过@ohos.file.fs@ohos.pdf模块实现。首先创建并写入PDF内容,可设置页面大小、添加文本、图片等元素。使用pdf.createPdf初始化文档,通过pdf.PdfPage添加页面,并调用相关API插入内容。最后调用save方法保存文件至指定路径。需注意权限声明,确保应用有文件存储访问权限。

在HarmonyOS Next中,使用ArkTS生成PDF文件,目前主要有两种主流思路:

1. 使用原生Canvas绘制并导出PDF

这是当前较为推荐的方式。核心是利用@ohos.graphics.canvas@ohos.print等系统能力。

  • 基本流程
    1. 创建一个PrintDocument对象,并指定页面尺寸(如A4)。
    2. onPageStart回调中,获取对应页面的CanvasRenderingContext2D上下文。
    3. 使用Canvas API(如fillText, drawImage, strokeRect等)在上下文中精确绘制文本、图形、表格等内容。
    4. 调用PrintDocumentwrite方法将绘制好的页面数据写入。
    5. 重复步骤2-4生成多页。
    6. 最后调用PrintDocumentend方法完成文档生成,并通过PrintJob输出为PDF文件。
  • 优点:纯原生实现,性能较好,可控性高。
  • 挑战:需要手动计算分页、布局和样式,对于复杂文档(如富文本、复杂表格)实现成本较高。

2. 集成第三方C/C++库(通过NDK)

对于需要生成复杂格式PDF(如包含特定字体、加密、高级图形)的场景,可以考虑此方案。

  • 基本流程
    1. 将成熟的C/C++ PDF生成库(如Haru, libharu)的源代码集成到鸿蒙Native工程中。
    2. 通过NAPI框架封装库的核心API,暴露给ArkTS层调用。
    3. 在ArkTS中调用这些封装好的接口来生成PDF。
  • 优点:功能强大,可以利用成熟开源库的丰富特性。
  • 挑战:涉及Native开发,集成和调试复杂度高,需要处理平台适配和依赖管理。

当前建议: 对于大多数应用场景,首选方案1(Canvas绘制)。可以先从绘制简单文本和图片开始,逐步构建分页、样式管理等工具函数。官方文档中的PrintDocumentCanvas相关示例是重要的起点。

注意,HarmonyOS Next的API仍在持续演进,建议密切关注@ohos.print和图形子系统相关API的更新。

回到顶部