certflow.services.printer_manager module

Windows 打印机管理服务

封装 win32print + win32ui 底层调用,提供打印机枚举、状态查询、 GDI 精确打印、PDF/图片/HTML 打印等功能。

64-bit Python 环境兼容,不依赖 Access/32位 ODBC。

class certflow.services.printer_manager.PrinterStatus(*values)[源代码]

基类:Enum

打印机状态枚举

READY = '就绪'
PAUSED = '暂停'
ERROR = '错误'
PENDING = '待机'
PAPER_OUT = '缺纸'
OFFLINE = '离线'
UNKNOWN = '未知'
class certflow.services.printer_manager.PaperSize(*values)[源代码]

基类:Enum

纸张大小枚举

CERTIFICATE_60x100 = (60, 100, '合格证标准 (60x100mm)')
CERTIFICATE_130x75 = (130, 75, '合格证 (130x75mm)')
A4 = (210, 297, 'A4 (210x297mm)')
CUSTOM = (0, 0, '自定义')
classmethod from_name(name)[源代码]

根据名称查找纸张规格。

参数:

name (str) -- 显示名称或枚举名(如 "A4"、"合格证标准 (60x100mm)")。

返回:

匹配到的纸张规格,未匹配时返回 PaperSize.CUSTOM。

返回类型:

PaperSize

class certflow.services.printer_manager.PrinterInfo(name, port='', driver='', status=PrinterStatus.UNKNOWN, is_default=False, paper_sizes=<factory>)[源代码]

基类:object

打印机信息

参数:
name: str
port: str = ''
driver: str = ''
status: PrinterStatus = '未知'
is_default: bool = False
paper_sizes: list[str]
to_dict()[源代码]

序列化为字典。

返回:

包含 name/port/driver/status/is_default/paper_sizes 的字典。

返回类型:

dict

class certflow.services.printer_manager.PrintJob(job_id, document_name, printer_name, pages=0, copies=1, status='', submitted_time='')[源代码]

基类:object

打印任务信息

参数:
  • job_id (int)

  • document_name (str)

  • printer_name (str)

  • pages (int)

  • copies (int)

  • status (str)

  • submitted_time (str)

job_id: int
document_name: str
printer_name: str
pages: int = 0
copies: int = 1
status: str = ''
submitted_time: str = ''
class certflow.services.printer_manager.PrinterManager[源代码]

基类:QObject

打印机管理器

封装 Windows 打印子系统,提供打印机枚举、状态监控、 GDI 精确文字打印、文件打印等功能。

分层说明:本模块归属 services 层,不应被 UI 库强制绑定导入。 在无 PySide6(headless / 无 X11)环境下,信号与监控定时器自动降级为空操作, 模块仍可导入与实例化,仅丢失 GUI 事件通知能力。

Signals(仅 Qt 环境生效):

printer_added: 新增打印机 (name) printer_removed: 移除打印机 (name) printer_status_changed: 状态变化 (name, status) print_started: 打印开始 (doc_name, job_id) print_completed: 打印完成 (doc_name, job_id) print_failed: 打印失败 (doc_name, error_msg) progress_updated: 进度更新 (current, total)

printer_added
printer_removed
printer_status_changed
print_started
print_completed
print_failed
progress_updated
printers: dict[str, PrinterInfo]
current_printer: str | None
pending_jobs: list[PrintJob]
get_printers()[源代码]

获取所有打印机。

返回:

当前已枚举的打印机信息列表。

返回类型:

list[PrinterInfo]

get_printer_names()[源代码]

获取打印机名称列表。

返回:

打印机名称列表。

返回类型:

list[str]

get_default_printer()[源代码]

获取默认打印机名称。

返回:

默认打印机名称,获取失败时回退到当前打印机。

返回类型:

str | None

set_default_printer(printer_name)[源代码]

设置默认打印机。

参数:

printer_name (str) -- 目标打印机名称。

返回:

设置是否成功。

