Ghostscript для объединения нескольких файлов eps в один большой файл eps

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

Я надеялся, что это можно сделать программно, а не настраивать их вручную с помощью инструментов графического интерфейса.

Я пробовал команды ghostscript, но у меня получился маленький eps поверх друг друга.

Я также смотрю на psutils (psnup/pstops), но я не совсем уверен, может ли это помочь мне.

Я не возражаю против использования более тяжелой программы /lib, такой как Ghost4j (хотя, возможно, мне придется добавить туда больше функций, если она не поддерживает мою потребность). Я просто хочу убедиться, что это не может быть сделано легко или с помощью существующих инструментов.

Спасибо!

1 ответ

Решение

Знаете ли вы, как файлы EPS должны использоваться? Смысл файла EPS в том, что он предназначен для использования в качестве "черного ящика" приложением.

Когда приложение создает программу PostScript, оно может включать EPS в окончательный вывод, не зная ничего о нем, кроме его размера. Поэтому, когда генерируется PostScript, приложение знает размер EPS и изменяет CTM, чтобы масштабировать содержимое по мере необходимости и размещать его на странице.

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

Теперь весь смысл файла EPS заключается в том, что он может быть размещен программно, но для этого нужно написать программу:-)

Сначала вам нужно разобрать Bounding Box из файла EPS. Если EPS правильно соответствует, это будет %%BoundingBox и, возможно, комментарии %%HiResBondingBox.

Вооружившись этой информацией, вам необходимо решить, какой размер носителя вы используете и / или как масштабировать файлы EPS в соответствии с желаемым носителем.

Затем вы запускаете новую программу PostScirpt, которая начинается с запроса определенного размера носителя, а затем использует scale а также translate операторы, чтобы перейти на правильную позицию на носителе, а затем выполняет первый файл EPS (либо путем включения содержимого, либо с помощью run оператор).

Повторите процесс для каждого файла EPS.

Наконец, напишите новый контент, используя showpage оператор

Предполагая, что вы использовали устройство eps2write в Ghostscript, полученный файл будет новым EPS-файлом, который будет содержать содержимое отдельных EPS-файлов, масштабироваться и размещаться по вашему желанию.

Например, (все значения являются только мнимыми примерами данных):

%!
<< /PageSize [612 792] >> setpagedevice

gsave
306 396 moveto
0.5 0.5 scale
(example1.eps) run
grestore

gsave
306 0 moveto
1.5 1.5 scale
(example2.eps) run
grestore

gsave
0 396 moveto
(example3.eps) run
grestore

gsave
0 0 moveto
0.66 0.66 scale
(example4.eps) run
grestore

showpage
Другие вопросы по тегам