我有一个Python应用程序,将重复执行。它将PDF保存为文件,然后将其打印出来。打印结束时会删除文件。
我的当前解决方案(对于打印和删除部分)是:
win32api.ShellExecute(0, "print", file_path, None, ".", 0)
time.sleep(10)
os.remove(self.options.dest_name)
time.sleep(10)
是一个技巧,可以让打印过程在删除文件之前运行。如果没有它,Acrobat Reader会打开(无论如何都会打开),并提示它无法找到该文件。这是因为文件删除已经发生。
问题是:
如果没有这种不可靠的技巧,我该怎么办呢?最好的办法是为打印过程设置一个处理程序,并获取有关打印状态的信息:我等待它报告已完成并删除文件。
如果Acrobat Reader无法打开会更好,但这不是一个大问题。
编辑:我尝试切换到福昕阅读器作为默认的PDF阅读器,现在它不能打开我不想要的时候。 ;)
其他可能的解决方案: Cylically检查文件是否可用(未被其他进程使用)以及何时可用该文件将其删除。我怎么能用Python做到这一点?
答案 0 :(得分:4)
最后我找到了一个很好的解决方案,感谢this answer(以及@Lennart在评论中提到它):
install GSview(包括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
reference
答案 1 :(得分:2)
您应该使用tempfile
模块创建具有唯一名称的临时文件,而不是硬编码文件名并打印文件名。
import tempfile
file_name = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False)
如果需要,可以使用Window的计划工具运行常规整理脚本来删除创建的文件。
答案 2 :(得分:1)
Adobe acrobat拥有(或至少曾经拥有)参数“/ t”,使其打开,打印和退出。通过使用它,您可以调用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 Files\Adobe\Acrobat 4.0\Reader\AcroRd32.exe"
>>> subprocess.call([acrobatexe, "/t", tempfilename, "My Windows Printer Name"])
>>> os.unlink(tempfilename)
类似的东西。
如果您不想打开acrobat,可以使用开源软件从命令行打印pdf。您可以在软件中加入一个。
答案 3 :(得分:0)
为什么不使用os.system
,这会等到整个过程结束?