Наложить два файла PostScript (подход командной строки)? - PullRequest
7 голосов
/ 22 марта 2012

Мне известно, что на подобные вопросы здесь уже давали ответы:

... однако, поскольку они не отвечают непосредственно на мою конкретную проблему, я попробую спросить снова.

Я хотел бы знать, как я могу наложить два файла PostScript: один - логотип:

... поверх другого - графический фон:

.... с использованием подхода командной строки в Linux.

Здесь важно, чтобы графический фон максимально сохранял свое первоначальное содержание. Поэтому я бы, наверное, был бы счастлив, если бы мог каким-то образом объединить два исходных содержимого файла postscript без изменений (см. Ниже) - но кроме этого, я хотел бы знать, как инструменты командной строки, такие как ghostscript, могут использоваться для цель.

Проблема - логотип поверх печатной платы .ps распечатка

Вот проблема более подробно - я хочу добавить логотип поверх печатной платы. Я использую kicad для разработки печатной платы; После этого я экспортирую постскриптумный документ с отдельными слоями. Обычно я хочу, чтобы передний медный слой был «зеркальным»; Я часто экспериментировал с загрузкой вывода .ps, скажем, в inkscape, а затем пытался выполнить зеркалирование там. Использовать inkscape также было удобно, потому что можно легко добавить туда логотип (а затем отразить печать и логотип вместе).

Однако использование inkscape для обработки вывода postscript является дорогостоящей операцией (, потому что inkscape требуется некоторое время для загрузки, выполнения зеркалирования и сохранения ) ... Хотя, главный ограничитель показа здесь заключается в следующем: после обработки некоторые размеры могут быть слегка изменены в выходном файле на inkscape (, и это имеет большое значение, когда цель печатается дорожек шириной менее миллиметра ).

Итак, учитывая, что команда kicad s "Plot" имеет опцию для зеркалирования, мне, конечно, гораздо лучше "отразить" печать слоя непосредственно из команды kicad s "Plot"; вывод снова - файл postscript. tmp-Front.ps является примером такого (зеркального) файла postscript. Обратите внимание, что, как правило, «медная» часть заполнена черным, и мне бы хотелось, чтобы поверх нее был белый логотип.

Теперь, так как этот отпечаток уже "зеркальный" - если я хочу добавить логотип поверх него, мне лучше также отразить логотип. Итак, я запускаю inkscape; и:

  • добавить текст для логотипа;
  • устанавливается через Свойства документа:
    • , что размер документа соответствует размеру логотипа, и
    • что документ должен иметь черный фон
  • Затем измените текст логотипа, чтобы он стал белым;
  • сделать объект / отразить по горизонтали на тексте логотипа; а затем
  • сделать файл / сохранить копию;
    • выберите PostScipt (* .ps) в качестве вывода;
    • в диалоговом окне выберите PostScript уровень 2, а
    • выберите «Преобразовать текст в пути» перед экспортом.

Так было сгенерировано logo.ps, как указано выше ( обратите внимание, что - для таких небольших логотипов: без «текста к путям» файл .ps (со шрифтами) может иметь размер до 20 кБ; в отличие от 5 кБ только для путей ).

Одной из проблем, однако, является то, что postscript на самом деле не поддерживает что-то вроде цвета фона документа - очевидно, вам нужно определить заполненный прямоугольник самостоятельно:

... поэтому, если вы откроете logo.ps, вы ничего не увидите - он содержит белые буквы на белом фоне.

Зрители

Если в logo.ps, строка 1 g заменяется на 0.5 g; логотип становится серым (и видимым), и здесь он отображается в evince, gs raw viewer и gv:

view-logo.png

Вот то же сравнение для tmp-Front.ps:

view-tmp-Front.png

Примечательно, что необработанный просмотрщик ghostscript игнорирует ограничивающий прямоугольник и ориентацию страницы - и еще более проблематично то, что если вы используете Ubuntu Gnome на нетбуке, то верхняя и нижняя панель могут немного отрезать окно просмотра ghostscript - достаточно, чтобы логотип в левом нижнем углу был невидим; и поскольку « ... программа просмотра ghostscript gs ... не имеет реального пользовательского интерфейса », окно gs, которое запускается с обрезанным логотипом, не может быть настроено на его последующее отображение.

