将Arial Unicode MS添加到CKEditor

时间:2015-05-28 14:20:42

标签: pdf unicode fonts ckeditor flying-saucer

我的Web应用程序允许用户在CKEditor中编写富文本,然后使用Flying Saucer库将结果导出为PDF。

由于他们需要编写希腊字符,我选择通过执行以下操作将Arial Unicode MS添加到可用字体中:

config.font_names = "*several fonts...*; Arial Unicode MS/Arial Unicode MS, serif";

此字体现在在CKEditor菜单中正确显示,但是当我将此字体应用于任何元素时,我得到以下结果:

<span style="font-family:arial unicode ms,serif;"> some text </span>

您可以注意到,我丢失了UpperCase字符。这在PDF导出期间效果非常差,因为Flying Saucer无法识别字体,因此使用不支持Unicode字符的Helvetica,因此希腊字符不会显示在PDF中。

如果我从代码来源手动更改

<span style="font-family:arial unicode ms,serif;"> some text </span>

<span style="font-family:Arial Unicode MS,serif;"> some text </span>

然后按预期工作,显示希腊字符。

以前有人遇到过这个问题吗?有没有办法避免将UpperCase字符更改为LowerCase? 我真的想避免做任何类型的后期处理,如:

htmlString = htmlString.replace("arial unicode ms", "Arial Unicode MS");

3 个答案:

答案 0 :(得分:4)

除了Flying Saucer R8之外,我同意你解决这个问题。 虽然取决于您的工作流程,允许CKEditor预处理和验证已完成的HTML编码文件(首先将整个文档呈现为HTML)会更有效吗?

CKEditor支持票据都没有指定问题的真正来源,因此我建议您自己确认是(A)样式问题,还是(B)CSS处理问题,或(C)特殊的CKEditor解析问题。

可能的解决方法: 复制所需的unicode字体并将其导入Type 3.2(适用于Mac和Windows)。

http://www.cr8software.net/type.html

将重复的字体集重命名为全部小写。

限制字体选择

config.font_names =“customfontnamehere”;

单独应用样式(下面的unicode字体greatvibes),看看是否能提供所需的结果:

var s = CKEDITOR.document.$.createElement( 'style' );
s.type = 'text/css';
cardElement.$.appendChild( s );

s.styleSheet.cssText =
'@font-face {' +
'font-family: \'GreatVibes\';' +
'src: url(\'' + path +'fonts/GreatVibes-Regular.eot\');' +
'}' +
style;

如果上述方法不起作用,你可以尝试修改xmas plugin.js(也使用unicode字体greatvibes并在输出前做各种很酷的操作),所以可能值得尝试修改它而不是开始从头开始:

'<style type="text/css">' +
'@font-face {' +
'font-family: "GreatVibes";' +
'src: url("' + path +'fonts/GreatVibes-Regular.ttf");' +
'}' +
style +
'</style>' )

无论您尝试哪种方法,目标都是测试各种样式,并查看CKEditor是否会再次默认返回Helvetica。

最后,CKEditor SDK具有出色的支持,所以如果你有时间和精力,你可以写一个插件。听起来令人生畏,我知道,但请注意/ plugins / font目录中的plugin.js如何优先考虑大小属性。

如果您对制作自己的插件不感兴趣,我建议您联系多产的ckeditor插件编写者

<强> doksoft

(在他们的网站和他自己的网站上列出)并要求他的商业插件“CKEditor Special Symbols”的演示,它具有广泛的unicode功能。     希望有所帮助,                  ClaireW

答案 1 :(得分:2)

我没有找到任何方法使用飞碟R8,但你可以使用飞碟R9使它工作。

方法 ITextResolver.addFont(String path, String fontFamilyNameOverride, String encoding, boolean embedded, String pathToPFB)允许您添加喜欢的特定名称。

代码示例:

  ITextRenderer renderer = new ITextRenderer();
  // Adding fonts
  renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", "arial unicode ms", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, null);
  renderer.getFontResolver().addFont("fonts/ARIALUNI.TTF", "Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, null);

  String inputFile = "test.html";
  renderer.setDocument(new File(inputFile));
  renderer.layout();

  String outputFile = "test.pdf";
  OutputStream os = new FileOutputStream(outputFile);
  renderer.createPDF(os);
  os.close();

您可以在Maven找到Flying Saucer R9。

答案 2 :(得分:2)

最简单的解决方案(直到CKEditor修复该bug)才能进行后处理。

你可以在服务器上进行(非常简单,你已经拥有代码)或者使用一个小的CKEditor插件,但这将为你提供你想要的解决方案,除非你需要添加更多的字体,它将无需任何工作进一步的变化。