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

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

  • postscript – 覆盖另一个pdf或ps文件 – 堆栈溢出
  • 覆盖 – 重叠或合并多个.ps文件 – 堆栈溢出

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

我想知道,我怎么能覆盖两个后记文件:一个 – 一个标志:

  • logo.ps

另一方面 – 一个graphics背景:

  • tmp-Front.ps

在Linux中使用命令行方式。

graphics背景在最大程度上保留了其原始内容。 因此,如果我能以某种方式连接两个原始的postscript文件内容(见下文),我可能会感到高兴 – 但ghostscript ,我想知道如何使用像ghostscript这样的命令行工具。

问题 – 在PCB .ps打印输出的顶部

这里是更详细的问题 – 我想在PCB板打印上添加一个徽标。 我使用kicad来开发PCB印刷; 一旦完成,我导出一个postscript文档与单个图层。 通常,我要把前面的铜层“镜像”; 我经常尝试将.ps输出加载到inkscape ,然后尝试在那里进行镜像。 使用inkscape也很方便,因为可以很容易地在那里添加一个标识(然后将印刷品和标识镜像在一起)。

但是,使用inkscape来处理postscript输出是一个高级操作( 因为它需要花费一些时间才能加载inkscape ,并进行镜像和保存 )。虽然,这里的主要展示是:在处理之后,输出文件中的尺寸可能会稍微变化当目标打印的轨道宽度小于1毫米时,它会产生很大的差别 )。

所以,考虑到kicad的“Plot”命令有一个镜像选项 – 当然,我更好地直接从kicad的“Plot”命令“镜像”图层打印。 输出也是一个postscript文件。 tmp-Front.ps是这种(镜像)后记文件的一个例子。 请注意,通常情况下,“铜”部分充满了黑色 – 我基本上喜欢有一个白色的标志在上面。

现在,由于这个印刷品已经被“镜像”了 – 如果我想在它上面添加一个标志,我最好还要标识这个标志。 所以我开火了 和:

  • 为徽标添加文字;
  • 通过文档属性设置:
    • 文档大小与徽标大小相匹配
    • 该文件应该有一个黑色的背景
  • 然后改变标志文字有白色填充;
  • 在标识文字上做对象/水平翻转; 接着
  • 做文件/保存副本;
    • selectPostScipt(* .ps)作为输出;
    • 在对话框中selectPostScript level 2和
    • 在导出之前select“将文本转换为path”。

这就是logo.ps链接的logo.ps注意 – 对于这些小标识:没有“文本到path”,.ps文件(带字体)可以达到20 kB;而path为5 kB只 )。

一个问题是,postscript并不真正支持“文档背景”颜色 – 显然你需要自己定义一个填充的矩形:

  • Adobe论坛:如何将ps文件页面背景改为透明 ;
  • 回复:导出canvas到PostScript会丢失背景颜色 ;

…因此,如果你打开logo.ps ,你将不会看到任何东西 – 因为它包含白色背景上的白色字母。

观众

如果在logo.ps1 g线被replace为0.5 g ; 徽标变成灰色(可见),并在这里显示在evince下, gs原始查看器和gv

鉴于-logo.png

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

视图-TMP-Front.png

值得注意的是,原始的ghostscript查看器忽略边界框和页面的方向 – 更有问题的是,如果你在上网本上使用Ubuntu Gnome,那么顶部和底部的栏可能会剪掉一点ghostscript查看器窗口 – 足以使标志在左下angular不可见; 并且由于“ …原始的ghostscript查看器gs …没有真实的用户界面 ”,因此不能设置用剪切标志启动的gs窗口以显示它。

连接.ps文件内容的覆盖

通过查看这些参考:

  • Ghostscript叠加串联后记文件 – comp.lang.postscript
  • Re:合并postscript文件–comp.lang.postscript ;
  • 摆脱页面合并 – Mombu编程论坛

…我猜测,原则上应该可以连接两个后记文件的文件内容; 如果在合并文件中只有一个showpage命令 – 那么原则上应该获得两者的重叠(?!)。 但是,我尝试了,我真的无法得到它的工作。

如果这是可能的,我想以某种方式复制/粘贴postscript文件的内容(从而避免任何问题的文件尺寸/大小/分辨率) – 然后可能使用translate postscript命令(见Gnuplot的跋文编辑 )调整标志的位置。 在evince打开“覆盖”(合并)的.ps文件时,每次在文本编辑器中更改translate参数时都会刷新文档显示 – 所以以这种方式处理标识定位应该相对容易。

但是,我也可以在这里预见一些问题:例如,graphics( 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 (或任何其他),以build立一个覆盖?

非常感谢任何答案,
干杯!


作为参考,这里是提到的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 lh 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 ch 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 ch 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 ch 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 lh 0.066 9.536 mf QQ showpage %%Trailer %%EOF 

编辑:回复: luser droog的答案; 如果我试图打开在evince写的combo.ps ,我得到:

 $ evince combo.ps invalidfileaccess -9 

这可能与#414002有关- gs -dSAFER:/ invalidfileaccess用“run”运算符 – Debian Bug报告日志 …如果我在开始时尝试添加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 

Solutions Collecting From Web of "覆盖两个后记文件(命令行方式)?"

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 

为了“连接”这两个文件,您需要禁用“showpage”操作符,否则这两个文件将分别发出其页面。 但是您需要保留原始的定义,以便您可以发出最终的文档。 Somethign谎言:

 /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 

猫所有5个文件在一起,它应该工作。 它为我做了一些明智的事情,但是我也许应该提一下,您的“logo.ps”为Ghostscript和Adobe Distiller提供了一个空白页面。

好的,这对我来说很有用 ,感谢@ luserdroog的回答 ,没有改变的文件,在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文件并显示最新的位置 – 对于默认值,它将如下所示:

combopgout.ps.png

(请注意徽标按照横向方向旋转)

那么,我想这解决了它 – 谢谢你的答案!