打印文件并配置打印机设置



我试图在Windows上使用Python编写打印机自动化代码,但无法完成。

我不是很理解这个话题,我有点惊讶——一个"简单"的方法来完成这个似乎不存在…?有很多api允许以一种漂亮而简单的方式访问常见的东西,但打印似乎是一些"特殊"的东西…?

,

这是我所拥有的和我想要做的:

  • 有PDF文件。PDF已经存在,我不想创建PDF或任何其他文件类型。我想打印这个PDF文件。

  • 文件可以是横向和纵向布局。文件的大小可以是A4、A3、A2、A1和A0。

  • 我喜欢使用普通的"物理"打印机打印文件。打印机是一个网络设备,使用其IP连接。有各种各样的网络打印机,我希望能够使用不止一个。有些只是小型的a4打印机,有些是大型办公设备(集扫描、复印、打印于一体),还有大型绘图仪(高达A0大小的纸张)。

  • 我想写代码:"在这台打印机上打印这个PDF文件"。

  • 我喜欢配置打印尺寸。我想打印PDF"原样",以其原始尺寸-但我也希望能够在小尺寸的纸张上打印大格式。比如,PDF本身是A0大小,但我想在A3纸上打印它。或者原来的PDF大小是A2,我想打印在A4上。

  • 我想在Windows 7计算机(SP1, 64位)上使用它。我试着用python来编码。我正在使用python 2.7,因为我正在使用python 3中不可用的一些第三方模块。一般来说,任何可以通过python脚本触发的工作解决方案都是受欢迎的。

,

对我来说,这似乎不是一个非常"复杂"的任务。手工打印非常简单直接——选择文件,开始打印,选择打印机,选择纸张尺寸——然后打印。

用代码来做这件事似乎相当困难。以下是我到目前为止所了解到的情况。

  • 有各种各样的程序可以用于命令行打印,如"Acrobat Reader","Foxit Reader"或类似的程序。虽然使用这些程序提供的命令可以完美地打印,但无法访问打印机设置来配置纸张大小。

  • 有特殊的命令行打印工具,但我找不到任何有用的免费软件。我尝试过"VeryPDF"命令行工具,但是在纸张大小方面有一些问题。虽然它完美地支持各种字母格式和其他东西,但我需要的纸张大小(A4到A0)不知怎么就不支持了。有预设的A4和A3,这些工作。该工具可以通过传递测量值(单位为/pt/mm)来选择使用自定义纸张尺寸,但这并不像示例所示的那样工作,当使用这种方法时,它总是打印到A4。

  • 我找到了python的win32包,包括win32print。我不明白。该API提供了查找、添加或删除打印机、列出打印机队列、启动和停止打印机作业等功能,但没有打印文件的简单功能。似乎这个API可以通过python编码创建打印数据来添加打印机作业,在"文件"中推送一些文本和/或图形,并将其发送给打印机。

,

当使用这个win32print模块时,我无法让它正确工作。下面是我尝试使用的一个示例代码片段:

from win32print import *
printer = GetDefaultPrinterW()
handle = OpenPrinter(printer)
info = GetPrinter(handle, 2)
cap = DeviceCapabilities(info['pPrinterName'], info['pPortName'], DC_PAPERS)
ClosePrinter(handle)

…如下所示:

http://timgolden.me.uk/pywin32-docs/win32print__DeviceCapabilities_meth.html

但是这只是返回:

NameError: name 'DC_PAPERS' is not defined

当我试图使用一个需要传递这些常量的函数时,就会发生这种情况。我的系统中没有定义一个常数,我不知道为什么。

但我不知道如果我可以使用这个API,即使工作正常,所有的用法示例只是显示如何发送一个文本字符串到打印机。这不是我需要的,也不是我想知道的。

,

是否有任何可行的解决方案来打印文件并以简单直接的方式设置打印尺寸?

想法和提示欢迎!

看看Tim Golden网站上的"如何打印"页面。这个页面和2014年你提问的时候是一样的。下面是打印JPG文件的示例,该文件还可以操作打印机设置。

对于你正在做的事情来说,这不是一个完美的例子,但它应该能让你走上正轨。

DC_PAPERS在win32con中定义:

import win32con
x = win32con.DC_PAPERS
我不知道你怎么知道的。也许对于那些已经熟悉Python之外的Win32API的人来说,这是"显而易见的"……

问题是您正在使用from win32print import *win32print的最新python 3+包不会在win32print模块下存储子模块。

import win32print
import win32con
printer = win32print.GetDefaultPrinterW()
handle = win32print.OpenPrinter(printer)
info = win32print.GetPrinter(handle, 2)
cap = win32print.DeviceCapabilities(
    info['pPrinterName'], info['pPortName'], win32con.DC_PAPERNAMES)
print(cap)
win32print.ClosePrinter(handle)

最新更新