我有一个Python应用程序将被重复执行。 它将PDF保存为一个文件,然后打印出来。 打印结束时删除文件。
我目前的解决scheme (打印和删除部分)是这样的:
win32api.ShellExecute(0,"print",file_path,None,".",0) time.sleep(10) os.remove(self.options.dest_name)
time.sleep(10)是让打印过程在删除文件之前运行的一个技巧 。 没有它,Acrobat Reader会打开(无论如何会打开),并警告它找不到该文件。 这是因为文件删除已经发生。
问题是:
上下文菜单的捕获窗口(Alt-打印屏幕)
在Python中使用cat命令进行打印
仿真ZPL打印机
签署ghostscript postscript打印驱动程序
Ubuntu 14.x / LibreOffice 4.2 – 如何打印到PS文件(不是PDF)
我怎么能没有这个不可靠的把戏呢? 最好的办法是有一个打印过程的处理程序,并获得有关打印状态的信息:我等待它报告它已完成,我删除该文件。
如果Acrobat Reader打不开,那会更好,但这不是一个大问题。
编辑:我试图切换到福昕阅读器作为默认的PDF阅读器,现在它不会打开时,我不想要。 ;)
其他可能的解决scheme :圆形检查文件是否可用(未被另一个进程使用),何时可用再次删除。 我怎么能在Python中做到这一点?
添加裁剪标记到现有的PDF文件
打印使用CUPS,我的应用程序何时可以退出?
如何取消共享共享打印机?
打印机驱动程序之间的差异
C#:从文件打印图像
最后我找到了一个很好的解决方案,感谢这个答案 (还有@Lennart在评论中提到它):
安装Ghostscript
安装 gsprint.exe (其中包括gsprint.exe )
写下这段代码:
file_path = "C:\temp\test.pdf" p = subprocess.Popen(["C:\Ghostgum\gsview\gsprint.exe","-printer",printer_name,"-colour",file_path],stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout,stderr = p.communicate() # waits for the gs process to end os.remove(file_path) # now the file can be removed
没有Acrobat窗口打开,打印前没有文件删除…烦恼:安装GS。
另见: gsprint参考
而不是硬编码文件名并打印,您应该使用tempfile模块创建一个具有唯一名称的临时文件。
import tempfile file_name = tempfile.NamedTemporaryFile(suffix=".pdf",delete=False)
如果你愿意,你可以使用Window的日程安排工具来运行一个经常整理的脚本来删除创建的文件。
Adobe acrobat已经(或至少曾经有)一个参数“/吨”,它打开,打印和退出。 通过使用它,您可以调用acrobat reader并等待它退出,然后删除该文件。
未经测试的代码:
>>> import subprocess # You will have to figure out where your Acrobate reader is located,can be found in the registry: >>> acrobatexe = "C:Program FilesAdobeAcrobat 4.0ReaderAcroRd32.exe" >>> subprocess.call([acrobatexe,"/t",tempfilename,"My Windows Printer Name"]) >>> os.unlink(tempfilename)
就是这样
如果你不想让acrobat打开,有一些开源软件会从命令行打印pdf。 你可以在你的软件中包含一个。
为什么不使用os.system ,它将等到处理完成?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。