代码之家  ›  专栏  ›  技术社区  ›  Nikolaos Maragkos

设置一些打印机属性后,从Python 3打印word文档

  •  0
  • Nikolaos Maragkos  · 技术社区  · 2 年前

    我有一个单词文档,我想从Python内部打印出来。我还需要设置一些打印机属性,如托盘、双面打印等。 到目前为止,我只通过使用 win32api.ShellExecute 但这将打开Word进行打印,并将在Word中设置打印机属性,这是不可取的。 如果我使用 win32print 模块我可以根据需要设置属性,但无法将文档发送到打印机。

    在排序中,似乎适用于设置打印机属性的代码部分如下:

    import win32con
    import win32gui
    import win32print
    
    # pDevMode Constants
    # DefaultSource
    TRAY_1 = 260
    TRAY_2 = 259
    # Duplex
    SINGLE_SIDE = 1
    DUPLEX_OVER = 2
    DUPLEX_UP = 3
    # Color
    COLOR = 2
    MONOCHROME = 1
    
    device_name = win32print.GetDefaultPrinter()
    handle = win32print.OpenPrinter(device_name)
    
    properties = win32print.GetPrinter(handle, 2)
    devmode = properties['pDevMode']
    
    devmode.DefaultSource = TRAY_1
    devmode.Fields |= win32con.DM_DEFAULT_SOURCE
    
    win32print.DocumentProperties(None, handle, device_name, devmode, devmode, win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER)
    
    hdc = win32gui.CreateDC("", device_name, devmode)
    win32print.StartDoc(hdc, ("Print Document", None, None, 0))
    win32print.StartPage(hdc)
    
    ...
    
    win32print.EndPage(hdc)
    win32print.EndDoc(hdc)
    
    
    

    以上操作将从正确的纸盘中打印一个空页(如预期)。

    不过,我不知道如何发送这份文件。 我一直在阅读我的文件,并试图用以下内容发送到打印机:

                with open(document_path, "rb") as file:
                    data = file.read()
                    win32print.WritePrinter(printer_handle, data)
    

    但不起作用。

    我对win32print中的StartDoc/StartDocPrinter、StartPage/StartPagePrinter功能也有点困惑。。。到目前为止,我所做的一切似乎都不起作用。

    任何帮助都将不胜感激

    0 回复  |  直到 2 年前
        1
  •  1
  •   Nikolaos Maragkos    2 年前

    所以我最终还是成功了。。。

    显然没有必要 win32gui.CreateDC

    实际将pDevMode更改注册到打印机时,我缺少的是:

    win32print.SetPrinter(printer_handle, 2, properties, 0)
    

    就在之后 文档属性 线 不过,为了实现这一点,我必须将PRINTER_DEFAULTS参数添加到打印机句柄命令中,如下所示:

    PRINTER_DEFAULTS = {
        "DesiredAccess": win32print.PRINTER_ALL_ACCESS
    }
    
    printer_handle = win32print.OpenPrinter(printer_name, PRINTER_DEFAULTS)
    

    然后用 ShellExecute 命令我能够使用设置打印