覆盖两个后记文件(命令行方法)?

Posted

技术标签:

【中文标题】覆盖两个后记文件(命令行方法)?【英文标题】:Overlay two postscript files (command line approach)? 【发布时间】:2012-04-06 22:01:42 【问题描述】:

我知道以前在这里已经回答过类似的问题:

postscript - overlay one pdf or ps file on top of another - Stack Overflow overlay - Overlaying or merging multiple .ps files - Stack Overflow

...但是,由于他们没有直接回答我的具体问题,我会尝试再次询问。

 

我想知道,如何叠加两个 postscript 文件:一个 - 一个徽标:

logo.ps

...在另一个之上 - 图形背景:

tmp-Front.ps

....在 Linux 中使用命令行方法。

 

这里很重要,图形背景尽可能地保留其原始内容。因此,如果我能以某种方式将两个原始 postscript 文件内容保持不变(见下文),我可能会最高兴 - 但除此之外,我想知道如何使用像 ghostscript 这样的命令行工具目的。

 

问题 - PCB .ps 打印输出顶部的徽标

这是更详细的问题 - 我想在 PCB 板印刷品顶部添加一个徽标。我用kicad开发PCB打印;完成后,我会导出带有各个图层的 postscript 文档。通常,我想让前面的铜层“镜像”;我经常尝试将.ps 输出加载到inkscape,然后尝试在那里进行镜像。使用inkscape 也很方便,因为可以轻松地在其中添加徽标(然后将打印和徽标镜像在一起)。

但是,使用 inkscape 处理 postscript 输出是一项昂贵的操作(因为 inkscape 需要一段时间来加载、执行镜像和保存)...虽然,这里的主要显示停止是:处理后,输出文件中的某些尺寸可能略有改变 inkscape当目标正在打印宽度小于一毫米的轨道)。

 

所以,鉴于kicads“Plot”命令有一个镜像选项——当然,直接从kicads“Plot”命令“镜像”图层打印要好得多;输出又是一个 postscript 文件。 tmp-Front.ps 是这种(镜像)后记文件的一个示例。请注意,通常,“铜”部分是用黑色填充的 - 我基本上希望在它上面有一个白色的标志。

现在,由于此打印已经“镜像”了 - 如果我想在上面添加徽标,我最好将徽标也镜像。所以我开火了inkscape;和:

为徽标添加文字; 通过文档属性设置: 文档大小与徽标大小匹配,并且 文档应该有黑色背景 然后将徽标文本更改为白色填充; 在标志文本上做对象/水平翻转;然后 执行文件/保存副本; 选择 PostScipt (*.ps) 作为输出; 在对话框中选择 PostScript level 2,然后 在导出前选择“将文本转换为路径”。

这就是上面链接的logo.ps 的生成方式(请注意 - 对于这些小徽标:如果没有“路径文本”,.ps 文件(带有字体)可以达到 20 kB;如与仅路径的 5 kB 相对)。

不过,一个问题是 postscript 并不真正支持“文档背景”颜色之类的东西 - 显然您需要自己定义一个填充矩形:

Adobe Forums: How to change ps file page background to transparent; Re: Exporting canvas to PostScript loses background color;

...因此,如果您打开 logo.ps,您将看不到任何内容 - 因为它包含白色背景上的白色字母。

观众

如果在logo.ps 中,则1 g 行替换为0.5 g;徽标变为灰色(可见),并在此处呈现在 evincegs 原始查看器和 gv 下:

这是tmp-Front.ps的相同比较:

值得注意的是,原始的ghostscript 查看器会忽略边界框和页面方向 - 更有问题的是,如果您在上网本上使用 Ubuntu Gnome,那么顶部和底部栏可能会削减一点 ghostscript 查看器窗口- 足以让左下角的标志不可见;并且由于“... the raw ghostscript viewer gs ... has no real user interface”,一个以裁剪徽标启动的gs窗口,不能设置为之后显示它。

 

为叠加层连接 .ps 文件内容

通过查看这些参考资料:

Ghostscript overlaying concatenated postscript files - comp.lang.postscript Re: Merge postscript files - comp.lang.postscript; Getting rid of pagethrow on merge - Mombu the Programming Forum

...我猜,原则上,应该可以连接两个后记文件的文件内容;如果合并文件中只有一个 showpage 命令 - 那么原则上应该获得两者的叠加(?!)。但是,我试过了,但我无法真正让它发挥作用。

如果可能的话,我想以某种方式复制/粘贴 postscript 文件内容(从而避免文档尺寸/大小/分辨率出现任何问题) - 然后可能使用 translate postscript 命令(参见 @ 987654331@) 调整标志的位置。在evince 中打开“覆盖”(合并).ps,每次在文本编辑器中更改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(或任何其他)之类的工具来设置覆盖?

 

非常感谢您的任何回答, 干杯!

 


作为参考,这里是提到的后记文件的副本(因为它们不是太大):

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

编辑:回复:luser droog 的回答;如果我尝试按照evince 中的说明打开combo.ps,我会得到:

$ evince combo.ps
invalidfileaccess -9

这可能与#414002 - gs -dSAFER: /invalidfileaccess with "run" operator - Debian Bug report logs有关...如果我尝试在开始时添加 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

【问题讨论】:

【参考方案1】:

为了“连接”这两个文件,您需要禁用“showpage”运算符,否则两个文件将分别发出它们的页面。但是您需要维护原始定义,以便您可以发出最终文档。一些谎言:

/Oldshowpage showpage load def
/showpage  def

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

因此,如果您将重新定义保存在一个文件中,而最终执行在另一个文件中,您可能会cat 'prolog.ps file1.ps file2.ps epilog.ps'

您的文件都不执行媒体请求(您可以忽略 %% 行,它们只是 cmets)。

但是,正如您正确地说的那样,您不希望缩放和转换在作业之间持续存在。所以需要保存和恢复图形状态。因此,在这种情况下,您还需要一个“中间”文件。

所以prolog.ps 包含:

/Oldshowpage showpage load def
/showpage  def
gsave

middle.ps 包含

grestore

epilog.ps 包含

Oldshowpage

将所有 5 个文件放在一起,它应该可以工作。它对我来说是明智之举,但我或许应该提一下,您的“logo.ps”使用 Ghostscript 和 Adob​​e Distiller 为我生成了一个空白页面。

【讨论】:

嗨@KenS - 非常感谢您的回答!我已经对其进行了编辑并添加了代码格式,希望没问题(我还没有立即进行编辑的声誉,但我希望版主会接受它)。回复:logo.ps 是一个空白页面 - 那是因为它是白色背景上的白色图形:上面提到 inkscape 不会将黑色背景导出到 postscript 输出中。我尝试这样做:cat prolog.ps tmp-Front.ps middle.ps logo.ps epilog.ps > out.ps - 在这种情况下,out.ps 中只有 tmp-Front.ps 图形可见 ... [继续] 但是,如果我以不同的顺序执行文件参数,即:cat prolog.ps logo.ps middle.ps tmp-Front.ps epilog.ps > out.ps - 那么只有logo.psout.ps 中可见! (顺便说一句,在logo.ps 文件中,%%EndPageSetup 之后的行1 g 可以更改为0.5 g;然后徽标变为灰色/可见)......所以那里必须有其他事情需要做在 prolog/middle/epilog ...再次感谢 - 干杯! 我尝试了相反的顺序,它对我来说效果很好。至少,以及第一次订购。徽标的缩放和位置不正确,但这是意料之中的。 感谢@KenS 的说明-我在徘徊,您使用哪个应用程序来查看最终的后记?是evince 还是别的什么?谢谢,干杯! Microsoft Visual Studio 2008 查看 PostScript 程序,并使用 Ghostscript 渲染它。我应该提一下,我受雇于 Artifex Inc 开发 Ghostscript。【参考方案2】:

与 KenS 类似的方法是将“组合”代码放在单个文件中,并使用 run 运算符调用组件文件。它相当于同样的事情,但外壳工作少了一点。一个限制是 -dSAFER 选项(在大多数 Distiller 安装中默认为 ON)禁用 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

【讨论】:

嗨@luser droog - 非常感谢您的回答!不幸的是,我无法让它工作 - 请查看问题末尾的编辑...再次感谢 - 干杯! 感谢@luserdroog 的更正 - 不幸的是,我仍然遇到同样的错误...... ps2ps 现在应该很开心了。但看起来 evince 甚至没有定义 run 运算符。但是您可以原谅它,因为它主要是一个文档查看器。对于“文档”的任何有用定义,“combo.ps”都不是“文档”。 您可以使用psinc 来“预处理”程序并内联runs。结果应与cat 结果相同。 ... 最后,指出“包含目录”可能是问题所在 - 所以我终于可以确认,虽然“直接”ps2ps 崩溃 - 手动将当前目录指定为包括,如“ps2ps -I. combo.ps comboB.ps”;或使用-P 开关,如:“ps2ps -P combo.ps comboB.ps”,将使进程顺利通过。请注意,输出comboB.ps 将压缩其内容(Ascii85/LZW);在evincegsgv 打开时,它看起来都一样 - 但是,它是纵向旋转的(而它应该是横向的 tmp-Front.ps)。【参考方案3】:

好的,这对我有用,感谢@luserdroog's answer,文件未更改,并“直接”在evince 中。

首先,在一个目录中获取tmp-Front.pslogo.ps 和@luserdroog combo.ps(修改如下)。第一个问题是,如果evince 遇到%%EOF,它将停止解析接下来的任何内容。所以,我们首先要去掉tmp-Front.pslogo.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

 

现在,您终于可以在evince 中打开combopgout.ps - 同时在文本编辑器中,您可以在其中查找300 300 translate 行;在文本编辑器中编辑这些参数并保存文件将导致 evince 重新加载 .ps 文件并显示最新位置 - 默认情况下如下所示:

(注意标志是横向旋转的)

 

嗯,我想这可以解决它 - 感谢您的回答!

【讨论】:

很高兴看到最终解决方案。还有图片!我认为这个问题将来对其他人非常有用。干得好! 我当然希望如此 - 谢谢你,@luserdroog! (不用担心意外的评论副本;版主已经处理好了)...干杯!

以上是关于覆盖两个后记文件(命令行方法)?的主要内容,如果未能解决你的问题,请参考以下文章

linux 7.5 命令行界面 显示是不是要覆盖文件,用啥命令回答?

我如何使用命令行覆盖在GIMP的文件JPG名单

git命令行解决冲突方法

git命令行解决冲突方法

来自命令行的 Xcode 代码覆盖率

Cmder命令行操作