读取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字符)开头的控制序列
- PostScript:开头是
- 找到对应指令集的官方规范文档(比如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
相关产品推荐
相关产品推荐

