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

如何将打印文件部分按二进制、部分按文本读取处理?

处理含二进制头部、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:06:32