You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Printooth库TextPrintable对齐功能失效问题求助

Printooth库TextPrintable对齐异常排查与解决

针对你遇到的Printooth库打印发票时TextPrintable对齐失效的问题,结合代码和打印结果,可从以下方向排查解决:

1. 统一字符编码设置

你的代码中部分TextPrintable设置了CHARCODE_PC437,但需要居中的标题、"APPROVED"项未设置该编码。Printooth计算文本对齐位置依赖字符编码对应的字符宽度,编码不一致会导致宽度计算偏差,破坏对齐效果。

修改方案:给所有TextPrintable统一添加字符编码配置,示例:

TextPrintable.Builder()
    .setText(printData.title)
    .setCharacterCode(DefaultPrinter.CHARCODE_PC437) // 统一编码
    // 其他配置...
    .build()

2. 排查RawPrintable指令的干扰

开头和结尾的RawPrintable.Builder(byteArrayOf(27, 100, 4))是设置换行间距的指令(ESC d n,n=4代表换行4行),部分打印机执行这类指令后会重置对齐状态,影响后续文本的位置计算。

修改方案:

  • 移除开头的RawPrintable,或在打印前先发送打印机初始化指令(ESC @)重置状态:
add(RawPrintable.Builder(byteArrayOf(27, 64)).build()) // 初始化打印机

3. 手动发送对齐指令(绕过封装)

如果Printooth的对齐封装存在兼容性问题,可直接发送打印机原生ESC对齐指令手动控制:

  • 左对齐:byteArrayOf(27, 97, 0)
  • 居中对齐:byteArrayOf(27, 97, 1)
  • 右对齐:byteArrayOf(27, 97, 2)

示例代码:

// 先发送居中对齐指令
add(RawPrintable.Builder(byteArrayOf(27, 97, 1)).build())
// 再添加需要居中的文本
add(
    TextPrintable.Builder()
        .setText(printData.title)
        .setLineSpacing(DefaultPrinter.LINE_SPACING_60)
        .setFontSize(DefaultPrinter.FONT_SIZE_LARGE)
        .setEmphasizedMode(DefaultPrinter.EMPHASIZED_MODE_BOLD)
        .setCharacterCode(DefaultPrinter.CHARCODE_PC437)
        .setNewLinesAfter(1)
        .build()
)
// 切换左对齐时发送对应指令
add(RawPrintable.Builder(byteArrayOf(27, 97, 0)).build())

4. 测试字体与加粗的影响

大字体加粗可能导致Printooth的字符宽度计算不准确,可临时去掉.setEmphasizedMode(DefaultPrinter.EMPHASIZED_MODE_BOLD)和.setFontSize(DefaultPrinter.FONT_SIZE_LARGE),测试基础对齐是否正常,逐步排查是字体还是对齐逻辑的问题。


内容的提问来源于stack exchange,提问作者Jure R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:21:18