Объединение содержимого файла .ps для наложения

Глядя на эти ссылки:

... Я предполагаю, что, в принципе, должна быть возможность объединить содержимое двух файлов postscript; и если в объединенном файле есть только одна команда showpage, то в принципе нужно получить наложение (?!) из двух. Тем не менее, я попробовал это, и я не могу заставить его работать.

Если это возможно, я бы хотел как-то просто скопировать / вставить содержимое файла postscript (и тем самым избежать любых проблем с размерами / размерами / разрешениями документа) - а затем, возможно, использовать команду translate postscript (см. Редактирование постскриптума в Gnuplot ) для настройки положения логотипа. Открытие «overlaid» (объединенного) .ps в evince будет обновлять отображение документа каждый раз, когда параметры translate изменяются в текстовом редакторе, поэтому с позиционированием логотипа таким образом должно быть относительно легко справляться.

Однако и здесь я могу предвидеть некоторые проблемы: например, рисунок (tmp-Front.ps) содержит:

%%BoundingBox: 0 0 596 843
%%DocumentMedia: A4 595 842 0 () ()
...
0.0072 0.0072 scale
...
30085 54415 moveto
...

... в то время как logo.ps содержит:

%%BoundingBox: 0 0 31 13
...
%%DocumentMedia: 11x4mm 31 13 0 () ()
...
25.539 9.536 m(oveto) ...
...

... таким образом, есть два основных различия:

  • Размер документа не совпадает для файлов
  • Масштаб (точнее, система разрешения / координат) тоже не одинакова

Поскольку я не мог заставить работать конкатенацию содержимого файла - я не совсем уверен, будут ли эти различия влиять на оверлей ... Я, конечно, надеюсь, что они каким-то образом отображаются независимо; и translate просто поможет правильно установить их относительное положение:)

Итак, как бы я поступил, если бы хотел получить оверлей, объединяя содержимое файла postscript? И если это слишком хлопотно - как я могу использовать такой инструмент, как ghostscript (или любой другой), для настройки наложения?

Заранее большое спасибо за любые ответы,
Ура!


Для справки, вот копии упомянутых файлов postscript (поскольку они не слишком большие):

tmp-Front.ps

%!PS-Adobe-3.0
%%Creator: PCBNEW-PS
%%CreationDate: Thu Mar 22 09:50:52 2012
%%Title: /tmp-Front.ps
%%Pages: 1
%%PageOrder: Ascend
%%BoundingBox: 0 0 596 843
%%DocumentMedia: A4 595 842 0 () ()
%%Orientation: Landscape
%%EndComments
%%Page: 1 1
/line {
    newpath
    moveto
    lineto
    stroke
} bind def
/cir0 { newpath 0 360 arc stroke } bind def
/cir1 { newpath 0 360 arc gsave fill grestore stroke } bind def
/cir2 { newpath 0 360 arc gsave fill grestore stroke } bind def
/arc0 { newpath arc stroke } bind def
/arc1 { newpath 4 index 4 index moveto arc closepath gsave fill grestore stroke } bind def
/arc2 { newpath 4 index 4 index moveto arc closepath gsave fill grestore stroke } bind def
/poly0 { stroke } bind def
/poly1 { closepath gsave fill grestore stroke } bind def
/poly2 { closepath gsave fill grestore stroke } bind def
/rect0 { rectstroke } bind def
/rect1 { rectfill } bind def
/rect2 { rectfill } bind def
/linemode0 { 0 setlinecap 0 setlinejoin 0 setlinewidth } bind def
/linemode1 { 1 setlinecap 1 setlinejoin } bind def
/dashedline { [50 50] 0 setdash } bind def
/solidline { [] 0 setdash } bind def
gsave
0.0072 0.0072 scale
linemode1
82670 0 translate 90 rotate
60 setlinewidth
60 setlinewidth
newpath
30085 54415 moveto
30085 52585 lineto
31915 52585 lineto
31915 54415 lineto
30085 54415 lineto
poly1
newpath
87950 54930 moveto
32094 54930 lineto
32094 54474 lineto
32094 54415 lineto
32094 52525 lineto
32071 52470 lineto
32029 52428 lineto
31974 52406 lineto
31915 52406 lineto
30025 52406 lineto
29970 52429 lineto
29928 52471 lineto
29906 52526 lineto
29906 52585 lineto
29906 54475 lineto
29929 54530 lineto
29971 54572 lineto
30026 54594 lineto
30085 54594 lineto
31975 54594 lineto
32030 54571 lineto
32072 54529 lineto
32094 54474 lineto
32094 54930 lineto
28300 54930 lineto
28300 17800 lineto
87950 17800 lineto
87950 54930 lineto
poly1
100 setlinewidth
newpath
87950 54930 moveto
32094 54930 lineto
32094 54474 lineto
32094 54415 lineto
32094 52525 lineto
32071 52470 lineto
32029 52428 lineto
31974 52406 lineto
31915 52406 lineto
30025 52406 lineto
29970 52429 lineto
29928 52471 lineto
29906 52526 lineto
29906 52585 lineto
29906 54475 lineto
29929 54530 lineto
29971 54572 lineto
30026 54594 lineto
30085 54594 lineto
31975 54594 lineto
32030 54571 lineto
32072 54529 lineto
32094 54474 lineto
32094 54930 lineto
28300 54930 lineto
28300 17800 lineto
87950 17800 lineto
87950 54930 lineto
poly0
1 1 1 setrgbcolor
60 setlinewidth
31000 53500 170 cir1
0 0 0 setrgbcolor
showpage
grestore
%%EOF

