news 2026/2/10 23:01:48

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/2/9 6:34:18

AI写论文利器推荐!4款AI论文写作工具,让写论文变得轻而易举!

你是不是还在为写期刊论文、毕业论文或者职称论文而感到烦恼呢&#xff1f;在进行人工撰写时&#xff0c;面对大量文献&#xff0c;简直就像在大海中捞针。还有那些复杂的格式要求&#xff0c;让人感到无比压力&#xff0c;反复的修改更是让人疲惫&#xff0c;工作效率低下已成…

作者头像 李华
网站建设 2026/2/10 9:05:19

揭秘AI教材写作!掌握这些技巧,打造低查重的优质教材

教材初稿总算完成&#xff0c;可是接下来的修改和优化真是把我折磨得够呛&#xff01;仔细通读全文&#xff0c;寻找逻辑漏洞和知识点错误&#xff0c;简直需要耗费大量的时间和精力&#xff1b;每当我调整一个章节的结构时&#xff0c;后续的多个部分都受到影响&#xff0c;修…

作者头像 李华
网站建设 2026/2/10 10:42:47

4.2 MySQL与微服务架构:数据库在微服务中的设计模式

4.2 MySQL与微服务架构:数据库在微服务中的设计模式 📚 学习目标 通过本节学习,你将掌握: ✅ 微服务架构下的数据库设计原则 ✅ 数据库拆分策略(按业务领域、按功能模块等) ✅ 分布式事务处理方案(Saga、TCC、最终一致性等) ✅ 跨服务数据查询和同步方案 ✅ 微服务数…

作者头像 李华
网站建设 2026/2/10 8:39:59

【小程序毕设全套源码+文档】基于微信小程序的在线答题微信小程序设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华