2014-02-12 5 views
0

У меня есть проект, над которым я работаю над использованием Python и GhostScript. В настоящее время у меня есть файл PDF с несколькими сотнями страниц, мне нужно взять этот PDF-файл и разделить страницы на TIF-файлы, у меня код работает правильно, однако, поскольку эта программа может занять некоторое время, я бы хотел выход для пользователя, показывающий, насколько далеко он находится в процессе.Пробег GhostScript

gs_appdir = 'C:\\Program Files\\gs\\gs9.10\\bin\\' 
os.chdir(gs_appdir) 
args = "-o \""+wkgdir+"Images\\Image_%03d.tif\" -sDEVICE=tiffg4 -q -NODISPLAY -r200x200 -s \""+inPDFFile+"\"" 
os.system("gswin64c.exe %s" % args) 

Когда я беру параметром -q из аргументов он покажет мне, однако он будет идти по линии построчно:

Страница 1 из хххх
Страница 2 из хххх
Page 3 xxxx
... et c.

Я хотел бы сделать что-то похожее на это:

print "\r[ Preparing Images ] %s%%" % ((img+1)*100/imgcount), 

Где он будет печатать процент на той же линии, но я не совсем уверен, как сделать это, используя Ghostscript. Любые советы будут очень полезны.

ответ

0

Хм, я думаю, в принципе вы не можете этого сделать. С куском программирования PostScript вы можете получить сообщение формы, которую хотите передать, но оно будет на stdout, поэтому, если вы запустите с -q, то он будет подавлен.

Вам нужно будет начать с использования расширений Ghostscript4, чтобы открыть PDF-файл, начать интерпретацию PDF, подсчитать количество страниц, затем ввести цикл, отображающий каждую страницу и испускающую сообщение. После этого все закрывается. Обычно удобные процедуры в Ghostscript позаботятся обо всем этом для вас, но они не будут излучать нужное вам сообщение.

Даже если бы все было испущено на одной линии, я не думаю, что вам это понравится. Вы, кажется, предполагаете, что более поздние строки просто удаляют (записывают поверх) предыдущие строки, и это не так, я не думаю, хотя это зависит от командной оболочки (и, следовательно, от операционной системы) ты используешь. Я отмечаю, что вы, кажется, используете Windows, вы можете получить этот эффект с помощью \ r, я не уверен.

В принципе, если вы хотите это сделать, вам придется написать новое приложение, которое использует API, а не выполняет Ghostscript как внешний процесс и самостоятельно обрабатывает обратный вызов stdout.

+0

Это почти то, чего я боялся. Я думаю, что мои пользователи просто должны согласиться на 1-2-минутное ожидание (вероятно, они сделают для них предварительное сообщение). Что касается \ r, вы правы, не все согласятся, однако для этой конкретной настройки он работает. – user3232819

+0

@ user3232819: Вам просто нужно изменить свой подход к этому. Вы можете получить выход процесса во время работы, и вам не нужно ждать завершения процесса. Взгляните на это: http://stackoverflow.com/questions/16557908/getting-output-of-a-process-at-runtime // Если вы вызываете Ghostscript в предлагаемом способе, вы сможете получить строку за строкой вывод из Ghostscript во время обработки страниц. Я сделал аналогичную вещь в .NET, и она работает. Когда вы получаете линейный вывод, выполните синтаксический анализ каждой строки, чтобы получить «текущую страницу» вместе с «полными страницами» и вычислить значение вашего прогресса. – HABJAN