Распечатайте PDF и удалите файл после завершения печати - PullRequest
3 голосов
/ 17 декабря 2010

У меня есть приложение на 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 не открывался, но это не большая проблема.

РЕДАКТИРОВАТЬ: я пытался переключиться на Foxit Reader в качестве чтения PDF по умолчанию, и теперь он нене открывается, когда я не хочу.;)

ДРУГОЕ ВОЗМОЖНОЕ РЕШЕНИЕ : Цилиндрическая проверка, доступен ли файл (не используется другим процессом) и снова доступен, удалите его.Как я мог сделать это на Python?

Ответы [ 4 ]

4 голосов
/ 21 декабря 2010

Наконец-то я нашел хорошее решение, благодаря этому ответу (а также @Lennart упомянул его в комментарии):

установить Ghostscript

установить 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 ссылка

2 голосов
/ 17 декабря 2010

Вместо того, чтобы жестко кодировать имя файла и печатать его, вы должны использовать модуль tempfile для создания временного файла с уникальным именем.

import tempfile
file_name = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False)

Если хотите, вы можете запустить обычныйсценарий очистки с использованием инструментов планирования Windows для удаления созданных файлов.

1 голос
/ 17 декабря 2010

У 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-файлы из командной строки.Вы можете включить один с вашим программным обеспечением.

0 голосов
/ 17 декабря 2010

Почему бы не использовать os.system, который будет ждать завершения процесса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...