使用Python,win32api和Acrobat Reader 9打印PDF

时间:2012-03-13 16:28:23

标签: python windows printing adobe acrobat

我有报告称我发送的系统要求报告采用可读的PDF格式。我尝试了所有免费的库和应用程序,我发现的唯一一个是Adobe的acrobat系列。

我在python中编写了一个快速脚本,使用win32api将pdf打印到我的打印机,使用默认的注册应用程序(Acrobat Reader 9)然后在完成后终止任务,因为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")

这似乎适用于大量的,大约2000个报告在3-4个小时内,但我有一些下降,我不确定脚本是否不堪重负或我是否应该研究多线程或别的。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

所以你需要它更好的同步。您可以尝试以下几种方法:

  1. 将其转换为启动Acrobat一次的服务器脚本,然后将多个打印命令发送到同一进程并在之后终止。

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

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

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

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