news 2026/4/23 15:42:26

zebra通过zpl语言实现中文打印(三)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
zebra通过zpl语言实现中文打印(三)

通过zebra通过zpl语言实现中文打印(一|二)这两篇文章其实已经知道了大概流程,对于数字和英文打印没有问题,接下来讲讲关于中文字体的问题。

1需要通过Zebra Setup Utilities这个软件进行下载安装,

加载字体后,我们在页面中添加一个按钮,点击打印字体列表。看是否正常加载进来了

const sendAndReadAllAvailable = (device: any, data: string, retries = 10): Promise<string> => { return new Promise((resolve, reject) => { if (typeof device?.sendThenReadUntilStringReceived !== 'function') { reject(new Error('BrowserPrint SDK method not available')) return } device.sendThenReadUntilStringReceived( data, '', (resp: string) => resolve(resp ?? ''), (err: any) => reject(err), retries ) }) } const getFontFileCandidates = async (device: any): Promise<string[]> => { const drives = ['R', 'E', 'B'] const seen = new Set<string>() const out: string[] = [] for (const drive of drives) { const query = `^XA^HW${drive}:*.*^XZ` const resp = await sendAndReadAllAvailable(device, query, 10).catch(() => '') const lines = String(resp || '') .split(/\r?\n/) .map((v) => v.trim()) .filter(Boolean) for (const line of lines) { const m = line.match(/([A-Z0-9_~\-]{1,32}\.(?:TTF|TTE|FNT))/i) const file = m?.[1]?.toUpperCase() if (!file) continue const spec = `${drive}:${file}` if (seen.has(spec)) continue seen.add(spec) out.push(spec) } } return out } const listFontFiles = async () => { printerStatus.value = '' try { const selected_device = await getPrinter() const candidates = await getFontFileCandidates(selected_device) const grouped: Record<string, string[]> = {} for (const spec of candidates) { const drive = spec.slice(0, 1) const file = spec.slice(2) if (!grouped[drive]) grouped[drive] = [] grouped[drive].push(file) } const drives = ['R', 'E', 'B'] const chunks: string[] = drives .filter((d) => grouped[d]?.length) .map((d) => `${d}: ${grouped[d].slice(0, 60).join(' | ')}`) const msg = chunks.length ? chunks.join('\n') : '未读取到字体文件(或打印机不支持 ^HW 回读)。' console.log('字体目录:\n' + msg) printerStatus.value = msg } catch (e: any) { console.error('读取字体目录失败:', e) printerStatus.value = '读取字体目录失败:' + (e?.message || String(e)) } }

字体目录中有SIMSUN.FNT就是宋体。既然知道有宋体,我们在输出时在zpl代码里加入字体指令即可。还记得我们批量打印函数中fontFile参数

export const printOrderLabelBatch = async (options: { device: any items: Array<{ cardNo?: string; userId?: string | number; recognizedInfoString?: string }> xOffset?: number widthDots?: number heightDots?: number retries?: number retryDelayMs?: number timeoutMs?: number delayBetweenMs?: number fontFile?: string }) => { const device = options.device const items = Array.isArray(options.items) ? options.items : [] const delayBetweenMs = Math.max(0, Number(options.delayBetweenMs ?? 800)) const fontFile = normalizeZplFontFile(options.fontFile ?? 'SIMSUN.FNT') const zplList: string[] = [] for (const item of items) { const zpl = buildOrderLabelZpl({ cardNo: item?.cardNo, userId: item?.userId, recognizedInfoString: item?.recognizedInfoString, fontFile, xOffset: options.xOffset, widthDots: options.widthDots, heightDots: options.heightDots }) zplList.push(zpl) } for (let i = 0; i < zplList.length; i++) { await sendZplToPrinter(device, zplList[i], { retries: options.retries, retryDelayMs: options.retryDelayMs, timeoutMs: options.timeoutMs }) if (delayBetweenMs > 0 && i < zplList.length - 1) { await new Promise((r) => setTimeout(r, delayBetweenMs)) } } return zplList }

默认我们采用了宋体:const fontFile = normalizeZplFontFile(options.fontFile ?? 'SIMSUN.FNT')

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:14:50

AI写教材必备!掌握低查重技巧,让教材生成又快又好

在创作教材之前&#xff0c;选择工具总是个让人头疼的问题&#xff01;如果用普通的办公软件&#xff0c;功能简直单一得可怜&#xff0c;格式和框架得自己一点一点弄&#xff1b;换用那些专业的编写工具&#xff0c;操作可就繁琐多了&#xff0c;学会了还得花上好几天&#xf…

作者头像 李华
网站建设 2026/4/22 22:35:24

AI写论文宝藏合集!4款AI论文生成工具,为你的论文创作添动力!

在为期刊论文、毕业论文或职称论文的撰写感到烦恼吗&#xff1f;当我们用手动写作时&#xff0c;面对海量的文献&#xff0c;恍若在大海中捞针&#xff0c;而繁琐的格式规定则让人感到无奈&#xff0c;不断的修改又让人心力交瘁&#xff0c;低效率的问题成了许多学者的普遍困扰…

作者头像 李华
网站建设 2026/4/23 11:14:18

设计离职交接清单生成工具,输入岗位(行政/销售/技术),生成定制化交接清单,标注核心工作文件位置,对接人,帮离职/接手人高效交接,不留隐患。

1. 实际应用场景与痛点 场景 在企业中&#xff0c;员工离职时需要交接工作内容&#xff0c;包括&#xff1a; - 核心项目文件位置 - 对接人联系方式 - 未完成事项 - 账号权限移交 不同岗位&#xff08;行政 / 销售 / 技术&#xff09;交接重点不同&#xff1a; - 行政&#…

作者头像 李华
网站建设 2026/4/23 14:29:18

3.5 容量规划:如何预估和规划MySQL资源需求

3.5 容量规划:如何预估和规划MySQL资源需求 📚 学习目标 通过本节学习,你将掌握: ✅ 容量规划的重要性和目标 ✅ 存储、内存、CPU、IO、网络等资源的评估方法 ✅ 数据增长预测模型和容量需求计算 ✅ 容量规划的最佳实践和预警机制 ✅ 容量扩展策略和成本控制 🎯 学习收…

作者头像 李华
网站建设 2026/4/3 4:29:03

【小程序毕设源码分享】基于springboot+Android的环保生活小助手APP设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:53:01

3.6 备份策略优化:构建安全可靠的数据保护体系

3.6 备份策略优化:构建安全可靠的数据保护体系 📚 学习目标 通过本节学习,你将掌握: ✅ 备份策略的设计原则(3-2-1原则等) ✅ 全量备份、增量备份、差异备份的实现方法 ✅ mysqldump、XtraBackup等备份工具的使用 ✅ 备份恢复的完整流程和最佳实践 ✅ 备份安全和合规性…

作者头像 李华