logo.ps

%!PS-Adobe-3.0
%%Creator: cairo 1.10.2 (http://cairographics.org)
%%CreationDate: Thu Mar 22 10:07:46 2012
%%Pages: 1
%%BoundingBox: 0 0 31 13
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%DocumentMedia: 11x4mm 31 13 0 () ()
%%EndComments
%%BeginProlog
/languagelevel where
{ pop languagelevel } { 1 } ifelse
2 lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto
  (This print job requires a PostScript Language Level 2 printer.) show
  showpage quit } if
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
      0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
    { globaldict begin /?pdfmark /pop load def /pdfmark
    /cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
  {
    dup
    type /stringtype eq
    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
  } forall
  currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
      { pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
      /cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%Page: 1 1
%%BeginPageSetup
%%PageMedia: 11x4mm
%%PageBoundingBox: 0 0 31 13
%%EndPageSetup
q 0 0 31 13 rectclip q
1 g
25.539 9.536 m 25.539 7.567 l 27.227 7.567 l 27.227 3.817 l 27.227 
3.055 27.211 2.606 27.18 2.473 c 27.152 2.348 27.078 2.243 26.961 2.161 
c 26.848 2.087 26.707 2.052 26.539 2.052 c 26.324 2.052 25.992 2.13 
25.555 2.286 c 25.336 0.364 l 25.922 0.118 26.574 -0.011 27.289 -0.011 
c 27.738 -0.011 28.145 0.063 28.508 0.208 c 28.863 0.36 29.125 0.559 
29.289 0.802 c 29.457 1.04 29.574 1.364 29.633 1.77 c 29.688 2.048 
29.711 2.63 29.711 3.505 c 29.711 7.567 l 30.852 7.567 l 30.852 9.536 l 
29.711 9.536 l 29.711 11.395 l 27.227 12.833 l 27.227 9.536 l h
18.535 3.177 m 16.082 2.77 l 16.395 1.864 16.898 1.169 17.582 0.692 c 
18.262 0.223 19.117 -0.011 20.145 -0.011 c 21.77 -0.011 22.969 0.52 
23.738 1.583 c 24.355 2.434 24.66 3.509 24.66 4.802 c 24.66 6.352 
24.262 7.567 23.457 8.442 c 22.648 9.313 21.621 9.755 20.379 9.755 c 
18.996 9.755 17.902 9.294 17.098 8.38 c 16.297 7.462 15.914 6.055 
15.941 4.161 c 22.129 4.161 l 22.121 3.43 21.926 2.86 21.551 2.458 c 
21.168 2.052 20.688 1.848 20.113 1.848 c 19.73 1.848 19.406 1.95 19.145 
2.161 c 18.875 2.368 18.672 2.708 18.535 3.177 c h
18.395 5.677 m 18.418 6.391 18.605 6.934 18.957 7.302 c 19.312 7.673 
19.742 7.864 20.238 7.864 c 20.781 7.864 21.227 7.665 21.566 7.27 c 
21.922 6.884 22.098 6.352 22.098 5.677 c h
15.02 2.864 m 12.535 3.255 l 12.434 2.774 12.219 2.407 11.895 2.161 c 
11.574 1.911 11.125 1.786 10.551 1.786 c 9.906 1.786 9.422 1.899 9.098 
2.13 c 8.891 2.294 8.785 2.512 8.785 2.786 c 8.785 2.97 8.844 3.13 
8.957 3.255 c 9.082 3.368 9.359 3.477 9.785 3.583 c 11.777 4.016 13.039 
4.419 13.566 4.786 c 14.309 5.282 14.676 5.989 14.676 6.895 c 14.676 
7.696 14.359 8.372 13.723 8.927 c 13.078 9.477 12.09 9.755 10.754 9.755 
c 9.477 9.755 8.527 9.544 7.91 9.13 c 7.289 8.712 6.855 8.095 6.613 
7.286 c 8.941 6.848 l 9.047 7.212 9.242 7.489 9.52 7.677 c 9.793 7.872 
10.188 7.973 10.707 7.973 c 11.355 7.973 11.82 7.884 12.098 7.708 c 
12.285 7.571 12.379 7.403 12.379 7.208 c 12.379 7.028 12.297 6.876 
12.129 6.755 c 11.914 6.587 11.145 6.352 9.832 6.052 c 8.523 5.759 
7.598 5.391 7.066 4.958 c 6.559 4.52 6.301 3.907 6.301 3.13 c 6.301 
2.274 6.664 1.532 7.379 0.911 c 8.09 0.294 9.148 -0.011 10.551 -0.011 c 
11.824 -0.011 12.828 0.247 13.566 0.77 c 14.309 1.29 14.793 1.989 15.02 
2.864 c h
0.066 9.536 m 0.066 7.567 l 1.754 7.567 l 1.754 3.817 l 1.754 3.055 
1.738 2.606 1.707 2.473 c 1.68 2.348 1.605 2.243 1.488 2.161 c 1.375 
2.087 1.234 2.052 1.066 2.052 c 0.852 2.052 0.52 2.13 0.082 2.286 c 
-0.137 0.364 l 0.449 0.118 1.102 -0.011 1.816 -0.011 c 2.266 -0.011 
2.672 0.063 3.035 0.208 c 3.391 0.36 3.652 0.559 3.816 0.802 c 3.984 
1.04 4.102 1.364 4.16 1.77 c 4.215 2.048 4.238 2.63 4.238 3.505 c 4.238 
7.567 l 5.379 7.567 l 5.379 9.536 l 4.238 9.536 l 4.238 11.395 l 1.754 
12.833 l 1.754 9.536 l h
0.066 9.536 m f
Q Q
showpage
%%Trailer
%%EOF

РЕДАКТИРОВАТЬ: Re: luser droog ответ; если я пытаюсь открыть combo.ps, как написано в evince, я получаю:

$ evince combo.ps
invalidfileaccess -9

Это, вероятно, связано с # 414002 - gs -dSAFER: / invalidfileaccess с оператором "run" - Журналы отчетов об ошибках Debian ... Если я пытаюсь добавить заголовок PostScript "%!" в начать, я получаю:

$ nano combo.ps # added %! at start
$ evince combo.ps
undefined -21
undefined -21

Я также пытался запустить ps2ps - вот что получается:

$ ps2ps combo.ps comboB.ps
Error: /undefined in --load--
Operand stack:
   Oldshowpage
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1910   1   3   %oparray_pop   1909   1   3   %oparray_pop   1893   1   3   %oparray_pop   1787   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:1159/1684(ro)(G)--   --dict:0/20(G)--   --dict:77/200(L)--
Current allocation mode is local
Current file position is 30
GPL Ghostscript 9.02: Unrecoverable error, exit code 1

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Аналогичным подходом для KenS было бы поместить код «композиции» в один файл и вызывать файлы компонентов с помощью оператора run.Это то же самое, но с меньшими затратами.Ограничением является то, что опция -dSAFER (которая по умолчанию включена в большинстве установок Distiller) отключает оператор run.

combo.ps:

/Oldshowpage /showpage load def
/showpage {} def
gsave
    (tmp-Front.ps) run
grestore
    %additional scaling and translation to place the graphic?
    (logo.ps) run
Oldshowpage
2 голосов
/ 22 марта 2012

Чтобы «объединить» два файла, вам необходимо отключить оператор «showpage», так как в противном случае оба файла будут генерировать свои страницы отдельно.Но вам нужно сохранить исходное определение, чтобы вы могли выдать окончательный документ.Somethign liek:

/Oldshowpage showpage load def
/showpage {} def

...
file1
...
...
file2
...
Oldshowpage

Таким образом, если вы сохранили переопределения в файле, а окончательное выполнение в другом файле, вы могли бы cat 'prolog.ps file1.ps file2.ps epilog.ps'

Ни один из ваших файлов не выполняет медиа запрос (может игнорировать строки %%, это только комментарии).

Однако, как вы правильно сказали, вы не хотите, чтобы масштабирование и преобразования сохранялись между заданиями.Поэтому вам нужно сохранить и восстановить графическое состояние.Таким образом, в этом случае вам также нужен «средний» файл.

Итак, prolog.ps содержит:

/Oldshowpage showpage load def
/showpage {} def
gsave

middle.ps содержит

grestore

и epilog.ps содержит

Oldshowpage

cat все 5 файлов вместе, и это должно работать.Это делает что-то разумное для меня, но я должен упомянуть, что ваш 'logo.ps' создает для меня пустую страницу с Ghostscript и Adobe Distiller.

1 голос
/ 25 марта 2012

Хорошо, вот что у меня работает, благодаря ответу @ luserdroog , с неизмененными файлами и "напрямую" в evince.

Прежде всего, получите tmp-Front.ps, logo.ps и @luserdroog combo.ps (изменено ниже) в каталоге. Первая проблема заключается в том, что если evince встретит %%EOF, он прекратит синтаксический анализ того, что будет дальше. Итак, сначала мы хотим избавиться от этих директив в tmp-Front.ps и logo.ps:

sed -i 's/%%EOF/% %EOF/' logo.ps
sed -i 's/%%EOF/% %EOF/' tmp-Front.ps

Во-вторых, если evince не встретит %%Orientation и подобные директивы в самом начале, то он не будет отображать документ в альбомной ориентации (как и оригинал tmp-Front.ps). Таким образом, мы должны извлечь эти директивы из tmp-Front.ps и добавить их в начале combo.ps - и сохранить все это как новый файл, combopg.ps:

cat <(echo '%!') <(grep '%%Pages\|%%PageOrder\|%%BoundingBox\|%%DocumentMedia\|%%Orientation' tmp-Front.ps) <(echo) combo.ps > combopg.ps

Здесь я использую следующую модификацию combo.ps:

/Oldshowpage /showpage load def
/showpage {} def
gsave
    (tmp-Front.ps) run
grestore
    %additional scaling and translation to place the graphic?
    1 1 scale
    300 300 translate
    0 0 moveto

    (logo.ps) run
Oldshowpage

Наконец, поскольку evince не распознает директиву run, я использую эту модификацию psinc, psinc.pl , чтобы «включить» содержимое файлов:

cat combopg.ps | perl ./psinc.pl > combopgout.ps

Теперь вы, наконец, можете открыть combopgout.ps в evince - и одновременно в текстовом редакторе, где вы можете искать строку 300 300 translate; редактирование этих аргументов в текстовом редакторе и сохранение файла приведут к тому, что evince перезагрузит файл .ps и покажет последнюю позицию - это будет выглядеть так по умолчанию:

combopgout.ps.png

(обратите внимание, что логотип поворачивается в соответствии с альбомной ориентацией)

Ну, я думаю, это решает проблему - спасибо за ответы !!

...