首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python、win32api和Acrobat Reader9打印PDF

使用Python、win32api和Acrobat Reader9打印PDF
EN

Stack Overflow用户
提问于 2012-03-14 00:28:23
回答 1查看 4K关注 0票数 3

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

我用python写了一个快速脚本,用默认的注册应用程序(Acrobat Reader9)用win32api将pdf打印到我的打印机上,然后在任务完成时终止任务,因为acrobat喜欢在从命令行调用时让窗口保持打开状态。

我将其编译成可执行文件,并通过命令行传递这些值(例如,printer.exe %OUTFILE% %PRINTER%),然后在批处理文件中调用

代码语言:javascript
复制
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的问题,还是其他什么问题。

如有任何建议或意见,我们将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 16:31:31

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

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

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

Acrobat

  • 将其转换为服务器脚本,该脚本一次启动Acrobat,然后将许多打印命令发送到同一进程,并终止afterwards.

  • Use全局锁,以确保只有一个脚本在运行。我建议在某个地方创建一个文件夹;这是对每个文件系统的原子操作。如果文件夹存在,则脚本在某个位置处于活动状态。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9688028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档