Как заставить ghostscript выводить одну конкретную страницу из файла postscript в формате png?

Я пытаюсь использовать ghostscript по прямому назначению, интерпретировать файлы postscript и выводить pngs. Мне нужна команда, которая преобразует одну конкретную страницу из многостраничного файла ps в один png. Я добился этого в случае, когда входящий файл представляет собой файл в формате pdf, но не в случае, когда входящий файл представляет собой файл ps.

Эта строка преобразует ps в файл, состоящий из связанных файлов png.

gs -dSAFER -dBATCH -sDEVICE=png256 -r96x96 -sOutputFile=out.png in.ps

Это возьмет одну конкретную страницу из pdf и преобразует ее в png.

gs -q -dSAFER -dBATCH -dFirstPage=2 -dLastPage=2 -sDEVICE=png256 -SOut=fileout.png in.pdf

Простое размещение флагов dFirstPage= в случае ввода постскриптума ничего не дает. Вывод такой же, как если бы флагов не было.


person Chris    schedule 17.04.2011    source источник


Ответы (2)


В отличие от PDF, не все файлы PostScript могут иметь доступ к своим страницам в случайном порядке. Вероятно, дело в файле, который вы пытаетесь обработать. (В противном случае флаги должны быть отмечены как «не работает для постскриптума» в документации).

Я думаю, что самый простой способ сделать это — сначала преобразовать файл PS в PDF, а затем извлечь страницы из полученного PDF.

Поскольку вы работаете в Linux, вы можете использовать вспомогательный скрипт «ps2pdf», в котором используется ghostscript (но в большинстве дистрибутивов он является частью «ps-tools» или пакета с аналогичным названием) — или просто найдите командную строку gs, чтобы сделать преобразование.

Другой способ — сгенерировать все страницы до последней нужной и удалить первые ненужные.

Это происходит из-за природы самого постскриптума: файл postcritp — это просто компьютерная программа, которая устанавливает множество внутренних состояний, отображает страницу и вызывает функцию showpage — затем начинает отображаться следующая страница — так что, в зависимости от файла , внешний инструмент не может узнать, какие операторы являются частью состояния для всех страниц, а какие используются только для отображения страницы. В более новых спецификациях есть некоторые необязательные структуры данных, унаследованные от спецификации PDF, которые могут работать для вызова правильного кода для независимых страниц, но некоторые файлы будут нести это.

person jsbueno    schedule 17.04.2011

Вы можете сделать это с помощью PostScript, независимо от того, совместим ли файл с DSC, при условии, что вы знаете, какую страницу хотите.

Пользовательская процедура EndPage выполнит эту работу. EndPage вызывается для каждой страницы в задании, и процедура должна возвращать логическое значение, если true, то страница передается на устройство для печати, если false, то страница потребляется и отбрасывается.

<<
/EndPage {
  0 eq {       %% reason code is 0 for showpage   
    5 eq {     %% 5 is just an example, you would put your page# minus 1 here
      true
    }{
      false
    }ifelse
  } {
    pop        %% remove the count of pages from the stack
    false
  }ifelse
}
>> setpagedevice

Это проверяет код причины, чтобы убедиться, что он равен 0 (showpage), а затем количество выполнений showpage на данный момент, чтобы увидеть, является ли это нашей целью, если это так, мы помещаем true в стек и возвращаемся. Для любого другого условия мы ставим false и возвращаемся.

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

person KenS    schedule 19.04.2011
comment
Я думаю, вам может не хватать оператора if или ifelse после внутренних блоков. - person Emiswelt; 28.04.2015
comment
Да, похоже, что где-то там должен быть один после первого «ложного». - person KenS; 28.04.2015