编辑2

编辑2

我尝试运行:

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 位上。

链接至 test5-reference.eps

编辑

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

相关内容