如何将FGL打印命令存储为变量以实现Boca打印机门票打印需求
FGL打印命令灵活配置方案
完全可以实现,你可以通过拆分固定打印模板和可变数据的方式实现灵活配置,不需要把命令硬编码在代码里,具体方案如下:
- 抽离FGL打印模板
把固定的命令结构和可变数据的占位符预先定义好,你需要动态修改的引导文本、打印结束标记都可以做成占位符,模板整体可以存在配置文件中,修改时直接更新配置即可,无需调整业务代码。
你提到的需要修改的提示文本Access our map, audio, and more at foo.org/guide可以单独作为配置项存储,也可以集成在模板的占位符中。
参考模板格式如下:
<RU><RC600,200><QRV2><QR6,0,1,0>{{uuid}}<F3><HW1,1><RC380,760>{{eventName}}<RC340,760>{{ticketTypeName}}<RC300,760>${{unitPrice}}<RC260,760>{{guideText}}{{endTag}}
- 优化现有代码逻辑
你当前的代码存在大量重复内容,两个分支仅末尾的结束标记不同,完全可以合并逻辑,减少冗余,同时把原硬编码的命令全部替换为模板占位符替换逻辑,优化后的参考代码如下:
// 从配置文件读取模板与自定义文本,无需硬编码 string fglPrintTemplate = 配置读取方法("FglTicketTemplate"); string ticketGuideText = 配置读取方法("TicketGuideTip"); foreach (var (ticket, index) in tickets.Select((item, idx) => (item, idx))) { // 仅最后一张票使用<p>结束标记,其余使用<q> string endTag = index == tickets.Count - 1 ? "<p>" : "<q>"; // 批量替换模板占位符 string printerCommands = fglPrintTemplate .Replace("{{uuid}}", ticket.uuid.ToString()) .Replace("{{eventName}}", ticket.eventName) .Replace("{{ticketTypeName}}", ticket.ticketTypeName) .Replace("{{unitPrice}}", ticket.unitPrice.ToString("F2")) .Replace("{{guideText}}", ticketGuideText) .Replace("{{endTag}}", endTag); // 执行打印逻辑 var response = Transmit(printerCommands); ps.status = response; ps.dataPrinted = $"uuid: {ticket.uuid}, eventDateTime: {ticket.eventDateTime}, eventName: {ticket.eventName}, ticketTypeName: {ticket.ticketTypeName}"; }
- 扩展说明
如果后续需要调整打印位置、字体大小、二维码参数等样式,直接修改配置文件中的模板即可,不需要改动业务代码;如果需要支持多套打印模板,也可以把多个模板存储在配置中,根据业务场景动态选择调用。
注意替换占位符时提前做好数据格式校验,比如价格统一保留两位小数,避免打印出来的内容格式错乱。
内容的提问来源于stack exchange,提问作者smoore4
相关产品推荐
相关产品推荐

