鸿蒙HarmonyOS应用开发:扫描仪文件扫描

华为鸿蒙HarmonyOS已经发展到4.0,使用ArkTS作为开发语言。这篇文章结合Dynamsoft Service开发一个简单的鸿蒙应用,用来获取办公室里连接PC的扫描仪(惠普,富士通,爱普生,等),把文档扫描到手机里。

准备工作

  • Dynamsoft Service

    1. 在连接着扫描仪的电脑上安装Dynamsoft Service。安装包可以满足各种国产操作系统,比如统信UOS麒麟Kylin OS等。支持的架构有:x86x64arm64mips64el。支持的扫描仪协议包括TWAINWIASANEICAeSCL(AirPrint)。下载地址:

      • Windows: Dynamsoft-Service-Setup.msi
      • macOS: Dynamsoft-Service-Setup.pkg
      • Linux:
        • Dynamsoft-Service-Setup.deb
        • Dynamsoft-Service-Setup-arm64.deb
        • Dynamsoft-Service-Setup-mips64el.deb
        • Dynamsoft-Service-Setup.rpm

      然后访问http://127.0.0.1:18622/DWTAPI/Scanners。正常安装可以获取到扫描仪列表。

      dynamsoft-service-scanners

    2. 在浏览器中打开http://127.0.0.1:18625/,把host127.0.0.1改成PC的局域网IP地址。比如192.168.8.72,修改成功可以通过局域网IP地址访问192.168.8.72:18622/DWTAPI/Scanners获取到扫描仪列表。

      dynamsoft-service-config

    3. 申请一个免费试用序列号,扫描文件的时候需要用。

  • DevEco Studio

    下载地址:https://developer.harmonyos.com/cn/develop/deveco-studio/#download。安装前先安装Node.js,路径中不要带空格,否则安装DevEco Studio, 下载HarmonyOS SDK可能会失败。

鸿蒙程序开发

在DevEco Studio中新建工程。

鸿蒙应用工程

entry/src/main/module.json5中添加网络权限:

{"module": {..."abilities": [...],"requestPermissions": [{"name": "ohos.permission.INTERNET"}]}
}

打开entry/src/main/etc/pages/Index.ets,导入网络和图像模块:

import http from '@ohos.net.http';
import image from '@ohos.multimedia.image';

声明UI组件,包含两个按钮,一个下拉按钮和一个图片控件:

@Entry
@Component
struct Index {@State deviceNames: SelectOption[] = [{value: ''}]@State displayImage: PixelMap = undefinedlicenseKey: string = "LICENSE-KEY"; // https://www.dynamsoft.com/customer/license/trialLicense?product=dwthost: string = 'http://192.168.8.72:18622'devices = []index: number = 0build() {Column() {Row() {Button('Get Devices').onClick(() => {});}).width('30%')Column() {Select(this.deviceNames).selected(this.index).value(this.deviceNames[this.index].value.toString()).font({size: 14, family: 'serif', style: FontStyle.Normal }).onSelect((index:number)=>{this.index = index;})}.width('40%').alignItems(HorizontalAlign.Center)Button('Scan').onClick(() => {});}).width('30%')}.backgroundColor(0xFFFFFF).padding({ left: 12 }).width('100%').margin({bottom: 5})Divider()Image(this.displayImage).height('100%').width('100%')}.justifyContent(FlexAlign.Start).width('100%').height('100%').padding({left: 5, top: 5, right: 5, bottom: 5})}
}

这里的licenseKeyhost需要替换成自己的。

当点击Get Devices按钮的时候,我们通过HTTP GET来获取扫描仪列表:

Button('Get Devices').onClick(() => {let url = this.host + '/DWTAPI/Scanners'let httpRequest = http.createHttp();httpRequest.on('headersReceive', (header) => {console.info('header: ' + JSON.stringify(header));})httpRequest.request(url,{method: http.RequestMethod.GET,header: {'Content-Type': 'application/json'}}, (err, data) => {if (!err) {try {const jsonArray = JSON.parse(data.result.toString())this.devices = []let tmp: SelectOption[] = []for (const obj of jsonArray) {tmp.push({value: obj.name})this.devices.push(obj)}if (tmp.length > 0) {this.index = 0this.deviceNames = tmp}} catch (error) {console.error("Error parsing JSON:", error);}console.info('code:' + JSON.stringify(data.responseCode));} else {console.info('error:' + JSON.stringify(err));httpRequest.off('headersReceive');httpRequest.destroy();}});}).width('30%')

