如何调整EPS文件的BoundingBox?

时间:2012-10-01 23:41:26

标签: pdf ghostscript postscript eps

我想裁剪PSPDF文件的主要区域,以创建没有空格的EPS文件。 ghostrciptps2pdfepstools的命令可以裁剪文档文件中的主要图纸。

问题是它们只以原始形式裁剪,但我想用BoundingBox 0 0 x y创建一个EPS文件;裁剪并移动到左下角。

我们想要在PS文档中插入生成的EPS文件时的差异。当有BoundingBox x0 y0 x y时,PS文档会在点x0 y0处插入EPS文件,而不是我们所在的位置。

示例:

将简单的PS文件视为

%!
/Times-Roman findfont 
11 scalefont setfont

72 700 moveto
(This is a test)show

如果使用

之类的命令将其转换为EPS
ps2eps test.ps test.eps

它会产生

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 72 700 127 708
%%HiResBoundingBox: 72.000000 700.000000 127.000000 707.500000
%%EndComments
% EPSF created by ps2eps 1.68
%%BeginProlog
save
countdictstack
mark
newpath
/showpage {} def
/setpagedevice {pop} def
%%EndProlog
%%Page 1 1
/Times-Roman findfont 
11 scalefont setfont
72 700 moveto
(This is a test)show
%%Trailer
cleartomark
countdictstack
exch sub { end } repeat
restore
%%EOF

它已在原始坐标中裁剪,结果BoundingBox72 700 127 708。现在,如果尝试在EPS文档中插入此PS文件,它会尝试在此坐标处嵌套。

如果使用EPS创建BoundingBox: 0 0 55 8文件,将会非常有用。当然,所有绘图坐标(此处为moveto)必须使用此新引用进行修改。

注意:如上所述,我修复BoundingBox参考点的目的是使其可以在PS文档中导入。因此,这个问题的另一个答案是:如何在PS文档中插入EPS文件而不管其BoundingBox。

例如,如何在PS文档的200 200 255 208位置插入此EPS文件。我尝试使用以下代码插入EPS,但除非从0 0启动BoundingBox,否则它将无效:

200 200 translate 
save 
/showpage {} bind def 
(test.eps)run 
restore

2 个答案:

答案 0 :(得分:3)

如何简单地 un - 翻译?

-72 -700 translate

in eps本身,还是包含之前的准备部分?


别扭!

以下打字稿说明了执行所需修改的awk脚本 在DSC评论的指导下(就像妈妈过去做的那样!)。

优点是:如果你可以保证输入的EPS足以与DSC一致以提供这些标记,这种方法比传递文件通过<更快几个数量级/ em> ghostscript。

简单是这个计划的优势和局限。它扫描DSC注释,从BoundingBox注释中提取值,抑制HiResBoundingBox,并在Page注释后添加postscript'revert'和'rectclip'。只要EPS确实是真实的,这应该产生正确的结果。但是另一个答案中的ghostscript方法会在输入文件上产生结果,但DSC可靠性较差(因为它没有采用快捷方式,它将DSC视为注释并完全忽略它们)。

严格来说,'rectclip'不一定是必要的,但问题是输出被“裁剪”。

592(1)11:27 AM:~ 0> cat epscrop.awk
/%%BoundingBox: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)/{x=$2;y=$3;w=$4-x;h=$5-y;print $1,0,0,w,h}
!/%%BoundingBox:/&&!/%%HiRes/{print}
/%%Page /{print -x,-y,"translate"; print 0,0,w,h,"rectclip"}


593(1)11:27 AM:~ 0> awk -f epscrop.awk etest.eps
%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 0 0 55 8
%%EndComments
% EPSF created by ps2eps 1.68
%%BeginProlog
save
countdictstack
mark
newpath
/showpage {} def
/setpagedevice {pop} def
%%EndProlog
%%Page 1 1
-72 -700 translate
0 0 55 8 rectclip
/Times-Roman findfont
11 scalefont setfont
72 700 moveto
(This is a test)show
%%Trailer
cleartomark
countdictstack
exch sub { end } repeat
restore
%%EOF

答案 1 :(得分:3)

要将其转换为您想要的BoundingBox风格的EPS,我会使用Ghostscript并让EPS进行往返:EPS =&gt; PDF =&gt; EPS。

诀窍是确保PDF使用与BoundingBox宽度和高度相同的媒体大小,方法是添加-dEPSCrop参数。

这两个命令创建&#39; EPS,没有空格&#39;

第1步:将EPS转换为PDF:

gs                   \
  -o so#12682621.pdf \
  -sDEVICE=pdfwrite  \
  -dEPSCrop          \
   so#12682621.eps

第二步:将PDF转换回EPS:

gs                                \
  -o so#12682621.roundtripped.eps \
  -sDEVICE=epswrite               \
   so#12682621.pdf 

要测试生成的EPS的保真度,您可以使用ImageMagick的compare以像素方式显示差异(作为PNG文件):

 compare                      \
   -density 600               \
    12682621.roundtripped.eps \
    12682621.eps              \
   -compose src               \
    12682621.png

导致:enter image description here

您会注意到存在一些像素差异。它们是由%%HiResBoundingBox的707.500000值引起的,这导致稍后出现舍入错误(PNG无法使用半像素&#39;)。