如何通过pycups的PrintFile函数打印PWG/Raster文件,实现lp的-o raw效果?
问题
我已经把PDF文件转换成了PWG/Raster格式,请问怎么用pycups的PrintFile函数打印?
用lp命令时,我可以加-o raw选项打印原始文件,但在pycups里该怎么实现这个操作?
我查了相关文档没找到答案,以下是我写的代码:
import cups import subprocess def print_pwg_raster(file_path, printer_name, page_range=None): conn = cups.Connection() printer_info = conn.getPrinters() if printer_name in printer_info: options = ["-m", "image/pwg-raster"] if page_range: options.extend(["-o", f"page-ranges={page_range}"]) # Convert the file to PWG Raster using cupsfilter pwg_raster_data = subprocess.check_output(["cupsfilter"] + options + [file_path]) # Get the printer URI printer_uri = printer_info[printer_name]["device-uri"] # Send the PWG Raster data as raw print data print_job = conn.printFile(printer_name, file_path, "Print Job" , options= {???} #options ) print("Print job ID:", print_job) else: print("Printer not found:", printer_name) file_path = "/home/.../w1.pdf" # Replace with the actual file path printer_name = "Canon_G5000_series" # Replace with the desired printer name page_range = "1-2" # Replace with the desired page range, e.g., "1-3" for pages 1 to 3 print_pwg_raster(file_path, printer_name, page_range)
解决方案
1. pycups中实现raw打印的核心选项
对应lp -o raw的操作,在pycups里只需给printFile(或printData)的options参数传入{"raw": "yes"}即可,这个选项会让CUPS跳过自动过滤流程,直接把原始数据发送给打印机。
2. 修正代码的关键问题
你的代码里有个核心错误:用cupsfilter生成了PWG Raster数据,但printFile仍然传入原PDF的路径,导致打印的还是原始PDF而非转换后的PWG文件。下面提供两种修正方案:
方案一:用临时文件保存转换后的数据再打印
import cups import subprocess import tempfile import os def print_pwg_raster(file_path, printer_name, page_range=None): conn = cups.Connection() printer_info = conn.getPrinters() if printer_name in printer_info: options = ["-m", "image/pwg-raster"] if page_range: options.extend(["-o", f"page-ranges={page_range}"]) # 转换PDF为PWG Raster格式 pwg_raster_data = subprocess.check_output(["cupsfilter"] + options + [file_path]) # 创建临时文件存储转换后的数据 with tempfile.NamedTemporaryFile(delete=False, suffix='.pwg') as temp_file: temp_file.write(pwg_raster_data) temp_file_path = temp_file.name try: # 带raw选项打印临时文件 print_job = conn.printFile( printer_name, temp_file_path, "PWG Raster Print Job", options={"raw": "yes"} ) print("Print job ID:", print_job) finally: # 打印完成后删除临时文件 os.unlink(temp_file_path) else: print("Printer not found:", printer_name) file_path = "/home/.../w1.pdf" printer_name = "Canon_G5000_series" page_range = "1-2" print_pwg_raster(file_path, printer_name, page_range)
方案二:直接用printData发送字节数据(更高效)
pycups提供的printData函数可以直接发送字节数据,无需创建临时文件:
import cups import subprocess def print_pwg_raster(file_path, printer_name, page_range=None): conn = cups.Connection() printer_info = conn.getPrinters() if printer_name in printer_info: options = ["-m", "image/pwg-raster"] if page_range: options.extend(["-o", f"page-ranges={page_range}"]) # 转换PDF为PWG Raster格式 pwg_raster_data = subprocess.check_output(["cupsfilter"] + options + [file_path]) # 直接发送原始PWG数据,指定raw选项 print_job = conn.printData( printer_name, pwg_raster_data, "PWG Raster Print Job", options={"raw": "yes"} ) print("Print job ID:", print_job) else: print("Printer not found:", printer_name) file_path = "/home/.../w1.pdf" printer_name = "Canon_G5000_series" page_range = "1-2" print_pwg_raster(file_path, printer_name, page_range)
补充说明
{"raw": "yes"}是实现原始打印的关键,它确保CUPS不会对PWG/Raster数据做额外处理。- 若打印机原生支持PWG/Raster格式,使用该选项即可正常打印;少数老旧打印机可能需要调整驱动设置,但现代打印机基本都兼容该格式。
内容的提问来源于stack exchange,提问作者Zain Khaishagi
相关产品推荐
相关产品推荐

