Как я могу определить количество страниц из файла postscript (созданного Opera)?

4920
Joe

Я не знаю язык постскриптума.

У меня есть система эмуляции дуплексной печати, написанная на bash. Сначала печатаются нечетные страницы, а затем четные страницы. Ему нужно знать, существует ли нечетное количество страниц, чтобы можно было извлечь последнюю нечетную страницу, у которой нет соответствующей четной стороны. Он также использует количество страниц для отчетности.

Я не знал, как сделать это правильно, поэтому я написал код, который просматривает конец и, если необходимо, начало файла postscript, ищущего «%% Pages:», за которым следует число страниц. Это работает практически на всем, кроме файлов, напечатанных браузером Opera.

Кто-нибудь может предложить другой способ получить эту информацию?

Файлы Postscript, как правило, довольно большие и содержат много нечитаемого человеком контента, поэтому я еще не потратил много времени на просмотр тех, что появляются в Opera.

ТИА

Текущий код по адресу:

http://sourceforge.net/projects/duplexpr/  function ps_page_ct 
2

3 ответа на вопрос

5
mouviciel

К сожалению, не существует простого способа поиска страниц в необработанном файле Postscript. Вот почему %%Pagesсоглашение было создано (Adobe Document Structuring Conventions).

Команда для выдачи страницы есть showpage. В простых случаях их просто нужно считать.

Но эта команда может быть встроена в тело функции, и тогда вам понадобится анализатор Postscript.

+1 за то, что, в конечном итоге, правильный ответ. Постскриптум - полный по Тьюрингу язык. Если вы хотите получить точный ответ, интерпретируйте файл как «Единый верный путь». Я бы начал всерьез рассматривать использование [Ghostscript] (http://www.ghostscript.com/), если вам это действительно нужно. afrazier 12 лет назад 0
@afrazier: Вы когда-нибудь сравнивали этот «один верный ответ» с моим? Как мой тогда оценивается по вашей шкале верности? Kurt Pfeifle 11 лет назад 0
@KurtPfeifle: Я не видел вашего ответа, но после его просмотра, он определенно стоит +1. После еще одного поиска в Google вы также опубликовали [this] (http://stackoverflow.com/a/4829240/320333) на SO. Также есть [этот] (http://sourceforge.net/projects/ghostscript/forums/forum/5451/topic/1050031) комментарий от сопровождающего GhostScript. Я не уверен, что они будут быстрее, чем вы использовали выше. afrazier 11 лет назад 0
5
Kurt Pfeifle

The following Ghostscript command will reliably count the pages in your PostScript file -- but it can be rather slow, because it requires the file to be completely interpreted (run), as @afrazier already stated in a comment:

gs \ -o /dev/null \ -sDEVICE=bbox \ input.ps 2>&1 \ | grep HiResBoundingBox \ | wc -l 
Finally! I'll check it out and come back here. Thank you. Joe 11 лет назад 0
This appears to work, but "rather slow" is an understatement. On my I3 notebook, a three page document runs in just over two minutes. At best, I can add a switch (option) to my system to use this method as a last resort. In the mean time, I altered my code to count "HiResBoundingBox" instead of "showpage". Joe 11 лет назад 0
@Joe: Should your code rely on simply `grep`-ping for `HiResBoundingBox`: it will not work. This word need not be used in input files at all -- its appearance in the output stream is caused by Ghostscript interpreting all of the input and distilling this info snippet for you. Kurt Pfeifle 11 лет назад 0
@Joe: The reason why I said the command is 'rather slow' is this: Ghostscript needs to completely interpret and render the PostScript file (without displaying it) in order to reliably extract the page number info. It's just as much work as to completely display the file on screen. The reason for this is that PostScript is a Turing-complete programming language, and to see what's happening at one spot, the interpreter needs to run sequentially all the code which is located *before that spot*. Kurt Pfeifle 11 лет назад 0
@Joe: Two minutes for a 3 page document is extreme. It means that this document is a rather complex beast, and that it would take Ghostscript just as long to simply make that document display on screen... Kurt Pfeifle 11 лет назад 0
Thanks. I'll change the code back to using "showpage" (once it fails to find a %%Pages). I know it's not guaranteed to work, but it often does. Eventually, I'll add a switch to optionally do it the right way for files that don't work. Joe 11 лет назад 0
Ну, теперь, когда я получил это на работу, они выпустили PostScript 1.4, 1.5 и 1.6. Я придумал эвристику, которая иногда работает с 1.4 и 1.5. В исследуемом файле 1.6 я не увидел ничего, что выглядело бы так, как будто оно будет работать. Будет ли ваш метод перебора выше работать с этими более новыми версиями? Joe 11 лет назад 0
@Joe: нет такой вещи как «PostScript 1.4, 1.5 и 1.6». PostScript определяет уровни 1, 2 и 3. Вы уверены, что действительно имели в виду PostScript? Версии, которые вы назвали, предназначены для PDF, а не для PostScript. Kurt Pfeifle 11 лет назад 0
К сожалению. Я работаю над обоими одновременно, и я запутался. Это PDF-версии и должны быть в отдельном вопросе. Спасибо, что заметили. Joe 11 лет назад 0
2
j.berrisch

Я нашел этот небольшой фрагмент где-то, он очень быстро обработает документ и распечатает количество страниц. Это может помочь, если exiftool не печатает эту информацию метаданных, потому что документ не был сгенерирован правильно:

gs -dNODISPLAY -dBATCH -dNOPAUSE -o /dev/null source|grep -P '^Page'|wc -l 
Пробовал на двух тестовых файлах. Один дал 0 для трехстраничного документа, а другой - сообщение об ошибке ghostscript. Joe 11 лет назад 0
Вы пробовали без `| grep ....`? Какой выход? Я использую его как запасной вариант, когда данные exif не содержат «Количество страниц». Есть ли ссылка на документы, которые вы используете? Какую версию ghostscript вы используете? На какой ОС? j.berrisch 11 лет назад 0
Вот один документ: https://dl.dropboxusercontent.com/u/54584985/Opera01.ps. Это делает 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps | grep -P' ^ Page '| wc -l 0' Здесь без grep 'bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ gs -dNODISPLAY -dBATCH -dNOPAUSE -o / dev / null Opera01.ps GPL Ghostscript 9.05 (2012-02-08) Авторское право (C) 2010 Artifex Software, Inc. Все права защищены. Это программное обеспечение не поставляется без гарантии: подробности см. В файле PUBLIC. bigbird @ ramdass: ~ / pgm / duplex_proj / devel / test_data $ 'Извините за формат. Joe 11 лет назад 0
Извините, но вы правы, я проверял только мои плохо отформатированные PDF-файлы, для которых он работает хорошо. Возможно, Opera должна что-то исправить, потому что результат exiftool показывает свойство «Страницы», но с проводным значением «atend». j.berrisch 11 лет назад 0