返回类型:

bool

get_printer_status(printer_name=None)[源代码]

获取打印机状态。

参数:

printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

对应打印机状态,未知时返回 PrinterStatus.UNKNOWN。

返回类型:

PrinterStatus

is_printer_ready(printer_name=None)[源代码]

检查打印机是否就绪。

参数:

printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

True 表示打印机处于就绪状态。

返回类型:

bool

print_text_only(data, serial_number, printer_name=None)[源代码]

使用 win32 GDI 精确打印文字到预印卡纸

在 60mm × 100mm 预印卡纸的指定坐标位置输出文字。 卡纸已预印底板(边框、标题、品保章等),打印机只输出动态文字。 跳过空值字段,避免覆盖卡纸原有内容。

参数:
  • data (dict[str, Any]) -- 打印数据字典,包含 product_name, product_model, dn, pn, temperature, medium, check_standard, inspector_id, manufacture_date

  • serial_number (str) -- 产品编号(逐台打印时不同)

  • printer_name (str | None) -- 打印机名称,默认使用系统默认打印机

返回:

打印是否成功

返回类型:

bool

print_file(file_path, printer_name=None, copies=1)[源代码]

打印文件(PDF/图片/文本)。

参数:
  • file_path (str) -- 待打印文件的完整路径。

  • printer_name (str | None) -- 目标打印机名称,为 None 时使用默认打印机。

  • copies (int) -- 打印份数。

返回:

(是否成功, 作业 ID),失败时作业 ID 为 None。

返回类型:

tuple[bool, int | None]

print_html(html_content, printer_name=None, copies=1)[源代码]

打印 HTML 内容(先转换为 PDF 再打印)。

参数:
  • html_content (str) -- HTML 字符串内容。

  • printer_name (str | None) -- 目标打印机名称,为 None 时使用默认打印机。

  • copies (int) -- 打印份数。

返回:

(是否成功, 作业 ID),失败时作业 ID 为 None。

返回类型:

tuple[bool, int | None]

get_print_queue(printer_name=None)[源代码]

获取打印队列。

参数:

printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

当前打印队列中的任务列表。

返回类型:

list[PrintJob]

cancel_job(job_id, printer_name=None)[源代码]

取消打印任务。

参数:
  • job_id (int) -- 打印作业 ID。

  • printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

取消是否成功。

返回类型:

bool

pause_printer(printer_name=None)[源代码]

暂停打印机。

参数:

printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

暂停是否成功。

返回类型:

bool

resume_printer(printer_name=None)[源代码]

恢复打印机。

参数:

printer_name (str | None) -- 打印机名称,为 None 时使用默认打印机。

返回:

恢复是否成功。

返回类型:

bool

save_settings(settings_file='printer_settings.json')[源代码]

保存打印机设置到 JSON 文件。

参数:

settings_file (str) -- 设置文件路径,默认为 "printer_settings.json"。

返回类型:

None

load_settings(settings_file='printer_settings.json')[源代码]

从 JSON 文件加载并设置默认打印机。

参数:

settings_file (str) -- 设置文件路径,默认为 "printer_settings.json"。

返回类型:

None

static cleanup_temp_files()[源代码]

清理系统中本模块产生的临时 HTML/PDF 文件。

返回类型:

None

staticMetaObject = PySide6.QtCore.QMetaObject("PrinterManager" inherits "QObject": Methods:   #4 type=Signal, signature=printer_added(QString), parameters=QString   #5 type=Signal, signature=printer_removed(QString), parameters=QString   #6 type=Signal, signature=printer_status_changed(QString,PyObject), parameters=QString, PyObject   #7 type=Signal, signature=print_started(QString,int), parameters=QString, int   #8 type=Signal, signature=print_completed(QString,int), parameters=QString, int   #9 type=Signal, signature=print_failed(QString,QString), parameters=QString, QString   #10 type=Signal, signature=progress_updated(int,int), parameters=int, int )