Нарисуйте прямоугольник с помощью Ghostscript (используя язык PostScript)

Я пытаюсь нарисовать прямоугольник и вывести его в PDF с помощью Ghostscript. Если я помещу следующий код PostScript в файл с именем rect.eps, я получу то, что хочу:

newpath
100 100 moveto
0 100 rlineto
100 0 rlineto
0 -100 rlineto
-100 0 rlineto
closepath
gsave
0 0 0 setrgbcolor
fill
stroke
showpage

Но если я попытаюсь включить этот PostScript в мою команду Ghostscript, я просто получу пустую страницу:

gs -o rect.pdf -sDEVICE=pdfwrite -g300x300 -c "newpath 100 100 moveto 0 100 rlineto 100 0 rlineto 0 -100 rlineto -100 0 rlineto closepath gsave 0 0 0 setrgbcolor fill stroke showpage"

Что я делаю не так, разве нельзя нарисовать прямоугольник с помощью Ghostscript?

С наилучшими пожеланиями, Никлас

1 ответ

Комментарий Стефана по сути правильный.

Вы установили размер носителя в пикселях 300x300. Теперь, учитывая, что стандартное разрешение устройства pdfwrite составляет 720 dpi, и вы не изменили его, это означает, что размер носителя составляет менее половины дюйма в каждом направлении.

Затем вы нарисовали прямоугольник, начиная с 100 100 единиц на странице и расширяясь на 100 единиц в каждом направлении. Единицы PostScritp составляют 1/72 дюйма, поэтому левый нижний угол вашего прямоугольника начинается чуть выше 1 дюйма вверх и вправо.

Это за пределами квадрата в полдюйма, определенного вашими медиафайлами, так что в результате прямоугольник просто выводится за пределы страницы.

Если вы не установите размер носителя, Ghostscript будет использовать его по умолчанию, в зависимости от формата A4 или Letter, и вы увидите вывод. Что касается того, почему это работает, когда вы создаете файл EPS, я понятия не имею, я ожидаю, что в EPS есть контент, которым вы не поделились, что имеет значение.

При создании файла PDF, который является независимым от разрешения форматом, лучше указывать размер носителя в независимых от разрешения единицах, таких как единицы PostScript, чем в пикселях.

Обратите внимание, что в вашем коде есть дополнительная проблема, также упомянутая Стефаном, болтающимся gsave, который, похоже, должен иметь grestore перед ударом. Поскольку это удар ничего не будет делать, я подозреваю, что вы хотите:

gsave
0 0 0 setrgbcolor
fill
grestore
stroke
showpage
Другие вопросы по тегам