我尝试运行:
C:\Users\Oleg\Desktop>epstopdf.exe test5-reference.eps
我只得到一个空白的 .pdf,内容如下:
Error: /undefined in uageLevel:
Operand stack:
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2
%stopped_push --nostringval-- --nostringval-- --nostringval-- false 1
%stopped_push 1926 1 3
%oparray_pop 1925 1 3
%oparray_pop --nostringval-- 1909 1 3
%oparray_pop 1803 1 3
%oparray_pop --nostringval--
%errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2
%stopped_push --nostringval--
Dictionary stack:
--dict:1169/1684(ro)(G)-- --dict:0/20(G)-- --dict:81/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
MiKTeX GPL Ghostscript 9.05: Unrecoverable error, exit code 1
epstopdf.exe: Invalid argument
不知道哪里出了问题。我在 Win7 64 位上。
编辑
Matlab R214b 用于创建.eps,调用方式如下:
print(gcf, '-depsc', filename)
它使用 中指定的设置printjob()
。具体来说:
pj.PostScriptTightBBox = 1; %True if want to have a tight BoundingBox
基本上,它在 .eps 中创建以下行:
%%BoundingBox: (atend)
然而,epstopdf 明确指出:
The case of "%%BoundingBox: (atend)" when input is not seekable (e.g., from a pipe) is not supported.
现在的问题是,为什么输入不可搜索,或者它是一个漏洞在 epstopdf 中?
另外,检查 Matlab 的先前版本如何使用相同的调用创建 .eps 也很有趣。
编辑2
epstopdf 团队的 Christian Zietz 发现的问题:
我进一步调查了一下:似乎问题仅发生在 MikTeX epstopdf 中,并且仅当两件事同时发生时才会发生:EPS 文件标题中的“%%BoundingBox:(atend)”和 Unix 风格的行尾,这仅意味着 LF 而不是 Windows 中习惯的 CR+LF。
我向 Miktex 提交了一个错误报告。
答案1
我在 Windows 上也遇到了这个问题。我使用了两种解决方案,第一种是便携式的,也是首选的。
解决方案 1。只需在 Matlab 中将 eps 文件读取为文本,然后将所有新行替换\n
为回车符 + 新行即可\r\n
。为了使其可移植,只需使用带有“text”标志的 fwrite:
f = 'myplot.eps';
eps = fileread(f);
fd = fopen(f, 'wt');
fwrite(fd, eps);
fclose(fd);
system(['epstopdf ' f]);
注意fopen() 中的wt
“而不是” w
。这告诉 fopen() 以文本模式写入,它将用当前操作系统正在使用的任何内容替换任何\n
内容,即在 Windows、Linux 等上。\r\n\
\r\n
\n
解决方案 2。另一种不太便携的方法(容易出现字体嵌入问题)是直接调用 Ghostscript 将 .eps 转换为 .pdf,然后pdfcrop
(从 Miktex)裁剪到边界框,不留白边。显然,您需要为此安装 Ghostscript。
gswin32c -sDEVICE=pdfwrite -o myplot.pdf myplot.eps
pdfcrop --hires --margins 0.25 myplot.pdf
这将产生mygraph-crop.pdf
您可以使用的文件。您也可以使用来自Xpdf 二进制文件对于 Windows,但据我记得,该脚本还调用了 gswin32c。但它可能会将更好/更完整的选项传递给 gswin32c(我还没有尝试过)。请注意,您(很可能)会收到有关字体替换的警告。pdf 应该看起来不错,我没有遇到任何视觉问题。如果看起来不好,那么修复这些问题就是另一回事了(您必须通过 -sFONTPATH= 开关指向 Ghostscript 搜索更多字体路径,或者编辑字体映射文件)。
我只使用解决方案1。
干杯
答案2
我也在使用 R2014b。使用命令行使用'print -depsc'
或'saveas('*.eps')
命令在 matlab 中保存图形会产生与前面的发帖者提到的相同的 eps 代码,在 *.eps 文件中具有以下边界框属性:
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: (MATLAB, The Mathworks, Inc. Version 8.4.0.150421 \(R2014b\). Operating System: Windows 7)
%%Title: filename.eps
%%CreationDate: 2015-01-12T18:05:47
%%Pages: (atend)
%%BoundingBox: (atend)
%%LanguageLevel: 3
%%EndComments
但是当我使用 matlab gui 将完全相同的图形保存为 *.eps 时,我得到了不同的行为。现在我得到了一个 *.eps 文件,它可以与 miktex 中的 epstopdf 一起使用:
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: (MATLAB, The Mathworks, Inc. Version 8.4.0.150421 \(R2014b\). Operating System: Windows 7)
%%Title: path/filename.eps
%%CreationDate: 2015-01-12T18:07:15
%%Pages: (atend)
%%BoundingBox: 0 0 403 302
%%LanguageLevel: 2
%%EndComments
更新:当我使用 hgexport 函数时,我得到一个也可以与 epstopdf 一起使用的 *.eps 文件。
matlab code:
epsfig = hgexport('factorystyle');
epsfig.Format = 'eps';
hgexport(gcf,'filename',epsfig,'Format','eps')
eps-file:
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: (MATLAB, The Mathworks, Inc. Version 8.4.0.150421 \(R2014b\). Operating System: Windows 7)
%%Title: filename.eps
%%CreationDate: 2015-01-12T18:02:36
%%Pages: (atend)
%%BoundingBox: 0 0 403 302
%%LanguageLevel: 2
%%EndComments
我在 mathworks 社区中找到了此解决方案:http://de.mathworks.com/matlabcentral/answers/159509-eps-export-problems-in-r2014b