打印

news/2025/10/8 19:10:32/文章来源:https://www.cnblogs.com/wkin/p/19129989

View Post

打印

第一步:权限申请

在module.json5中进行如下配置;

"requestPermissions": [{"name": "ohos.permission.PRINT","reason": "$string:permissionsReason","usedScene": {"abilities": ["EntryAbility"],"when":"always"}},{"name": "ohos.permission.INTERNET"},
],

第二步:将打印的内容保存至沙箱(这里是将网络图片下载到沙箱),并将地址转化成uri沙箱目录格式

import { fileUri } from '@kit.CoreFileKit';
import { downloadFileWithUniqueName } from './dowmload';
import { common } from '@kit.AbilityKit';
import { PrintService } from './printPage';@Entry
@Component
struct Index {@State message: string = 'Hello World';@State uri: string = ""@State filePath:string = ""private printService: PrintService | null = new PrintService(getContext(this)); // 打印服务实例build() {Scroll() {Column({ space: 10 }) {Button("下载").onClick(async () => {const res = await downloadFileWithUniqueName("https://pic.rmb.bdstatic.com/bjh/bb8918b3bce/241107/8b2d3382db261f701e50d6acddcb48bc.jpeg?for=bg", "test.jpg")let context = getContext(this) as common.UIAbilityContextthis.filePath = `${context.filesDir}/${res.uniqueNameWithoutExt}.${res.ext}`})Text("显示").fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {console.log('filePath-----',this.filePath)this.uri = fileUri.getUriFromPath(this.filePath)console.log('uri-----',this.uri)})Image(this.uri).width(100).height(100)Button("打印").width('90%').height(50).onClick(() => {let hostContext = this.getUIContext().getHostContext();if (hostContext) {this.printService = new PrintService(hostContext);this.printService.executePrint([this.uri,this.uri])} else {console.error('获取上下文失败,无法初始化打印服务');}})}.justifyContent(FlexAlign.Center).constraintSize({ minHeight: '100%' }).width('100%')}.height('100%')}
}

note:其中打印需要的上下文需要用this.getUIContext().getHostContext()来获取,需要的地址格式需要用fileUri.getUriFromPath来获取。

第三步:封装打印文件需要的类

import { BusinessError, print } from '@kit.BasicServicesKit';
/*** 打印服务类*/
export class PrintService {private context: Context;constructor(context: Context) {this.context = context;}/*** 执行打印操作*/executePrint(files: string[],callback?: () => void): void {try {if (files.length === 0) {console.error('没有有效的文件可打印');return;}console.log("最终打印URI列表:", JSON.stringify(files));print.print(files, this.context).then((printTask: print.PrintTask) => {printTask.on('succeed', () => {console.info('print state is succeed');if (callback) {callback();}})}).catch((error: BusinessError) => {console.error('print err ' + JSON.stringify(error));})}catch (e){console.error('打印失败:' + JSON.stringify(e));}}
}

拓展:下载的工具类

import { fileIo } from '@kit.CoreFileKit';
import { request } from '@kit.BasicServicesKit';/*** 将网络图片下载到沙箱* @param url 当前应用上下文* @param originalFileName 文件名(不含扩展名)* @returns 下载任务、唯一文件名、后缀*/interface DownloadTask {task: request.DownloadTask;uniqueNameWithoutExt: string;ext?: string;
}// 下载文件并生成唯一文件路径,返回下载任务和唯一文件名(不含后缀)
export async function downloadFileWithUniqueName(url: string,originalFileName: string
): Promise<DownloadTask> {// 获取上下文和文件目录const context = getContext();const filesDir = context.filesDir;// 分离文件名和扩展名const extIndex = originalFileName.lastIndexOf('.');const nameWithoutExt = extIndex > 0 ? originalFileName.substring(0, extIndex) : originalFileName;const ext = extIndex > 0 ? originalFileName.substring(extIndex) : '';let newName = originalFileName;let counter = 1;// 尝试生成唯一的文件名while (fileIo.accessSync(`${filesDir}/${newName}`)) {newName = `${nameWithoutExt}(${counter})${ext}`;counter++;}const uniqueFilePath = `${filesDir}/${newName}`;const uniqueNameWithoutExt = newName.substring(0, newName.lastIndexOf('.')) || newName;// 下载配置const downFileConfig: request.DownloadConfig = {url: url,filePath: uniqueFilePath,background: true,};// 执行下载const task = await request.downloadFile(context, downFileConfig);return { task: task, uniqueNameWithoutExt:uniqueNameWithoutExt, ext:ext.slice(1) };
}

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

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

相关文章

实用指南:Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)

实用指南:Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

完整教程:vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死

完整教程:vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死2025-10-08 19:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-…

利用虚拟主机建设企业网站上海si设计公司

最近做用Ajax.AjaxMethod方法的时候&#xff0c;在asp.net的服务器下一切正常&#xff0c;用iis的时候&#xff0c;js中总是cs类找不到&#xff0c;我就郁闷了&#xff0c;折腾了大半天&#xff0c;终于找到错误原因了。因为我发布网站用的是iis7&#xff0c;所以在web.config位…

网站开发的英文书有什么软件安卓应用市场免费下载安装

