Ghostscript将多个eps文件连接成一个大eps文件

Posted

技术标签:

【中文标题】Ghostscript将多个eps文件连接成一个大eps文件【英文标题】:Ghostscript to concatenate multiple eps files into one big eps file 【发布时间】:2016-11-20 21:06:43 【问题描述】:

我的任务是将多个小 EPS 文件合并为一个大 EPS,条件是这些小 EPS 不应相互重叠。

我希望这可以通过编程方式完成,而不是使用 GUI 工具手动调整。

我已经尝试过 ghostscript 命令,但最后还是把那些小的 eps 放在了一起。

我还查看了 psutils (psnup/pstops),但我不确定它是否对我有帮助。

我不介意使用像Ghost4j 这样更重的程序/lib(尽管如果它不支持我的需要,我可能必须在那里添加更多功能)。我只是想确保这不能轻量级或使用现有工具完成。

谢谢!

【问题讨论】:

【参考方案1】:

您知道 EPS 文件是如何应该被使用的吗? EPS 文件的意义在于它旨在被应用程序用作“黑匣子”。

当应用程序创建 PostScript 程序时,它可以将 EPS 包含在最终输出中,除了大小之外,它不知道任何其他信息。所以当 PostScript 生成时,应用程序知道 EPS 的大小,并修改 CTM 以便根据需要缩放内容,并将其定位在页面上。

如果您想使用多个 EPS 文件,那么您必须这样做,您必须修改每个 EPS 文件之间的 CTM,以便将其放置在您需要的页面大小和位置。如果您不这样做,那么它们都将在页面上的当前位置和比例结束。正如你所说,它们最终会相互叠加。

现在 EPS 文件的全部意义在于它可以通过编程方式放置,但必须编写程序才能做到这一点:-)

首先您需要从 EPS 文件中解析边界框。如果 EPS 正确符合要求,这将是 %%BoundingBox 和可选的 %%HiResBondingBox cmets。

有了这些信息,您就需要决定您使用的媒体大小和/或如何缩放 EPS 文件以适应所需的媒体。

然后您启动一个新的 PostScirpt 程序,该程序首先请求特定的媒体大小,然后使用 scaletranslate 运算符移动到媒体上的正确位置,然后执行第一个 EPS 文件(通过包含内容,或使用run 运算符)。

对每个 EPS 文件重复该过程。

最后使用showpage操作符编写新内容

假设您在 Ghostscript 中使用了 eps2write 设备,生成的文件将是一个新的 EPS 文件,其中体现了各个 EPS 文件的内容,可以根据需要进行缩放和放置。

例如(所有值都只是虚构的示例数据):

%!
<< /PageSize [612 792] >> setpagedevice

gsave
306 396 moveto
0.5 0.5 scale
(example1.eps) run
grestore

gsave
306 0 moveto
1.5 1.5 scale
(example2.eps) run
grestore

gsave
0 396 moveto
(example3.eps) run
grestore

gsave
0 0 moveto
0.66 0.66 scale
(example4.eps) run
grestore

showpage

【讨论】:

谢谢。我可以通过对每个 eps 使用 translate 和 -c 开关来使其工作。

以上是关于Ghostscript将多个eps文件连接成一个大eps文件的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript:将非常小的 eps 升级为大 jpg

Ghostscript:将 EPS 转换为 PNG 时,有时质量会失败

Ghostview多个eps文件查看

如何在ghostscript中将svg、eps和ai转换为png

通过 ImageMagick 或 GhostScript 命令行旋转 .EPS 文件

如何使用 ghostscript 调整 .eps 文件的大小