如何将打印文件部分按二进制、部分按文本读取处理?
处理含二进制头部、PJL文本行的打印文件方案
核心思路
- 全程以二进制模式操作文件,避免编码问题破坏头部和尾部的二进制内容
- 先定位到首个
@PJL的起始位置,跳过前面的短二进制头部(≤100字节) - 逐行(按
\r分隔)读取连续的@PJL行,解码为ASCII文本处理(PJL是纯ASCII协议) - 处理完成后写回文件,尾部二进制内容保持原样
代码实现(Python)
def process_print_file_pjl(file_path): with open(file_path, 'rb+') as f: # 定位首个@PJL的位置(头部最多100字节) header = f.read(100) pjl_start = header.find(b'@PJL') if pjl_start == -1: return # 文件无PJL部分,直接返回 # 回到PJL内容的起始点 f.seek(pjl_start) # 读取所有连续的@PJL行 pjl_text_lines = [] while True: # 读取一行(以\r为结束符) current_line = b'' while True: byte = f.read(1) if not byte or byte == b'\r': break current_line += byte if current_line.startswith(b'@PJL'): # 解码为ASCII文本(PJL协议基于ASCII) pjl_text_lines.append(current_line.decode('ascii')) else: # 遇到非PJL行,回退指针,保留后续二进制内容 f.seek(f.tell() - len(current_line) - 1) break # --- 在此添加你的PJL文本处理逻辑 --- print("提取到的PJL内容:") for line in pjl_text_lines: print(line) # 示例:修改PJL内容后写回文件 if pjl_text_lines: pjl_text_lines[0] = pjl_text_lines[0].replace('ORIGINAL_CONTENT', 'UPDATED_CONTENT') # 将修改后的PJL内容写回文件 f.seek(pjl_start) for line in pjl_text_lines: f.write(line.encode('ascii') + b'\r')
关键注意事项
- 二进制模式强制要求:绝对不能用文本模式打开文件,否则会自动转换换行符或编码,破坏二进制数据
- PJL行分隔符:PJL行以
\r结尾,不是常见的\n,读取时必须按\r分割 - 编码兼容性:PJL是纯ASCII协议,解码/编码用
ascii即可,不会出现乱码 - 指针回退操作:遇到非PJL行时,必须将文件指针回退到该行的起始位置,避免覆盖后续二进制内容
- 内存效率:PJL行最多几十行,即使一次性读取所有内容,内存占用可以忽略不计
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

