打印完成后打印PDF并删除文件

时间:2010-12-17 10:34:58

标签: python windows pdf printing

我有一个Python应用程序,将重复执行。它将PDF保存为文件,然后将其打印出来。打印结束时会删除文件。

我的当前解决方案(对于打印和删除部分)是:

win32api.ShellExecute(0, "print", file_path, None,  ".",  0)
time.sleep(10)
os.remove(self.options.dest_name)

time.sleep(10)是一个技巧,可以让打印过程在删除文件之前运行。如果没有它,Acrobat Reader会打开(无论如何都会打开),并提示它无法找到该文件。这是因为文件删除已经发生。

问题是:

  1. 如果没有这种不可靠的技巧,我该怎么办呢?最好的办法是为打印过程设置一个处理程序,并获取有关打印状态的信息:我等待它报告已完成并删除文件。

  2. 如果Acrobat Reader无法打开会更好,但这不是一个大问题。

  3. 编辑:我尝试切换到福昕阅读器作为默认的PDF阅读器,现在它不能打开我不想要的时候。 ;)

    其他可能的解决方案: Cylically检查文件是否可用(未被其他进程使用)以及何时可用该文件将其删除。我怎么能用Python做到这一点?

4 个答案:

答案 0 :(得分:4)

最后我找到了一个很好的解决方案,感谢this answer(以及@Lennart在评论中提到它):

install Ghostscript

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)

Adob​​e 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,这会等到整个过程结束?