【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

简介: HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能


##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#

一、前言

图(1-1)

HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。

其核心能力包括:扫描合同、票据、会议记录并保存为 PDF 分享。拍摄课堂 PPT、书籍章节生成图片存档。快速识别表格数据,减少手动录入成本。

在HarmonyOS 5.0 及以上系统的手机 / 平板(不支持模拟器)。

二、鸿蒙中的文档扫描都具备什么功能?


图(1-2)

** 文档扫描控件(DocumentScanner)** 是 AI Vision Kit。文档扫描控件提供拍摄文档并转换为高清扫描件的服务。

  1. 使用手机拍摄文档,即可自动裁剪和优化,并支持jpeg图片、PDF格式保存和分享。如图(1-1)所示。
  2. 支持拍摄拍照或图片识别表格,生成表格文档。如图(1-2)所示。

三、鸿蒙中的文档扫描怎么用?

1. 导入依赖模块:

import { DocType, DocumentScanner, DocumentScannerConfig, SaveOption, FilterId, ShootingMode, EditTab, DocumentScannerResultCallback } from "@kit.VisionKit";

2. 配置扫描config对象:
定义扫描参数(如拍摄模式、识别类型、滤镜等)。

名称

类型

可选

说明

maxShotCount

number

最大拍摄张数,范围[1,50],默认1

supportType

DocType[]

支持的识别类型(文档/表格),默认[DocType.DOC],部分机型仅支持文档。

isGallerySupported

boolean

是否支持从图库选图,默认true

defaultFilterId

FilterId

初始滤镜(原图/黑白/增强),默认增强(STRENGTHEN)。

editTabs

EditTab[]

Tab栏功能按钮(旋转/删除/重拍),默认全部显示。

defaultShootingMode

ShootingMode

拍摄模式(自动/手动),默认手动(MANUAL)。

isShareable

boolean

是否支持分享,默认true

saveOptions

SaveOption[]

保存格式(JPG/PDF/EXCEL),默认[JPG, EXCEL]

originalUris

string[]

初始图片URI列表(用于直接跳转编辑页),最大长度50,需符合尺寸规格。

private docScanConfig = new DocumentScannerConfig()
  setDocScanConfig() {
    this.docScanConfig.supportType = [DocType.DOC, DocType.SHEET]
    this.docScanConfig.isGallerySupported = true
    this.docScanConfig.editTabs = []
    this.docScanConfig.maxShotCount = 3
    this.docScanConfig.defaultFilterId = FilterId.ORIGINAL
    this.docScanConfig.defaultShootingMode = ShootingMode.MANUAL
    this.docScanConfig.isShareable = true
    this.docScanConfig.originalUris = []
  }

3. UI布局中添加DocumentScanner
将第二步配置创建好的scannerConfig对象进行赋值。
并且处理onResult回调,当扫描处理成功后会返回Uris。

参数名

类型

说明

code

number

状态码:
-1=取消/
200=成功/
1008601001=URI无效(5.0.5+)

saveType

SaveOption

保存格式(JPG/PDF/EXCEL)

uris

string[]

生成的文件URI列表(扫描结果或表格文档)

//文档扫描
        DocumentScanner({
          scannerConfig: this.docScanConfig,
          onResult: (code: number, saveType: SaveOption, uris: string[]) => {
            hilog.info(0x0001, TAG, `result code: ${code}, save: ${saveType}`)
            if (code === -1) {
              this.pathStack?.pop()
            }
            uris.forEach(uriString => {
              hilog.info(0x0001, TAG, `uri: ${uriString}`)
            })
            this.docImageUris = uris
          }
        })
          .size({ width: '100%', height: '100%' })

源码示例分享


// MainPage.ets - 扫描入口页面

import { NavPathStack } from '@ohos.router';
import { DocDemoPage } from './DocDemoPage'; // 引入扫描实现页
@Entry
@Component
struct MainPage {
  // 导航栈管理页面跳转
  private pathStack: NavPathStack = new NavPathStack()
  build() {
    Navigation(this.pathStack) {
      Column({ space: 20 }) {
        // 标题
        Text('文档扫描Demo').fontSize(24).fontWeight(500);
        
        // 扫描入口按钮
        Button('开始扫描文档', { type: ButtonType.Capsule, stateEffect: true })
          .width('60%')
          .height(50)
          .onClick(() => {
            // 跳转到扫描页面
            this.pathStack.pushPath({ name: 'documentScanner' });
          });
      }
      .justifyContent(FlexAlign.Center)
      .width('100%')
      .height('100%');
    }
    .navDestination(this.PageMap)
    .mode(NavigationMode.Stack)
    .title('文档扫描示例');
  }
}

// DocDemoPage.ets - 扫描功能实现与结果展示

