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

8
我正在尝试使用Python在Windows上编写打印机自动化,但无法完成。
我不是很理解这个话题,而且有点惊讶 - 似乎不存在“简单”的方法来完成这项任务?有很多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的预设,它们可以工作。该工具有选项可以通过传递测量值(in/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正常工作,我也不知道是否可以使用它,所有的用法示例都只演示如何向打印机发送文本字符串。那不是我所需要的,也不是我想知道的。
有没有一种简单明了的工作方案来打印文件并设置打印大小呢?
欢迎提供想法和提示!

1
你误解了打印过程。打印机驱动程序不接受文件,它依赖于应用程序将文件转换为Windows API调用。这就是为什么这个过程并不“简单”的原因。即使打印机本身能够解码文件,你也需要以特殊的原始模式打开驱动程序来绕过通常的处理过程。 - Mark Ransom
2个回答

3

请查看Tim Golden网站上的“如何打印”页面。当您提出问题时,该页面在2014年保持不变。有一个示例打印JPG文件,还可以操作打印机设置。

这并不是您正在做的完美示例,但应该可以帮助您找到正确的方向。

DC_PAPERS在win32con中定义:

import win32con
x = win32con.DC_PAPERS

你应该如何知道这一点,我不知道。也许对于已经熟悉Win32API的人来说,这是“显而易见”的......


2
问题在于你使用了from win32print import *。 最新的Python 3+ win32print包不再将子模块存储在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)

1
我不再需要这个了,但是在使用Python 3时可能会有帮助!谢谢! - xph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接