certflow.services.printer.escp_commands 源代码
# src/certflow/services/printer/escp_commands.py
"""LQ-635KII ESC/P-K 命令常量定义
基于 EPSON LQ-635KII 用户手册第101页
包含打印机实际支持的所有 ESC/P-K 命令
"""
from __future__ import annotations
from enum import IntEnum
[文档]
class LQ635KIICommand:
"""LQ-635KII ESC/P-K 命令码常量
基于手册 P101 实际支持的命令
"""
# ============================================================
# 基本控制 (P101)
# ============================================================
ESC = b"\x1b" # Escape
LF = b"\x0a" # 换行
FF = b"\x0c" # 换页
CR = b"\x0d" # 回车
BEL = b"\x07" # 蜂鸣器
BS = b"\x08" # 退格
CAN = b"\x18" # 消除行缓冲区
DEL = b"\x7f" # 删除字符
# 打印机控制
INIT = ESC + b"@" # 初始化打印机
HOME = ESC + b"<" # 打印头归位
# 联机/脱机
DC1 = b"\x11" # 联机
DC3 = b"\x13" # 脱机
# ============================================================
# 格式控制 (P101)
# ============================================================
# 行间距
LINE_SPACING_1_8 = ESC + b"0" # 1/8 英寸
LINE_SPACING_1_6 = ESC + b"2" # 1/6 英寸 (默认)
LINE_SPACING_N_180 = ESC + b"3" # n/180 英寸 (n=0-255)
LINE_SPACING_N_60 = ESC + b"A" # n/60 英寸 (n=0-255)
LINE_SPACING_N_360 = ESC + b"+" # n/360 英寸 (n=0-255)
# 页长设定
PAGE_LENGTH_INCH = ESC + b"C" + b"\x00" # ESC C NUL n (英寸)
PAGE_LENGTH_LINES = ESC + b"C" # ESC C n (行)
PAGE_SKIP_PERF = ESC + b"N" # ESC N n (页缝空白)
PAGE_SKIP_OFF = ESC + b"O" # ESC O (取消页缝空白)
# 边界设定
LEFT_MARGIN = ESC + b"l" # ESC l n (左边界)
RIGHT_MARGIN = ESC + b"Q" # ESC Q n (右边界)
# 对齐
ALIGN_LEFT = ESC + b"a" + b"\x00" # 左对齐
ALIGN_CENTER = ESC + b"a" + b"\x01" # 居中
ALIGN_RIGHT = ESC + b"a" + b"\x02" # 右对齐
ALIGN_JUSTIFY = ESC + b"a" + b"\x03" # 两端对齐
# ============================================================
# 定位设定 (P101)
# ============================================================
# 水平定位
HORIZONTAL_TAB = b"\x09" # HT 水平跳格
SET_HORIZONTAL_TABS = ESC + b"D" # ESC D n1 n2...0
ABSOLUTE_HORIZONTAL = ESC + b"$" # ESC $ nL nH (1/60英寸)
RELATIVE_HORIZONTAL = ESC + b"\\" # ESC \ nL nH (1/180英寸)
# 垂直定位
VERTICAL_TAB = b"\x0b" # VT 垂直跳格
SET_VERTICAL_TABS = ESC + b"B" # ESC B n1 n2...0
# 绝对/相对垂直位置
ABSOLUTE_VERTICAL = ESC + b"(" + b"V" # ESC ( V (1/180英寸)
RELATIVE_VERTICAL = ESC + b"(" + b"v" # ESC ( v (1/180英寸)
# 垂直移动
RELATIVE_VERTICAL_MOVE = ESC + b"J" # ESC J n (n/180英寸)
REVERSE_VERTICAL_MOVE = ESC + b"T" # ESC T n (向上)
# ============================================================
# 英文模式 (P101)
# ============================================================
# 打印品质
DRAFT_QUALITY = ESC + b"x" + b"\x00" # 草体
LETTER_QUALITY = ESC + b"x" + b"\x01" # 文书体
# 字符间距
PITCH_10CPI = ESC + b"P" # 10 字符/英寸
PITCH_12CPI = ESC + b"M" # 12 字符/英寸
PITCH_15CPI = ESC + b"g" # 15 字符/英寸
PROPORTIONAL_ON = ESC + b"p" + b"\x01" # 比例模式开
PROPORTIONAL_OFF = ESC + b"p" + b"\x00" # 比例模式关
# 字符间距调整
CHARACTER_SPACE = ESC + b" " # ESC SP n (n/120英寸)
# 放大缩小
CONDENSED_ON = b"\x0f" # SI - 压缩打印
CONDENSED_OFF = b"\x12" # DC2 - 解除压缩
DOUBLE_WIDTH_ON = ESC + b"W" + b"\x01" # 倍宽开
DOUBLE_WIDTH_OFF = ESC + b"W" + b"\x00" # 倍宽关
DOUBLE_HEIGHT_ON = ESC + b"w" + b"\x01" # 倍高开
DOUBLE_HEIGHT_OFF = ESC + b"w" + b"\x00" # 倍高关
# 字体选择
FONT_ROMAN = ESC + b"k" + b"\x00" # Roman
FONT_SANS_SERIF = ESC + b"k" + b"\x01" # Sans Serif
FONT_COURIER = ESC + b"k" + b"\x02" # Courier
FONT_PRESTIGE = ESC + b"k" + b"\x03" # Prestige
FONT_SCRIPT = ESC + b"k" + b"\x04" # Script
# 特殊效果
SUPERSCRIPT = ESC + b"S" + b"\x00" # 上标
SUBSCRIPT = ESC + b"S" + b"\x01" # 下标
SUPERSUB_OFF = ESC + b"T" # 解除上/下标
UNDERLINE_ON = ESC + b"-" + b"\x01" # 下划线开
UNDERLINE_OFF = ESC + b"-" + b"\x00" # 下划线关
ITALIC_ON = ESC + b"4" # 斜体开
ITALIC_OFF = ESC + b"5" # 斜体关
BOLD_ON = ESC + b"E" # 粗体开
BOLD_OFF = ESC + b"F" # 粗体关
DOUBLE_STRIKE_ON = ESC + b"G" # 重叠打印开
DOUBLE_STRIKE_OFF = ESC + b"H" # 重叠打印关
# 打印模式组合
PRINT_MODE = ESC + b"!" # ESC ! n
# ============================================================
# 图形打印 (P101)
# ============================================================
# 8针图形模式
GRAPHICS_8PIN_SINGLE = ESC + b"K" # 60 DPI
GRAPHICS_8PIN_DOUBLE = ESC + b"L" # 120 DPI
GRAPHICS_8PIN_HS_DOUBLE = ESC + b"Y" # 120 DPI 高速
GRAPHICS_8PIN_QUAD = ESC + b"Z" # 240 DPI
# 24针图形模式
GRAPHICS_24PIN_SINGLE = ESC + b"*" + b"\x20" # 60 DPI
GRAPHICS_24PIN_DOUBLE = ESC + b"*" + b"\x21" # 120 DPI
GRAPHICS_24PIN_CRT = ESC + b"*" + b"\x26" # 90 DPI
GRAPHICS_24PIN_TRIPLE = ESC + b"*" + b"\x27" # 180 DPI
GRAPHICS_24PIN_HEX = ESC + b"*" + b"\x28" # 360 DPI
# 图形模式重指定
REDEFINE_GRAPHICS = ESC + b"?" # ESC ? s m
# 图形压缩
GRAPHICS_COMPRESS = ESC + b"(G" # ESC (G - 图形数据压缩
GRAPHICS_DATA = ESC + b"(K" # ESC (K - 图形数据
# ============================================================
# 字符表 (第十三章)
# ============================================================
# 字符表选择 (ESC t n)
CHARACTER_TABLE_ITALIC = ESC + b"t" + b"\x00" # 斜体表
CHARACTER_TABLE_GRAPHICS = ESC + b"t" + b"\x01" # 图形表
CHARACTER_TABLE_DOWNLOAD = ESC + b"t" + b"\x02" # 下载字符表
# 用户自定义字符 (ESC &, ESC :, ESC %)
DOWNLOAD_CHAR = ESC + b"&" # ESC & s n m a0 a1 a2 data
COPY_ROM_TO_RAM = ESC + b":" + b"\x00\x00\x00" # ESC : 0 0 0
USE_DOWNLOAD = ESC + b"%" # ESC % n
# ============================================================
# 放大缩小 (补充)
# ============================================================
# 单行倍宽
SINGLE_LINE_WIDTH = b"\x0e" # SO - 单行倍宽开
SINGLE_LINE_WIDTH_OFF = b"\x14" # DC4 - 单行倍宽关
# ============================================================
# 垂直制表位通道
# ============================================================
SET_VERTICAL_TABS_CHANNEL = ESC + b"b" # ESC b c n1 n2...0
SELECT_VFU_CHANNEL = ESC + b"/" # ESC / c
# ============================================================
# 格式控制 (补充)
# ============================================================
TOP_MARGIN = ESC + b"(U" # ESC (U - 设置页顶位置
PAGE_FORMAT = ESC + b"(c" # ESC (c - 设置页格式
PAGE_LENGTH_EXT = ESC + b"(C" # ESC (C - 设置页长
# ============================================================
# FS 系列汉字命令 (ESC/P-K 特有)
# ============================================================
[文档]
class FSCommand:
"""LQ-635KII FS 系列汉字命令常量
ESC/P-K 特有的汉字模式控制命令
"""
FS = b"\x1c" # FS 前缀
# 汉字倍宽倍高
SO = FS + b"\x0e" # FS SO - 汉字倍宽开
DC4 = FS + b"\x14" # FS DC4 - 汉字倍宽关
W = FS + b"\x57" # FS W - 汉字倍高倍宽
w = FS + b"\x77" # FS w - 汉字倍高倍宽(变体)
DOT = FS + b"\x2e" # FS . - 汉字倍高倍宽
# 汉字行距
LINE_SPACING = FS + b"\x32" # FS 2 - 汉字行距 1/6 英寸
# 汉字字体
FONT = FS + b"\x72" # FS r - 汉字字体选择
FONT_ALT = FS + b"\x6b" # FS k - 汉字字体选择(变体)
# 汉字位置移动
SHIFT_RIGHT = FS + b"\x4a" # FS J - 汉字右移
SHIFT_LEFT = FS + b"\x4b" # FS K - 汉字左移
VERTICAL_MOVE = FS + b"\x76" # FS v - 汉字垂直移动
# 汉字上下标
SUPERSCRIPT = FS + b"\x53" # FS S - 汉字上标
SUBSCRIPT_OFF = FS + b"\x54" # FS T - 汉字下标/取消
# 汉字高度/垂直调整
HEIGHT_ADJUST = FS + b"\x55" # FS U - 汉字高度调整
VERTICAL_ADJUST = FS + b"\x56" # FS V - 汉字垂直调整
# 汉字打印模式
PRINT_MODE = FS + b"\x78" # FS x - 汉字打印方式
MODE_COMBINE = FS + b"\x21" # FS ! - 汉字打印模式组合
# 汉字下载
DOWNLOAD = FS + b"\x26" # FS & - 汉字下载
CONTROL = FS + b"\x28\x49" # FS (I - 汉字控制
# ============================================================
# 枚举类型
# ============================================================
[文档]
class Align(IntEnum):
"""对齐方式"""
LEFT = 0
CENTER = 1
RIGHT = 2
JUSTIFY = 3
[文档]
class PrintQuality(IntEnum):
"""打印品质"""
DRAFT = 0 # 草体 (快速)
LETTER = 1 # 文书体 (高质量)
[文档]
class Font(IntEnum):
"""西文字体"""
ROMAN = 0
SANS_SERIF = 1
COURIER = 2
PRESTIGE = 3
SCRIPT = 4
[文档]
class PaperSize:
"""纸张尺寸
Attributes:
width_mm: 纸张宽度 (毫米)
height_mm: 纸张高度 (毫米)
name: 纸张名称
"""
def __init__(self, width_mm: float, height_mm: float, name: str = "") -> None:
"""初始化纸张尺寸
Args:
width_mm: 纸张宽度 (毫米)
height_mm: 纸张高度 (毫米)
name: 纸张名称,为空时自动生成
"""
self.width_mm = width_mm
self.height_mm = height_mm
self.name = name or f"{width_mm}x{height_mm}mm"
[文档]
@classmethod
def certificate(cls) -> PaperSize:
"""合格证纸张 (60x100mm)
Returns:
PaperSize: 60x100mm 合格证纸张尺寸
"""
return cls(60.0, 100.0, "合格证")
[文档]
@classmethod
def a4(cls) -> PaperSize:
"""A4 纸张 (210x297mm)
Returns:
PaperSize: 210x297mm A4 纸张尺寸
"""
return cls(210.0, 297.0, "A4")
[文档]
@classmethod
def a5(cls) -> PaperSize:
"""A5 纸张 (148x210mm)
Returns:
PaperSize: 148x210mm A5 纸张尺寸
"""
return cls(148.0, 210.0, "A5")
[文档]
@classmethod
def letter(cls) -> PaperSize:
"""Letter 纸张 (216x279mm)
Returns:
PaperSize: 215.9x279.4mm Letter 纸张尺寸
"""
return cls(215.9, 279.4, "Letter")
[文档]
class PrinterDPI(IntEnum):
"""打印机分辨率"""
DPI_60 = 60
DPI_90 = 90
DPI_120 = 120
DPI_180 = 180
DPI_240 = 240
DPI_360 = 360