#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, которые могут работать для вызова правильного кода для независимых страниц, но немногие файлы будут содержать это.