优化Mathematica生成的eps / pdf文件的大小

时间:2011-10-31 12:51:26

标签: pdf wolfram-mathematica export figure eps

如何优化Mathematica生成的eps或pdf文件的大小?

通常文件大小应该大50-100倍(下面的示例)。对于某些应用程序(例如将图形放在出版物中,或者甚至更多 - 将其放在大型海报上)我需要在矢量图形中使用轴,因此对于我而言,使用光栅图形不是最佳选择。

每个实用的解决方案(无论是在Mathematica中设置正确的选项,还是在其他应用程序中进行进一步的转换)都将受到赞赏。

例如,以下代码生成eps数字:

plot = ListDensityPlot[
Table[Random[], {100}, {100}],
InterpolationOrder -> 0]

Export["testplot.eps", plot]
Export["testplot.pdf", plot]

生成一个大小为3.3MB且pdf大小为5MB的eps文件(在Mac OS X 10.6上的Mathematica 7上,如果它有所不同)。

为了进行比较,具有相同轴的3x3图具有8kB(pdf)到20kB(eps)。 bmp中100x100点为30kB(png略低)。

其他类型的情节也是如此,重点是ListPlot3D

3 个答案:

答案 0 :(得分:5)

您可能已经找到了如何在他提供的链接中应用Alexey's答案。但如果你在这里遇到麻烦,我会提供如何将这项技术应用于2D图形。

我发现很难,如果你想创建一个好的情节,你需要对Mathematica非常具体。因此,正如您在我的帖子Rasters in 3D中所注意到的那样,我创建了一个指定所有选项的对象,以便Mathematica可以满意。

in = 72;
G2D = Graphics[{},
   AlignmentPoint -> Center, 
   AspectRatio -> 1,
   Axes -> False,
   AxesLabel -> None,
   BaseStyle -> {FontFamily -> "Arial", FontSize -> 12},
   Frame -> True,
   FrameStyle -> Directive[Black],
   FrameTicksStyle -> Directive[10, Black],
   ImagePadding -> {{20, 5}, {15, 5}},
   ImageSize -> 5 in, 
   LabelStyle -> Directive[Black],
   PlotRange -> All,
   PlotRangeClipping -> False,
   PlotRangePadding -> Scaled[0.02]
]; 

我在此应该提及您必须指定ImagePadding。如果将其设置为all,则您的eps文件将与Mathematica显示的不同。无论如何,我认为拥有这个对象可以让你很容易地改变属性。

现在我们可以继续讨论你的问题:

plot = ListDensityPlot[
  Table[Random[], {100}, {100}],
  InterpolationOrder -> 0,
  Options[G2D]
]

Output

以下分隔轴和栅格并将它们组合成结果:

axes = Graphics[{}, AbsoluteOptions[plot]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]

Output2

这里唯一的区别,在这一点上我无法解释的是轴标签,它们有小数点。最后,我们导出它们:

Export["Result.pdf", result];
Export["Result.eps", result];

结果是pdf文件大小为115 Kb,eps文件大小为168 Kb。

UPDATE:

如果您使用的是Mathematica 7,则无法正确显示eps文件。所有你会看到的是你的主要人物,侧面是黑色。这是版本7中的错误。但是,这在Mathematica 8中已得到修复。

我之前曾提到我不知道为什么轴标签不同。阿列克谢普普科夫想出了一个解决方案。要创建axesfigresult,请使用以下内容:

axes = Graphics[{}, FilterRules[AbsoluteOptions[plot], Except[FrameTicks]]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]

答案 1 :(得分:3)

我在以下两个方面取得了一些成功:

(1)保存前栅格化图。质量通常合理,尺寸大幅下降。

(2)我保存到postscript,然后(我在Linux机器上)使用ps2pdf来获取pdf。这比直接从Mathematica直接保存到pdf要小得多。

Daniel Lichtblau

答案 2 :(得分:2)

ImageResolution适用于.pdf,但我没有成功使用.eps。

Export["testplot600.pdf", plot, ImageResolution -> 600]

600 dpi的输出大小为242 KB,300 dpi的输出大小为94 KB。您还可以为ImageSize设置Export

如果你想进入第三方路线,我建议使用GraphicConverter。它非常可靠,有很多选择。