我不是很理解这个话题,而且有点惊讶 - 似乎不存在“简单”的方法来完成这项任务?有很多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正常工作,我也不知道是否可以使用它,所有的用法示例都只演示如何向打印机发送文本字符串。那不是我所需要的,也不是我想知道的。
有没有一种简单明了的工作方案来打印文件并设置打印大小呢?
欢迎提供想法和提示!