实体 实体是具有唯一标识的对象,且该标识和对象的属性值分离.即使两个实体的属性完全相同,这两个实体也相同,不能交换使用.由于实体通常对应于现实世界的概念. 是领域模型的中心,因此实体的标识非常重要. 值对象 值对象是主要由其属性值定义的对象.值对象通常不可变,即一旦创建…

广州黄埔区做网站培训机构建设官网公司地址

文章目录一、综述二、常见的回归分析三、对于相关性的理解四、一元线性回归模型五、对于回归系数的解释六、内生性七、四类线性模型回归系数的解释八、对于定性变量的处理——虚拟变量XXX九、下面来看一个实例十、扰动项需要满足的条件十一、异方差十二、多重共线性十三、逐步回…

VsCode 安装 Cline 插件并使用免费模型(例如 DeepSeek) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025球墨铸铁管厂家 TOP 企业品牌推荐排行榜,市政球墨铸铁管、球墨铸铁管件、防腐球墨铸铁管、给水球墨铸铁管推荐这十家公司!

在基础设施建设领域,球墨铸铁管凭借其优异的抗压性能、耐腐蚀特性以及较长的使用寿命,成为供水、排水、燃气输送等工程中的重要建材。然而,当前球墨铸铁管市场并非一片规范,行业内存在不少问题亟待解决。一方面,部…

网站整站html网页设计与制作千年之恋代码

在选择海外IP代理服务时&#xff0c;您将面临一个关键的问题&#xff1a;是选择住宅代理IP还是数据中心代理IP&#xff1f;这两者之间存在着根本性的不同&#xff0c;涉及到性能、隐私和成本等方面的考虑。住宅代理IP通常来自真实的住宅网络连接&#xff0c;更难被检测到。数据…

龙岗网络营销网站制作哪里好做家具厂招聘有哪些网站

android-verticalseekbar——Android可视化SeekBar类库转载于:https://www.cnblogs.com/zhujiabin/p/5706246.html

Say 题选记(10.5 - 10.11)

P4797 [CEOI 2015] 波将金的路径 题目要我们找一个环长 \(\ge 4\) 的环,使得这个环没有弦。难点显然在这个没有弦的限制。如果我们直接找最小环,可能会找到一个三元环,虽然没有弦了,但也不满足题目的要求。 一个人…

昆山网站开发ikelv孟州网站开发app

在当今的数据驱动时代&#xff0c;Elasticsearch以其强大的搜索和分析能力&#xff0c;成为了众多企业和项目中的核心组件。然而&#xff0c;Elasticsearch的强大并不止于其本身&#xff0c;其与其他系统的紧密集成&#xff0c;如Logstash、Kibana、Beats等&#xff0c;共同构建…

站长工具海角wordpress为用户添加积分

一、监控 Windows 主机的方法 方式 1:使用 Windows Exporter Windows Exporter(wmi_exporter) 是 Prometheus 官方推荐的 Windows 监控工具,它可以采集 CPU、内存、磁盘、网络、进程、服务状态等 指标。 方式 2:使用 Node Exporter for Windows node_exporter 主要用于…

E. Rasta Thamaye Dilo

E. Rasta Thamaye Dilo链接:[https://codeforces.com/gym/104679/problem/E?adcd1e=caf4fedm9escdm&csrf_token=062b3628aaa43205c694e16f77dbe6ec] 题意: 村庄=点 路=点与点的连线 1.有t组数据,每组给一个数字…

微信机器人开发最新协议API

微信机器人开发最新协议API 大家看到这篇文章,首先要明白:市面上所有机器人操作,都是基于接收消息后的逻辑处理,例如群转让、群管理、自动踢人、创建群聊、入群自动@、聚合聊天、消息托管、多群转发、内容直播、社…

重庆承越网站制作公司德州网站怎样建设

ollydbg简介&#xff1a; Ollydbg 通常称作OD&#xff0c;是反汇编工作的常用工具&#xff0c;OD附带了200脱壳脚本和各类插件&#xff0c;功能非常强大&#xff0c;可以过SE&#xff0c;VMP3.0&#xff0c;深受逆向圈内人士的喜爱 OD&#xff0c;是一个反汇编工具&#xff0c;…

JDK的安装与使用 - XYX

JDK 安装与使用指南 第一部分:什么是 JDK?JRE 和 JVM 又是什么?** 在开始安装之前,我们先来厘清几个容易混淆的概念:JVM (Java Virtual Machine):Java 虚拟机。它是 Java 平台的核心,负责执行 Java 字节码(.cl…

不连网也能跑大模型? - 教程

不连网也能跑大模型? - 教程2025-10-08 18:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

Rust 的英文数字验证码识别系统实现

一、引言 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)是一种防止恶意自动化访问的技术,常见于网站注册、登录等场景。 通过随机字符、干扰线、扭曲等方式,验证…

linux下网站建设免费国内ip

工作流程&#xff1a; Driver 创建 SparkSession 并将应用程序转化为执行计划&#xff0c;将作业划分为多个 Stage&#xff0c;并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…

网站备案核网页界面设计的主要内容

前后端分离的开发中&#xff0c;用户http请求应用服务的接口时, 如果要求检测该用户是否已登录。可以实现的方法有多种&#xff0c; 本示例是通过aop 的方式实现&#xff0c;简单有效。 约定&#xff1a;前端http的post 请求 export async function request(url,data) {const …