当点击Scan按钮的时候,我们通过HTTP POST来触发扫描仪扫描文档. 字段extraData用于传输内容,等同于HTTP请求中的body。传输的参数可以自定义,具体可以参考在线文档。

Button('Scan').onClick(() => {if (this.devices.length == 0) {return;}let parameters = {license: this.licenseKey,device: this.devices[this.index].device,config: {IfShowUI: false,PixelType: 2,//XferCount: 1,//PageSize: 1,Resolution: 200,IfFeederEnabled: false,IfDuplexEnabled: false,}};let url = this.host + '/DWTAPI/ScanJobs';let httpRequest = http.createHttp();httpRequest.on('headersReceive', (header) => {console.info('header: ' + JSON.stringify(header));})httpRequest.request(url,{method: http.RequestMethod.POST,header: {'Content-Type': 'application/json'},extraData: JSON.stringify(parameters),}, (err, data) => {if (!err) {if (data.responseCode == 201) {let jobId = data.result;let url = this.host + '/DWTAPI/ScanJobs/' + jobId + '/NextDocument';let httpRequest = http.createHttp();httpRequest.request(url,{method: http.RequestMethod.GET,expectDataType: http.HttpDataType.ARRAY_BUFFER}, (err, data) => {if (!err) {if (data.responseCode == 200) {// show image}} else {console.info('error:' + JSON.stringify(err));httpRequest.destroy();}});}} else {console.info('error:' + JSON.stringify(err));httpRequest.off('headersReceive');httpRequest.destroy();}});}).width('30%')

获取到的图像是一个ArrayBuffer,我们通过image.createImageSource来创建一个PixelMap对象,然后把它赋值给displayImage,就可以在UI上显示出来了。

let imageData = data.result as ArrayBuffer;
const imageSource = image.createImageSource(imageData);
imageSource.createPixelMap().then(pixelmap => {this.displayImage = pixelmap;
});

在华为手机或者鸿蒙模拟器中运行文档扫描程序:
鸿蒙文档扫描

源代码

https://gitee.com/yushulx/harmonyos-document-scanner

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)

在上文中(点击这里回顾>>)我们主要为大家介绍了DevExpress WPF Pivot Grid组件的超快速枢轴分析功能、Microsoft分析服务等,本文将继续介绍图表透视数据的处理、MVVM支持等。欢迎持续关注我们,探索更多新功能哦~ P.S&#…

【异步爬虫】requests和aiohttp中代理IP的使用

前言 在进行爬虫开发时,我们常常需要使用代理IP来隐藏自己的真实IP地址,以避免被一些网站限制或封禁。requests和aiohttp是两个非常常用的工具,本文将分别介绍如何在它们中使用代理IP,希望可以帮助大家更好地进行异步爬虫开发。 …

电容屏物体识别手工制作

电容屏识别物体效果2 电容屏识别物体效果1 电容屏识别物体效果3 电容屏识别物体效果4 电容识别物理效果5 我们感兴趣的是找到让我们的平面屏幕与物理三维物体和表面交互的方法。 触摸屏无处不在,成千上万的应用程序中有多种设备和屏幕格式,但我们只找到…

STM32的hex文件格式的分析

前言 最近研究Bootloader,通过串口实现STM32程序的更新。需要学习了解STM32的Hex文件格式。在这进行一下总结。 HEX文件格式 我们通过文本形式打开hex文件,可以看到: 这一行就是一条指令数据,这里对数据帧格式进行说明&#xff…

elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮 el-select组件的visible-change 事件&#xff08;下拉框出现/隐藏时触发&#xff09; <el-selectref"select":value"value"placeholder"请选择"visible-change"visibleChange">&…

Kotlin笔记(六):泛型的高级特性

前面学习了Kotlin中的泛型的基本用法,跟Java中的泛型大致相同&#xff0c;Kotlin在泛型方面还提供了不少特有的功能&#xff0c;掌握了这些功能&#xff0c;你将可以更好玩转Kotlin&#xff0c;同时还能实现一些不可思议的语法特性&#xff0c;那么我们自然不能错过这部分内容了…

2023-10-19 LeetCode每日一题(同积元组)

2023-10-19每日一题 一、题目编号 1726. 同积元组二、题目链接 点击跳转到题目位置 三、题目描述 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b…

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 Co…

DNS压测工具-dnsperf的安装和使用(centos)

系统调优 系统调优脚本&#xff0c;保存为sh文件&#xff0c;chmod提权后执行即可 #!/bin/sh #系统全局允许分配的最大文件句柄数&#xff1a; sysctl -w fs.file-max2097152 sysctl -w fs.nr_open2097152 echo 2097152 > /proc/sys/fs/nr_open #允许当前会话 / 进程打开文…

【论文笔记】Far3D: Expanding the Horizon for Surround-view 3D Object Detection

原文链接&#xff1a;https://arxiv.org/pdf/2308.09616.pdf 1. 引言 目前的环视图图像3D目标检测方法分为基于密集BEV的方法和基于稀疏查询的方法。前者需要较高的计算量&#xff0c;难以扩展到长距离检测。后者全局固定的查询不能适应动态场景&#xff0c;通常会丢失远距离…

竞赛选题 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

LeetCode13——罗马数字转整数

解题思想&#xff1a; 前后指针 左边比右边小 做减法 左边比右边大 做加法 最后一个数字直接加。 package keepcoding.leetcode.leetcode13;public class Result02 {public static void main(String[] args) {int result romanToInt("XIV");System.out.println(re…

最近又火了!吴恩达《生成式 AI》重磅发布!

吴恩达教授可能是许多人接触 AI 的启蒙课导师吧&#xff0c;在过去的十多年中&#xff0c;他的《Machine Learning》课程已经对数百万的学习者产生了积极影响。 而随着 ChatGPT 的推出&#xff0c;大模型和各类生成式人工智能&#xff08;GenAI&#xff09;技术在行业内外备受…

数据结构:排序

文章目录 1. 预备知识2. 插入排序2.1 直接插入排序2.2 折半插入排序 3. 希尔排序4. 交换排序4.1 冒泡排序4.2 快速排序4.2.1 选取基准值4.2.2 分割策略4.2.3 小数组4.2.4 基于Hoare版本 最后优化 递归版本 快速排序4.2.5 快速排序的非递归版本4.2.6 快速排序的分析 5. 选择排序…

[云原生1.]Docker数据管理与Cgroups资源控制管理

文章目录 1. Docker的数据管理1.1 数据卷1.1.1 示例 1.2 数据卷容器 2. 容器互联3. Cgroups资源控制管理3.1 简介3.2 cgroups的主要功能3.3 cpu时间片的简单介绍3.4 对CPU使用的限制3.4.1 对CPU使用的限制&#xff08;基于单个容器&#xff09;3.4.2 对CPU使用的限制&#xff0…

Linux CentOS 8(网卡的配置与管理)

Linux CentOS 8&#xff08;网卡的配置与管理&#xff09; 目录 一、项目介绍二、命令行三、配置文件四、图形画界面的网卡IP配置4.1 方法一4.2 方法二 一、项目介绍 Linux服务器的网络配置是Linux系统管理的底层建筑&#xff0c;没有网络配置&#xff0c;服务器之间就不能相互…

个微多账号聚合聊天管理如何实现?

在日常工作中&#xff0c;我经常遇到以下问题&#xff1a; 1. 微信号众多&#xff0c;需要频繁切换设备和账号&#xff0c;导致工作效率低下。 2. 无法及时回复客户消息&#xff0c;客户体验不尽如人意。 3. 难以随时掌握员工与客户的沟通情况&#xff0c;导致员工沟通质量难…

利用Python计算彭于晏的BMI

1 问题 彭于晏是众多男生女生心中的男神&#xff0c;那么他的BMI为多少&#xff0c;身体状况如何呢&#xff1f; 2 方法 运用python中数据类型转换&#xff0c;while 循环语句&#xff0c;if/elif/else 条件语句等方法计算彭于晏的BMI&#xff0c;判断他的身体状况。 计算公式…

烘焙蛋糕外卖小程序商城的作用是什么

随着经营成本上升及电商业态的冲击&#xff0c;传统烘焙蛋糕门店商家经营止步不前&#xff0c;加之口罩原因更是雪上加霜&#xff0c;引流拓客、经营转化复购大幅度降低&#xff0c;而线上又因外卖平台间的激烈竞争&#xff0c;导致中小烘焙蛋糕商家进退两难。 烘焙蛋糕店经营…

学习git博客

git新建分支并且提交代码过程 1. git pull <codeBaseAddress> [分支名(默认是master)] 2. cd <projectName> 3. git branch <newBranchName> // 创建分支 4. git checkout <newBranchName> // 切换到新分支 // 开始写你的新代码 5. git add . //…