Реально вам не следует пытаться заменить изображение.
PostScript - это язык программирования, и если все файлы EPS, которые вы когда-либо планируете обрабатывать, не будут созданы одним и тем же приложением, и чтобы быть реалистичным c точно такой же версии этого приложения, то точная семантика программы может отличаться. Если семантика различается, поиск и замена завершатся неудачно.
Указанный вами раздел неполон, похоже, что это 4-цветное изображение в пространстве CMYK (потому что в нем есть 4 процедуры для чтения данных и что, вероятно, массив декодирования имеет 8 элементов), но нет попытки установить цветовое пространство, и вы не знаете CTM в действии. Масштабирование другого изображения для размещения в одной и той же области будет затруднено, если в нем не будет одинаковое количество строк и столбцов.
Данные изображения не просто кодируются в ASCII85, они также кодируются по длине прогона (ascii85 применяется после кодирование длины строки), и данные предоставляются в виде чередующихся растров. Линия голубого цвета, за которой следует линия пурпурного цвета, за которой следуют линия желтого цвета и линия блэка. Чтобы приложение для чтения изображений могло это прочитать, вам нужно будет прочитать набор из 4 растров, отменить кодировку ascii85, а затем отменить кодирование длины серии, затем взять выборки по отдельности из каждого растра и чередовать их, чтобы получить 4 строки CMYKCMYKCMYK ... данные. (Обратите внимание, что очень немногие приложения для обработки изображений могут обрабатывать данные CMYK вообще).
Чтобы заменить данные изображения и предполагать, что замена точно с такими же размерами, вам необходимо будет декодировать данные изображения в образцы изображения (то есть отменить сжатие JPEG). Разбейте его на C, M, Y, K плоскости, длину прогона кодируйте плоскости, затем ascii85 закодируйте каждый растр, а затем запишите данные изображения в строку растра за раз.
Если есть какие-либо различия в цветовом пространстве, размерах, битах на компонент или кодировку вам также потребуется заменить часть программы, которая считывает данные изображения и массирует их в форму, подходящую для передачи интерпретатору, и это будет большая задача, требующая изучить язык программирования PostScript.
Процедура 'img' (которая будет определена ранее в программе) берет данные словаря и либо превращает их в словарь изображений, который будет предоставлен оператору изображений PostScript, либо превращает его в эквивалентные операнды уровня 1, которые передаются оператору изображения, если интерпретатор очень старый и поддерживает только уровень 1.
В общем, единственный способ обработки файлов EPS - это использование полного интерпретатора PostScript, такие как Ghostscript (как используется ImageMagick и, Я полагаю, GraphicsMagick). Потому что вам действительно нужно интерпретировать программу. Вы можете вносить ограниченные изменения в программы, которые соответствуют спецификации EPS, но оптовая замена данных изображения не является одной из предполагаемых целей.
Я не знаю, что вы подразумеваете под «слоями». В PostScript нет концепции слоев, потому что это язык описания страниц; нет необходимости в «слое». Возможно, если бы вы могли объяснить, чего вы хотите достичь, можно было бы предложить другое решение.
[дополнительные]
ОК, поэтому «нормальный» способ действовать в такой ситуации - для PostScript с «шаблоном», который будет сгенерирован таким образом, чтобы он содержал контент от ваших клиентов.
Обычно контент клиента поставляется в виде EPS (в наши дни это может быть PDF), инструмента для создания выходных данных. поскольку принтер генерирует PostScript (не EPS, полноценная программа PostScript) и внедряет EPS в программу. В этом суть EPS, вы включаете его в программу PostScript.
Файлы EPS на самом деле не редактируются и не предназначены для изменения, ведь их изменение потенциально делает недействительной информацию BoundingBox. Единственный способ понять, что делает программа PostScript, - это интерпретировать ее, поэтому попытка поиска и замены на самом деле не является решением на будущее.
Я также немного обеспокоен тем, что вы, кажется, используете сжатые изображения JPEG в среде печати! JPEG (обычно) является методом сжатия с потерями, поэтому сжатое JPEG-изображение будет иметь артефакты, я бы обычно счел его неподходящим для того типа процесса, который вы, похоже, подразумеваете здесь.
Теперь я вижу несколько способов подойти к проблеме, которая не связана с редактированием файла EPS. Предполагая, что вы знаете размер и положение каждого из «ящиков» в EPS, а содержимое вашего клиента представлено в формате EPS, вы просто объединяете файлы вместе, генерируя информацию о местоположении по мере необходимости.
В PostScript непрозрачный модель визуализации, это означает, что если вы начинаете с «шаблона», а затем правильно настраиваете CTM, вы можете включить весь файл EPS таким образом, чтобы при визуализации он точно охватывал область, которую вы хотите заменить.
Для этого вам нужно знать точный размер и местоположение, которое должен охватывать EPS (я предполагаю, что вы знаете это), и точную площадь, покрываемую EPS, вы получите это из комментария %% BoundingBox файла EPS. , Это тогда тривиальный вопрос, чтобы добавить операции масштабирования и перевода так, чтобы EPS правильно определил размер позиционированного.
Вот скелет того, что я имею в виду:
%!PS
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Adobe Illustrator
%%Title: Template
%%BoundingBox: 0 0 612 792
....
....
%%EOF
% execute a save of the graphics state so the EPS doesn't change anything
gsave
% Reposition customer EPS file to first location in the template
% and scale it up (Lets pretend the first slot is at x=0, y=200
% and we need to double the size of the EPS so it fits.
0 200 moveto
2 2 scale
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Adobe Illustrator
%%Title: customer content file #1
%%BoundingBox: 0 0 100 100
....
....
%%EOF
% Now execute a grestore so everythgin goes back to the state it was in
% before we ran the EPS
grestore
% Repeat for each EPS file
showpage
Я предполагаю, что ваш Контент на заказ предоставляется в виде EPS, а не в виде данных изображения (растрового изображения). Если это действительно JPEG-изображение, то вы можете написать код PostScript, чтобы включить JPEG вместо EPS в приведенном выше коде.
Я не уверен, как работает ваш существующий процесс, для меня не очевидно, что Ваш ручной процесс позиционирования клиентского контента: