2012-03-13 311 views
3

我有报告说我正在发送到需要报告为可读PDF格式的系统。我尝试了所有免费的图书馆和应用程序,而我发现的唯一工作是Adobe的acrobat系列。使用Python,win32api和Acrobat Reader打印PDF文件9

我在python中编写了一个快速脚本,它使用win32api以默认注册应用程序(Acrobat Reader 9)将PDF打印到我的打印机,然后在完成后终止任务,因为acrobat喜欢在从命令行。

予编译成一个可执行与通过命令行 中的值传递(例如printer.exe%OUTFILE%%PRINTER%),这是一个随后批处理文件

import os,sys,win32api,win32print,time 

# Command Line Arguments. 
pdf = sys.argv[1] 
tempprinter = sys.argv[2] 

# Get Current Default Printer. 
currentprinter = win32print.GetDefaultPrinter() 
# Set Default printer to printer passed through command line. 
win32print.SetDefaultPrinter(tempprinter) 
# Print PDF using default application, AcroRd32.exe 
win32api.ShellExecute(0, "print", pdf, None, ".", 0) 
# Reset Default Printer to saved value 
win32print.SetDefaultPrinter(currentprinter) 
# Timer for application close 
time.sleep(2) 
# Kill application and exit scipt 
os.system("taskkill /im AcroRd32.exe /f") 

这似乎内调用在3-4小时内为大量工作〜2000份报告,但我有一些下降,我不知道脚本是否被压倒,或者如果我应该看看多线程或其他东西。

事实上,它处理如此大量的数据而没有丢弃,这让我相信问题不在于脚本,但我不确定它是否与主机系统或Adobe Reader或其他问题有关。

任何建议或意见将不胜感激。

+1

'win32api.ShellExecute()'是否同步?即是否等到AcrobatReader完成打印? – 2012-03-13 16:34:09

+0

根据文档我不这么认为,这就是为什么我设置计时器,我总是可以扩展时间范围。我考虑了产卵过程,以便我可以知道应用程序何时结束。问题是我不知道打印作业何时在打印机上实际打印。它的变量取决于网络流量,打印命令需要处理多长时间。 – dwtorres 2012-03-13 21:29:08

+0

我对你的第一句话有点困惑;什么不适用于“免费图书馆和应用程序”?打印的PDF是不可读的,还是根本没有打印,或者它们是否无法创建正确的PDF? – 2012-03-14 08:32:54

回答

2

根据您的意见(win32api.ShellExecute()可能是而不是同步),您的问题是超时:如果您的计算机或打印队列繁忙,kill命令可能会过早。

如果您的脚本同时运行(即,您一次打印所有文档而不是一个接一个地打印),kill命令甚至可以杀死错误的进程(即由另一个脚本调用启动的acrobat进程)。

所以你需要它更好的同步。有一对夫妇的事情,你可以尝试:

  1. 转换成一次启动Acrobat中的服务器脚本本,然后将许多打印命令相同的过程和事后终止。

  2. 使用全局锁定来确保只有一个脚本正在运行。我建议在某处创建一个文件夹;这是对每个文件系统的原子操作。如果该文件夹存在,该脚本在某处处于活动状态。

最重要的是,您需要知道作业何时完成。为此使用win32print.EnumJobs()

如果失败了,另一个解决方案可能是在某处安装Linux服务器。您可以在此框上运行Python服务器,该服务器接受您在客户端计算机上借助于小型Python脚本发送的打印作业。然后服务器可以在后台打印PDF文件。

此方法允许您添加任何类型的监控(如果发生故障,发送邮件或在所有作业完成后发送状态邮件)。

相关问题