将图形导出为PDF时,是否可以导出打印标签中的特殊符号/西里尔字母?

将图形导出为PDF时,是否可以导出打印标签中的特殊符号/西里尔字母?,pdf,fonts,wolfram-mathematica,embedded-fonts,Pdf,Fonts,Wolfram Mathematica,Embedded Fonts,我正在尝试以PDF格式将图形列表导出为单独的帧,以便在外部实用程序(如pdf2swf)的帮助下编译矢量SWF动画。不幸的是,导出的PDF文件中的某些特殊字符(如学位符号或三点)已损坏。这也是所有俄语字母的命运。请注意,当Mathematica从Mma直接导出到SWF时,它会将列表中的图形光栅化,这在我的例子中会产生不满意的结果 有没有办法在导出的图形中保留这些字母 单个图形可以在图形编辑器中手动编辑,但对于数百帧视频来说,这几乎是不可能的。某些符号可以通过以下自定义函数保留: ExportPDF

我正在尝试以PDF格式将图形列表导出为单独的帧,以便在外部实用程序(如pdf2swf)的帮助下编译矢量SWF动画。不幸的是,导出的PDF文件中的某些特殊字符(如学位符号或三点)已损坏。这也是所有俄语字母的命运。请注意,当Mathematica从Mma直接导出到SWF时,它会将列表中的图形光栅化,这在我的例子中会产生不满意的结果

有没有办法在导出的图形中保留这些字母

单个图形可以在图形编辑器中手动编辑,但对于数百帧视频来说,这几乎是不可能的。某些符号可以通过以下自定义函数保留:

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文件来完成。