import { 
  DocType, DocumentScanner, DocumentScannerConfig, 
  SaveOption, FilterId, ShootingMode, EditTab 
} from "@kit.VisionKit";
import { hilog, LogLevel } from '@ohos.hilog'; // 日志工具
const TAG = 'DocScannerDemo'; // 日志标签
@Entry
@Component
export struct DocDemoPage {
  @State scanResults: string[] = []; // 保存扫描结果URI
  private pathStack: NavPathStack | null = null;
  // 扫描配置初始化
  private docScanConfig = new DocumentScannerConfig();
  // 页面加载时配置扫描参数
  aboutToAppear() {
    this.docScanConfig.supportType = [DocType.DOC, DocType.SHEET]; // 支持文档和表格识别
    this.docScanConfig.maxShotCount = 3; // 最多拍摄3张
    this.docScanConfig.isGallerySupported = true; // 允许从图库选图
    this.docScanConfig.defaultFilterId = FilterId.STRENGTHEN; // 默认增强滤镜
    this.docScanConfig.defaultShootingMode = ShootingMode.MANUAL; // 手动拍摄模式
    this.docScanConfig.editTabs = [EditTab.ROTATE_TAB, EditTab.RESHOOT_TAB]; // 显示旋转和重拍按钮
    this.docScanConfig.saveOptions = [SaveOption.JPG, SaveOption.PDF, SaveOption.EXCEL]; // 支持三种保存格式
    this.docScanConfig.isShareable = true; // 开启分享功能
  }
  build() {
    NavDestination({ name: 'documentScanner' }) {
      Stack() {
        // 扫描结果展示区域
        Column() {
          if (this.scanResults.length > 0) {
            Text('扫描结果').fontSize(18).fontWeight(500).margin({ top: 20 });
            Grid() {
              ForEach(this.scanResults, (uri, index) => {
                // 展示缩略图,点击可预览(示例中简化为日志输出)
                Image(uri)
                  .objectFit(ImageFit.Contain)
                  .width(150)
                  .height(150)
                  .margin(10)
                  .onClick(() => hilog.info(LogLevel.INFO, TAG, `预览图片:${uri}`));
              })
              .columnsTemplate('1fr 1fr') // 两行布局
              .rowGap(10)
              .columnGap(10);
          }
        }
        .width('100%')
        .padding(20);
        // 文档扫描控件主体
        DocumentScanner({
          scannerConfig: this.docScanConfig,
          onResult: (code: number, saveType: SaveOption, uris: string[]) => {
            hilog.info(LogLevel.INFO, TAG, `扫描结果:code=${code}, 格式=${SaveOption[saveType]}`);
            switch (code) {
              case 200: // 成功
                this.scanResults = uris; // 更新结果列表
                hilog.info(LogLevel.INFO, TAG, `保存路径:${uris.join(', ')}`);
                break;
              case -1: // 用户取消
                this.pathStack.pop(); // 返回上一页
                break;
              case 1008601001: // URI无效(5.0.5+支持)
                hilog.error(LogLevel.ERROR, TAG, '传入的图片规格不符合要求');
                break;
            }
          }
        })
        .size({ width: '100%', height: '100%' })
        .margin({ top: 80 }); // 留出结果展示区域空间
      }
      .width('100%')
      .height('100%')
      .hideTitleBar(true); // 隐藏导航栏
      .onReady((context: NavDestinationContext)=>{
              this.pathStack = context?.pathStack;
        })
  }
}

注意

originalUris图片

  • 单边长度:224px ≤ 长/宽 ≤ 8000px。
  • 宽高乘积:≤ 6000×8000 px²。
  • 宽高比:≤ 3(即最长边/最短边 ≤ 3)。
目录
相关文章
|
3月前
|
物联网 开发工具
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
115 9
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
|
3月前
|
传感器 安全 物联网
【HarmonyOS 5】鸿蒙分布式协同应用开发详解
为什么需要分布式协同应用? 首先是因为当今社会,围绕电子产品生态,人们迫切希望,周边的电子设备可以协同操作。例如手机,手表,电视机,汽车,甚至是各种家电产品。 从2015年到如今,手机和pc等老牌电子产品的设备数趋于稳定,其他IoT设备稳步增长。可见人均所拥有的的电子产品的个数,在迅速增加。
150 0
|
3月前
|
开发工具
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。
109 1
|
3月前
|
前端开发 JavaScript API
【HarmonyOS 5】鸿蒙跨平台开发方案详解(一)
2025年是鸿蒙生态迎来关键发展期。根据前几天的2025 HDC数据显示,鸿蒙原生应用数量已从2024年的2000款增长至5000款,微信鸿蒙版安装量突破1.2亿,公安部交管系统完成全国300城鸿蒙适配。
274 1
|
3月前
|
存储 安全 API
【HarmonyOS 5】鸿蒙应用隐私保护详解
【HarmonyOS 5】鸿蒙应用隐私保护详解
145 1
|
3月前
|
监控 JavaScript 开发工具
【HarmonyOS 5】鸿蒙中@State的原理详解
@State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。 @State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。
148 0
|
3月前
|
存储 大数据 数据处理
【HarmonyOS 5】鸿蒙中的UIAbility详解(三)
本文是鸿蒙中的UIAbility详解系列的最终章。主要针对UIAbility的冷启动和热启动,对于want数据的处理。UIAbility的备份恢复,UIAbility的接续等高级功能的概念和使用讲解。
138 0
|
3月前
|
定位技术 开发工具 开发者
【HarmonyOS 5】桌面快捷方式功能实现详解
在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。 鸿蒙系统提供的**桌面快捷方式(Shortcuts)**功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用图标即可快速启动特定功能,大幅减少操作层级。 本文将结合地图导航场景,详细解析鸿蒙快捷方式的实现原理与开发流程。结合华为官方开源示例 DesktopShortcut 展开,该示例基于HarmonyOS 5.0实现,完整演示了地图导航场景的快捷方式开发流程。
203 0
|
3月前
|
消息中间件 物联网 开发工具
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
200 0
|
3月前
|
人工智能 自然语言处理 IDE
【HarmonyOS 5】鸿蒙CodeGenie AI辅助编程工具详解
1、CodeGenie是什么? CodeGenie (代码精灵)作为鸿蒙DevEco IDE自带的AI辅助编码工具。
155 0