如何将待打印PDF发送至Python脚本而非实体打印机
RedMon重定向打印流到Python脚本的实现方案
核心原理
RedMon作为端口重定向监视器,不会向你绑定的程序传入现成的PDF文件路径,所有打印任务的原始数据会通过**标准输入(stdin)**以二进制流的形式直接推送给目标程序,你只需要在脚本中读取该流即可拿到待处理的打印内容。
配置与实现步骤
- 先校准RedMon端口配置
打开对应RedMon端口的配置页,在Program to run栏填入你打包好的Python exe绝对路径,Arguments for program栏留空即可,程序运行身份选择当前登录用户,输出选项选择「Program handles output」即可,不要额外配置文件传参规则。 - Python脚本读取打印流的核心实现
注意必须用二进制模式读取stdin,否则会破坏PDF文件结构,参考代码如下:import sys import tempfile import os # 读取RedMon传入的二进制打印流 print_stream = sys.stdin.buffer.read() # 将流写入临时PDF文件,供后续处理 temp_pdf = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) temp_pdf.write(print_stream) temp_pdf.close() temp_pdf_path = temp_pdf.name # 以下替换为你的自定义PDF处理逻辑,示例为读取PDF页数 import fitz pdf_doc = fitz.open(temp_pdf_path) page_count = pdf_doc.page_count pdf_doc.close() # 处理完成后删除临时文件,避免垃圾文件堆积 os.remove(temp_pdf_path) - 打包exe注意事项
用PyInstaller打包脚本时不要加--windowed/-w参数,否则程序没有控制台上下文,无法读取stdin流,直接用pyinstaller -F 你的脚本名.py打包即可。
常见问题排查
- 如果读取保存的文件不是有效PDF:检查你绑定RedMon端口的打印机驱动,必须使用能输出原生PDF的驱动(比如Microsoft Print to PDF),如果用的是PostScript、PCL类的通用打印驱动,传入的流是对应打印指令格式,不是PDF,需要额外做格式转换。
- 如果脚本完全没收到数据:检查RedMon配置里的程序路径是否正确,是否给了exe足够的运行权限,不要把参数栏填成
%1这类传文件路径的占位符。 - 如果拿到的PDF内容乱码:确认读取stdin时用的是
sys.stdin.buffer.read()二进制读取模式,不要用默认的文本模式读。
后续PDF处理参考
拿到有效PDF的临时路径后,你可以用常规Python PDF库完成任意处理:
- 文本提取、页面渲染:用PyMuPDF(fitz)
- PDF拆分、合并、元数据修改:用pypdf
- 加水印、表单填充:用reportlab配合pypdf实现
内容的提问来源于stack exchange,提问作者Mr I
相关产品推荐
相关产品推荐

