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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:10:30