Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印PDF';s使用Python、win32api和Acrobat Reader 9_Python_Windows_Printing_Adobe_Acrobat - Fatal编程技术网

打印PDF';s使用Python、win32api和Acrobat Reader 9

打印PDF';s使用Python、win32api和Acrobat Reader 9,python,windows,printing,adobe,acrobat,Python,Windows,Printing,Adobe,Acrobat,我将报告发送到一个系统,该系统要求报告采用可读的PDF格式。我尝试了所有的免费库和应用程序,发现唯一有效的是Adobe的acrobat系列 我用python编写了一个快速脚本,它使用win32api使用默认注册的应用程序(Acrobat Reader 9)将pdf打印到我的打印机,然后在完成任务时终止任务,因为Acrobat喜欢在从命令行调用时保持窗口打开 我将其编译成一个可执行文件,并通过命令行传入值 (例如printer.exe%OUTFILE%%printer%)然后在批处理文件中调用 i

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

我用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或其他方面的问题

如有任何建议或意见,将不胜感激

根据您的反馈(
win32api.ShellExecute()
可能是不同步的),您的问题是超时:如果您的计算机或打印队列正忙,kill命令可能来得太早

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

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

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

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

  • 最重要的是,你需要知道工作什么时候完成。为此使用
    win32print.EnumJobs()

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


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

    是否
    win32api.ShellExecute()
    同步?也就是说,它是否要等到AcrobReader完成打印?我不这么认为,根据文档,这就是我设置计时器的原因,我始终可以扩展时间范围。我考虑过生成进程,这样我就可以知道应用程序何时完成。问题是我不知道打印作业何时真正在打印机上打印。它的变化取决于网络流量,打印命令需要多长时间来处理;“免费库和应用程序”到底有什么不起作用?打印的PDF不可读,或者根本不打印,或者无法创建正确的PDF?从Python创建PDF的另一种方法是使用Pisa(www.xhtml2pdf.com/)将HTML转换为PDF,这是标题信息以及打开PRN/PCL文件时的样子。免费的图书馆都是经过编码的,至少在我研究它们的短短时间内是这样。Acrobat的打印文件不是这样的,因此可以编写正则表达式函数来提取特定数据,以便抓取报告中的人口统计数据。我更愿意使用ghostscript和gsprint,但是打印作业文件的格式不适合正则表达式的工作。