【发布时间】:2009-02-13 06:32:56
【问题描述】:
我知道以前有人问过这个问题,但没有明确的答案。
如何以编程方式更改打印机托盘?
我正在尝试使用 python 批量打印一些 PDF。我需要从不同的纸盘打印不同的页面。打印机是理光2232C。有没有办法通过 Acrobat Reader 命令行参数来做到这一点?我可以使用 Win32 api 找出哪些 bin 对应于哪些 binnames,但仅此而已。有什么建议/捷径/等等吗?
【问题讨论】:
我知道以前有人问过这个问题,但没有明确的答案。
如何以编程方式更改打印机托盘?
我正在尝试使用 python 批量打印一些 PDF。我需要从不同的纸盘打印不同的页面。打印机是理光2232C。有没有办法通过 Acrobat Reader 命令行参数来做到这一点?我可以使用 Win32 api 找出哪些 bin 对应于哪些 binnames,但仅此而已。有什么建议/捷径/等等吗?
【问题讨论】:
好的,我想通了。答案是:
1.您需要一台本地打印机(如果您需要打印到网络打印机,请下载驱动程序并将其添加为本地打印机)
2.使用win32print获取和设置默认打印机
3.同样使用win32print,使用如下代码:
import win32print
PRINTER_DEFAULTS = {"DesiredAccess":win32print.PRINTER_ALL_ACCESS}
pHandle = win32print.OpenPrinter('RICOH-LOCAL', PRINTER_DEFAULTS)
properties = win32print.GetPrinter(pHandle, 2) #get the properties
pDevModeObj = properties["pDevMode"] #get the devmode
automaticTray = 7
tray_one = 1
tray_two = 3
tray_three = 2
printer_tray = []
pDevModeObj.DefaultSource = tray_three #set the tray
properties["pDevMode"]=pDevModeObj #write the devmode back to properties
win32print.SetPrinter(pHandle,2,properties,0) #save the properties to the printer
使用 Internet Explorer 完成打印(来自 Graham King 的博客)
from win32com import client
import time
ie = client.Dispatch("InternetExplorer.Application")
def printPDFDocument(filename):
ie.Navigate(filename)
if ie.Busy:
time.sleep(1)
ie.Document.printAll()
ie.Quit()
完成
【讨论】:
使用纯 PDF 无法做到这一点,因为您已经为任何特定的纸盒和托盘组合创建了新的打印作业(并非所有打印机都允许您这样做,Xerox 4x 和 DP 系列允许您做这样的事情)。
我最好的选择是使用 PostScript:将 PDF 转换为 PostScript,您可以在其中访问各个页面,然后提取您需要的页面,并为每个这样的页面(或页面)创建新的打印作业(例如,使用 Windows 程序lpr)。为了简化任务,我会为您必须打印到的纸盒和托盘的任意组合创建打印队列,然后将这些队列用作打印机。
【讨论】:
没有简单的方法可以做到这一点,因为您表示要从 pdf 中选择特定页面并使用 Acrobat Reader 将它们打印到特定的垃圾箱
示例:在信头纸箱 1 上打印第 1 页,在纸箱 2 上打印第 2 页
Acrobat Reader 只允许从命令行打印整个文档:
您可以更改免费软件 Ghostscript 并做您想做的事。
或者这个商业产品应该可以完成这项工作。 PDFPrint
有关详细信息,请参阅第 24 页的 Acrobat Reader developer FAQ
AcroRd32.exe /t path "printername" "drivername" "portname" — 启动 Adobe Reader 并打印文件,同时取消打印对话框。必须完整指定路径。
/t 选项的四个参数计算为路径、打印机名、驱动程序名和端口名(所有字符串)。
printername — 您的打印机的名称。
drivername — 您的打印机驱动程序的名称,它显示在您的打印机属性中。
portname — 打印机的端口。 portname 不能包含 - 您的打印机驱动程序的名称,它显示在您的打印机属性中。
portname — 打印机的端口。端口名不能包含
【讨论】:
您已经拥有一台 Ricoh 机器,只需获取 Ricoh Print&Share 软件,您就可以在其中定义要使用的托盘!
这些视频向您展示了如何设置 Ricoh Print&Share 软件:
【讨论】: