Python中如何使用win32api进行打印,避免页面顶部出现空白区域?

代码是参照 http://timgolden.me.uk/python/win32_how_do_i/print.html Single image: use PIL and win32ui 这一章节 应该是某个地方缺少一个设置,但是找了半天文档找不到,Google 也没有找到。看看有没有大神知道的?

如图

图片


Python中如何使用win32api进行打印,避免页面顶部出现空白区域?

7 回复

可能是默认的打印机驱动参数不正确造成的。在初始化 printer 的时候,你可能根据你的纸张重新设定参数。参考 http://timgolden.me.uk/pywin32-docs/PRINTER_DEFAULTS.html


import win32api
import win32print
import win32con

def print_without_top_margin(filename, printer_name=None):
    """
    打印文件并避免页面顶部出现空白区域
    
    参数:
        filename: 要打印的文件路径
        printer_name: 打印机名称,如果为None则使用默认打印机
    """
    try:
        # 1. 获取打印机句柄
        if printer_name:
            printer_handle = win32print.OpenPrinter(printer_name)
        else:
            printer_name = win32print.GetDefaultPrinter()
            printer_handle = win32print.OpenPrinter(printer_name)
        
        # 2. 获取打印机默认设置
        printer_info = win32print.GetPrinter(printer_handle, 2)
        devmode = printer_info['pDevMode']
        
        # 3. 修改打印设置,移除顶部边距
        # 设置纸张来源为自动选择
        devmode.Fields |= win32con.DM_PAPERSOURCE
        devmode.DefaultSource = win32con.DMBIN_AUTO
        
        # 设置纸张大小为A4
        devmode.Fields |= win32con.DM_PAPERSIZE
        devmode.PaperSize = win32con.DMPAPER_A4
        
        # 关键:设置边距为0
        # 注意:有些打印机驱动可能不支持零边距打印
        devmode.Fields |= win32con.DM_FORMNAME
        devmode.FormName = "Custom Form"
        
        # 4. 更新打印机设置
        win32print.DocumentProperties(
            0,  # hwnd
            printer_handle,
            printer_name,
            devmode,
            devmode,
            win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER
        )
        
        # 5. 开始打印作业
        job_id = win32print.StartDocPrinter(
            printer_handle,
            1,
            ("Print Job", None, "RAW")
        )
        
        try:
            win32print.StartPagePrinter(printer_handle)
            
            # 6. 读取文件内容并发送到打印机
            with open(filename, 'rb') as f:
                content = f.read()
                win32print.WritePrinter(printer_handle, content)
            
            win32print.EndPagePrinter(printer_handle)
            
        finally:
            # 7. 结束打印作业
            win32print.EndDocPrinter(printer_handle)
            
        # 8. 关闭打印机句柄
        win32print.ClosePrinter(printer_handle)
        
        print(f"文件 '{filename}' 已发送到打印机 '{printer_name}'")
        
    except Exception as e:
        print(f"打印出错: {str(e)}")
        raise

# 使用示例
if __name__ == "__main__":
    # 打印一个文本文件
    print_without_top_margin("test.txt")
    
    # 或者指定打印机
    # print_without_top_margin("test.txt", "你的打印机名称")

核心要点:

  1. 修改DEVMODE结构:通过DocumentProperties函数获取并修改打印机的DEVMODE结构,这是控制打印设置的关键。

  2. 边距控制:虽然代码中设置了FormName,但实际边距控制取决于:

    • 打印机驱动是否支持零边距
    • 应用程序的打印内容本身是否包含边距
  3. 替代方案:如果上述方法仍产生空白,可以考虑:

    # 使用ShellExecute直接打印(简单但控制少)
    import os
    os.startfile("test.txt", "print")
    
  4. 重要限制:某些打印机固件会强制保留最小边距,这是硬件限制。

一句话建议:先检查打印机驱动是否支持零边距打印。

谢谢 我看一下

我建议找个 C/C++ 的代码测试成功后翻译到 Python。

谢谢 ~~ 我到网上找一下

格式简单就用 raw pcl
打印原始语言组一个!我也在寻找 python 打印方式
转 PDF 或者 txt 都麻烦,你打印内容多不?

我主要打印快递单~~ 内容不少。

回到顶部