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

时间:2014-05-15 20:55:19

标签: python pdf printing command-line

我正在尝试使用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-package,包括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,所有使用示例仅显示如何将文本字符串发送到打印机。这不是我需要的,这不是我想知道的。

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

欢迎提出想法和提示!

2 个答案:

答案 0 :(得分:1)

看看" How To Print" Tim Golden网站上的页面。当您提出问题时,此页面在2014年是相同的。这是一个打印JPG文件的示例,该文件也可以操作打印机设置。

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

DC_PAPERS在win32con中定义:

import win32con
x = win32con.DC_PAPERS

你应该怎么知道,我不知道。也许它很明显"那些已经熟悉Python之外的Win32API的人......

答案 1 :(得分:1)

问题是您正在使用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)