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

#linux #ghostscript #postscript

#linux #ghostscript #постскриптум #postscript

Вопрос:

Я пытаюсь использовать 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= флагов в поле ввода post script ничего не дает. Результат такой же, как если бы флагов там не было.

Ответ №1:

Вы можете сделать это с помощью 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 и возвращаем.

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

Комментарии:

1. Я думаю, вам может не хватать оператора if или ifelse после внутренних блоков.

2. Да, похоже, что где-то там должна быть одна после первого ‘false’.

Ответ №2:

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

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

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

Другим способом было бы сгенерировать все страницы до последней, которую вы хотите, и удалить первые, ненужные.

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