我的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");
答案 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插件,但这将为你提供你想要的解决方案,除非你需要添加更多的字体,它将无需任何工作进一步的变化。