将图形导出为PDF时,是否可以导出打印标签中的特殊符号/西里尔字母?
我正在尝试以PDF格式将图形列表导出为单独的帧,以便在外部实用程序(如pdf2swf)的帮助下编译矢量SWF动画。不幸的是,导出的PDF文件中的某些特殊字符(如学位符号或三点)已损坏。这也是所有俄语字母的命运。请注意,当Mathematica从Mma直接导出到SWF时,它会将列表中的图形光栅化,这在我的例子中会产生不满意的结果 有没有办法在导出的图形中保留这些字母 单个图形可以在图形编辑器中手动编辑,但对于数百帧视频来说,这几乎是不可能的。某些符号可以通过以下自定义函数保留:将图形导出为PDF时,是否可以导出打印标签中的特殊符号/西里尔字母?,pdf,fonts,wolfram-mathematica,embedded-fonts,Pdf,Fonts,Wolfram Mathematica,Embedded Fonts,我正在尝试以PDF格式将图形列表导出为单独的帧,以便在外部实用程序(如pdf2swf)的帮助下编译矢量SWF动画。不幸的是,导出的PDF文件中的某些特殊字符(如学位符号或三点)已损坏。这也是所有俄语字母的命运。请注意,当Mathematica从Mma直接导出到SWF时,它会将列表中的图形光栅化,这在我的例子中会产生不满意的结果 有没有办法在导出的图形中保留这些字母 单个图形可以在图形编辑器中手动编辑,但对于数百帧视频来说,这几乎是不可能的。某些符号可以通过以下自定义函数保留: ExportPDF
ExportPDF[filename_, elem_,
opts : OptionsPattern[{Export, Outlines -> True}]] := Module[{$elem},
$elem = Style[elem, Background -> None];
If[OptionValue[Outlines] == True
, $elem =
First@ImportString[ExportString[$elem, "PDF"], "PDF",
"TextMode" -> "Outlines"]
];
Export[filename, $elem, FilterRules[{opts}, Options[Export]]]
]
不幸的是,它并不总是有帮助。一种解决方法是导出到EMF而不是PDF格式:
Export["C:\\1.emf",
Plot[Sin[x], {x, 0, Pi}, PlotLabel ->
"\:0420\:0443\:0441\:0441\:043a\:0438\:0435 \:0431\:0443\:043a\:0432\:044b"]]
如果愿意,您可以进一步将EMF转换为PDF或SWF。请参阅Mathematica关于高质量EMF导出的一般提示
另一种看似可靠的方法是仅将西里尔文文本转换为大纲,然后使用Inset
或标签将其放置在图形中:
plotLabel =
First@ImportString[ExportString[
"\:0420\:0443\:0441\:0441\:043a\:0438\:0435 \:0431\:0443\:043a\:0432\:044b",
"PDF"], "PDF"];
Labeled[Plot[Sin[x], {x, 0, Pi}], plotLabel, Top]
或者,您可以直接将轮廓文本用作绘图标签
:
Export["C:\\1.pdf", Plot[Sin[x], {x, 0, Pi}, PlotLabel -> plotLabel]]
您可以通过编写一个简单的例程来概括此方法:
cyrFix = First@ImportString[ExportString[#, "PDF"], "PDF"] &
您可以按如下方式使用它:
Export["C:\\1.pdf",
Plot[Sin[x], {x, 0, Pi}, PlotLabel ->
cyrFix@"\:0420\:0443\:0441\:0441\:043a\:0438\:0435 \:0431\:0443\:043a\:0432\:044b"]]
Mathematica的PDF导出目前不支持西里尔文,只支持罗马、希腊、日语和一些技术符号。如果您使用的是Mac电脑,您可以选择文件>打印>另存为PDF作为解决方法。@Alexey:谢谢。不确定,但导出到EMF似乎有效,因为它是位图[至少CorelDraw和Abobe Illustrator都没有正确导入导出的EMF],但第二种方法确实有效。@Igor Mathematica仅从版本6开始将3D图形导出到EMF格式的位图。它仍然将二维图形作为向量导出到EMF(如果它不是GraphicsComplex
)。如果您对导出3D图形(或GraphicsComplex
)感兴趣,可以提出另一个具体问题,但我在这方面还没有经验。关于CorelDraw:你试过使用最新的版本吗?@Alexey:我注意到cyrFix“文本”生成的图形,如果用作PlotLabel或AxesLabel,其大小比纯“文本”小。在修改您的示例后,我得到了令人满意的结果:PlotLabel->cyrFix@Style[“\:0420\:0443\:0441\:0441\:043a\:0438\:0435\:0431\:0443\:043a\:0432\:044b”,放大率->1.5]
。我还注意到,如果FontFamily->“Calibri”,cyrFix不会解决这个问题,而我尝试的其他字体确实是由cyrFix更正的。@Igor较小的大小是由于导出到PDF时使用了“打印输出”样式的环境。有关解决方案,请参见问题,有关详细说明,请参见答案。至于“Calibri”字体,我没有这样的问题:在我的系统上,cyrFix
可以很好地使用它以及其他字体。如果您使用的是版本8,您可能需要将“TextMode”->“Outlines”
选项添加到导入字符串
?@Alexey:“TextMode”->“Outlines”没有帮助。我喜欢未正确导出的loot字体:Book Antiqua、Bookman Old Style、Calibri、Century Schoolbook、Minion Pro、Mistral、e.t.c。然而,Calibri(从conrast到Calibri)由cyrfix!确定!。这意味着cyrFix对字体名称的大小写敏感!也可以在Windows上打印为PDF(使用虚拟PDF打印机)。在Mathematica前端的情况下,此过程通过在打印机的滑阀中创建临时高分辨率EMF文件来完成。