PDF 到 EPS 或 PS 到 EPS 的转换保持页面大小

PDF to EPS or PS to EPS conversion maintaining page size

我需要将 PDF 或 Postscript 文件转换为 EPS,我尝试使用 Ghostscript 和以下命令将 Postscript 转换为 EPS:

gswin32.exe -o output.eps -sDEVICE=eps2write -dFitPage input.ps

或PDF转EPS:

gswin32c.exe -q -dNOCACHE -dNOPAUSE -dBATCH -dSAFER -sDEVICE=eps2write -o output.eps -dFitPage input.pdf

它们都成功完成,但没有保持页面大小。输入的 PDF 或 PS 文件是相同的图纸,它们的页面大小均为 300x300pts。您可以下载这些文件 here and here。它们看起来像这样:

但是在将它们转换为 EPS 之后,结果是这些 PS to EPS and PDF to EPS。它们看起来像这样,第一个是从PS到EPS的结果,第二个是从PDF到EPS的结果(它们是使用E[=34=打开的] 将图像栅格化的查看器是低质量的原因):

如您所见,其中 none 具有原始的 300x300 点大小,我尝试了很多 Ghostscript 选项,但我无法获得具有正确边界的 EPS盒子。我只需要将 PDF OR PS 转换为 EPS,无论更容易还是给出更好的结果。

您的要求或多或少与通常要求的完全相反。

一般来说,人们希望 EPS 边界框与 EPS 的实际标记尽可能紧密,因为 EPS 文件的正常使用是在另一个文档中 'embed' 它。如果你想要额外的白色 space 你通常会在嵌入它时将它添加到 EPS 周围。

确实,EPS 规范规定 BoundingBox 注释不应包含白色 space。在 EPSF 规范的第 8 页:

"For an EPS file, the bounding box is the smallest rectangle that encloses all the marks painted on the single page of the EPS file"

在这里乱用 Ghostscript 开关不会对您有任何帮助,设备会明确记录输入所做的标记,并根据这些标记设置 BoundiongBox。

也许如果您要解释为什么您希望 EPS 文件包含不正确的 BoundingBox 注释,则可能会提出一些建议,但 Ghostscript 正在做它应该做的事情。

[附录]

(见下方评论,此为回复)

我怀疑您需要以某种方式更改流程。一种解决方案是让 PDF 从用白色填充整个页面开始。与许多人的期望相反,算作在页面上做标记,因此整个页面将被视为 BoundingBox。

只要您使用的是 Ghostscript eps2write 设备,您也可以为 %%BeginPageSetup 解析文档,eps2write 设备在此部分仍会写出原始文档大小,例如:

%!PS-Adobe-3.0 EPSF-3.0
%%Invocation: path/gswin32c -dDisplayFormat=198788 -dDisplayResolution=96 -sDEVICE=eps2write -sOutputFile=? ?
%%BoundingBox: 101 132 191 256
%%HiResBoundingBox: 101.80 132.80 190.30 255.20
%%Creator: GPL Ghostscript GIT PRERELEASE 951 (eps2write)
....
....
%%EndProlog
%%Page: 1 1
%%BeginPageSetup
4 0 obj
<</Type/Page/MediaBox [0 0 300 300]
/Parent 3 0 R
/Resources<</ProcSet[/PDF]
>>
/Contents 5 0 R
>>
endobj
%%EndPageSetup

您可以在此处看到原始媒体大小为 300x300,即使 BoundingBox 正确反映了页面上的标记。笔记!这是当前版本的 eps2write 生成的 EPS 文件的特性,它不适用于其他来源的 EPS 文件,将来可能无法与 eps2write 一起使用。

除此之外,您还需要从输入中查找媒体大小并将其单独传递给执行插入的程序,大概是通过将数据放入其他文本文件中与 EPS 一起使用。或者,当然,手动或以编程方式编辑 BoundingBox 的 urx,ury 坐标。

恐怕 Ghostscript 不会为您做这件事。