【问题标题】:How to adjust BoundingBox of an EPS file?如何调整 EPS 文件的 BoundingBox?
【发布时间】:2012-10-01 23:41:25
【问题描述】:

我想裁剪PSPDF 文件的主要区域以创建一个没有空白的EPS 文件。 ghostrciptps2pdfepstools命令可以将主图从文档文件中裁剪出来。

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

当我们想要将生成的 EPS 文件插入到 PS 文档中时的区别。当有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。现在如果尝试在PS 文档中插入这个EPS 文件,它会尝试在这个坐标处嵌套。

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

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

例如,如何将此 EPS 文件插入到 PS 文档的位置 200 200 255 208。我尝试使用以下代码插入 EPS,但除非 BoundingBox 从 0 0 开始,否则它将不起作用:

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

【问题讨论】:

  • 请发布(链接到)您希望修改的示例 EPS 文件。
  • @KurtPfeifle 情况很一般,但我通过示例进一步描述了我的问题。

标签: pdf ghostscript postscript eps


【解决方案1】:

简单的un-翻译怎么样?

-72 -700 translate

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


尴尬!

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

优点是:如果您可以保证输入 EPS 充分符合 DSC 以提供这些标记,这种方法将比传递文件快几个数量级通过 鬼脚本。

简单是这个程序的优点和局限性。它扫描 DSC cmets,从 BoundingBox 注释中提取值,抑制 HiResBoundingBox,并在 Page 注释之后添加 postscript 'translate' 和 'rectclip' commnds。只要 EPS 确实是真实的,这应该会产生正确的结果。但是另一个答案中的 ghostscript 方法会在 DSC 一致性较差的输入文件上产生结果(因为它不走捷径,它将 DSC 视为 cmets 并完全忽略它们)。

严格来说,'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

【讨论】:

  • 问题是我不知道每个EPS文件的BoundingBox。我的意思是我需要检查每个 EPS 文件。我希望找到一个通用的方法。
  • 一般做法是读取%%BoundingBox cmets,并在插入EPS前正确设置CTM。通常的做法是在 BoundinBox 中包含一个剪辑(尽管这不是必需的)并将显示页面重新定义为空操作,尽管在适当的 EPS 中也不需要这样做。然而,许多“EPS”文件并不真正符合要求。基本点是 EPS 消费者需要阅读 cmets 并对其采取行动。
  • @All 我已经更新了一个程序示例。这是一项简单的任务,需要一个简单的程序,恕我直言。
【解决方案2】:

要将其转换为您想要的 BoundingBox 样式的 EPS,我会使用 Ghostscript 并让 EPS 进行往返:EPS => PDF => EPS。

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

这两个命令会创建你的'EPS without white space'

第一步:将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

导致:

您会注意到存在一些像素差异。它们是由 %%HiResBoundingBox 中的 707.500000 值引起的,这会导致稍后出现舍入错误(PNG 不能有“半像素”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多