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

读取SPL打印池文件并追加信息转发,求解析Raw .spl结构提取打印文本

处理Raw格式SPL文件的实操方案

核心前提:Raw SPL的本质

Raw类型的SPL文件没有通用结构——它就是直接发送给原打印机的原始指令流,完全依赖打印机的指令集(比如PCL、PostScript、ESC/POS),和EMF格式SPL的统一Windows GDI结构完全不同。所以第一步必须明确原打印机的指令类型。


1. 识别打印机指令集

  • 查看原打印机的驱动设置,确认其使用的打印语言(比如“PCL 6”“PostScript Level 3”“ESC/POS”)。
  • 用二进制编辑器打开SPL文件,通过特征码快速判断:
    • PostScript:开头是%!PS
    • PCL:开头包含\x1B%-12345X(ESC+%-12345X)
    • ESC/POS:大量以\x1B(ESC字符)开头的控制序列
  • 找到对应指令集的官方规范文档(比如HP的PCL手册、EPSON的ESC/POS手册),这是后续操作的核心依据。

2. 提取有效打印内容(按需操作)

如果需要提取纯文本,不同指令集的处理方式不同:

  • 文本类指令集(ESC/POS、基础PCL):过滤掉控制指令即可。示例(Python):
    import re
    with open("raw_job.spl", "rb") as f:
        raw_data = f.read()
    # 剔除ESC/POS控制指令(匹配ESC开头的序列)
    text_content = re.sub(b'\x1B.*?(?=[\x20-\x7E]|\x0A|\x0D|\x1B)', b'', raw_data)
    # 注意编码:不同打印机可能用GBK、UTF-8等,需根据实际调整
    print(text_content.decode('gbk'))
    
  • 矢量类指令集(PostScript):直接提取文本难度高,可将SPL内容作为PS源码,用ps2pdf转成PDF后再提取,或用专门的PS解析库(如PyPDF2)处理。

3. 在SPL末尾追加内容

追加的内容必须符合目标打印机的指令集,不能直接加纯文本(否则打印机可能输出乱码):

  • 若原SPL和目标打印机用同一种指令集,直接追加对应格式的内容即可。比如给ESC/POS打印机追加一行“打印完成”:
    # ESC/POS指令:换行+文本+换行+切纸
    append_data = b'\x0A打印完成\x0A\x1B\x69'
    modified_raw = raw_data + append_data
    
  • 若指令集不同,需先将原SPL转成目标打印机的指令格式,再追加内容(可借助驱动转换工具或第三方库)。

4. 转发到目标打印机

有两种常用方式:

  • Windows API方式(适合本地/共享打印机):
    import win32print
    target_printer = "目标打印机名称"
    h_printer = win32print.OpenPrinter(target_printer)
    try:
        # 启动打印任务
        win32print.StartDocPrinter(h_printer, 1, ("Modified Print Job", None, "RAW"))
        win32print.StartPagePrinter(h_printer)
        # 发送修改后的数据流
        win32print.WritePrinter(h_printer, modified_raw)
        win32print.EndPagePrinter(h_printer)
        win32print.EndDocPrinter(h_printer)
    finally:
        win32print.ClosePrinter(h_printer)
    
  • 直接端口发送(适合网络打印机,默认端口9100):
    import socket
    # 替换为目标打印机的IP和端口
    printer_addr = ("192.168.1.100", 9100)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(printer_addr)
    sock.sendall(modified_raw)
    sock.close()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:45:47