ReportLab:使用中文/ Unicode字符

时间:2016-02-03 08:45:54

标签: python unicode fonts reportlab chinese-locale

TL; DR: 是否有某种方法告诉ReportLab使用特定字体,如果缺少某些字符的字形,是否会回退到其他字体?或者,您是否知道包含字形的精简TrueType字体?所有欧洲语言,希伯来语,俄语,中文,日语和阿拉伯语?

我一直在使用ReportLab创建报表,并且在渲染包含中文字符的字符串时遇到了问题。我一直在使用的字体是DejaVu Sans Condensed,它不包含中文的字形(但是,它确实包含西里尔语,希伯来语,阿拉伯语和各种用于欧洲语言支持的变音符号 - 这使得它非常通用,并且我不时需要它们)

但是,字体不支持中文,而且我找不到支持所有语言的TrueType字体,并且符合我们的图形设计要求。作为一个临时的解决方法,我做了这个,以便中国客户的报告使用完全不同的字体,只包含英文和中文字形,希望其他语言的字符不会出现在字符串中。然而,由于显而易见的原因,这是笨重的并且打破了平面设计,因为它不是DejaVu Sans,围绕它设计了整个外观和感觉。

所以问题是,您将如何处理在一个文档中支持多种语言的需要,并维护每种语言的指定字体的使用。由于有时字符串包含多种语言,因此确定应该为每个字符串使用哪种ONE字体不是一种选择。

是否有某种方法告诉ReportLab使用特定字体,如果缺少某些字符的字形,是否会回退到另一种字体?我在文档中发现了应该可能的模糊提示,尽管我可能不正确地理解它。

或者,你知道一个精简的TrueType字体,其中包含所有欧洲语言的字形,希伯来语,俄语,中文,日语和阿拉伯语吗?

感谢。

2 个答案:

答案 0 :(得分:5)

This question fascinated me the complete week, so since it is weekend I dived right into it and exactly found a solution which I called #banner-top { height:50%; width:100%; float:left; } #banner-bottom { height:50%; width:100%; float:left; } it is a normal MultiFontParagraph with one big difference you can exactly set a font fallback order.

Example of the font fallback working

For example this random Japanese text I pulled of the internet used the following font fallback Paragraph. It checks whether the first font has a glyph for the character, if so it uses it, if not it fallsback to the next font. Currently the code isn't really efficient as it places tags around each character, this can easily be fixed but for clarity I didn't do it here.

Using the following code I created the above example:

"Bauhaus", "Arial", "HanaMinA"

The source of the foreign_string = u'6905\u897f\u963f\u79d1\u8857\uff0c\u5927\u53a6\uff03\u5927' P = MultiFontParagraph(foreign_string, styles["Normal"], [ ("Bauhaus", "C:\Windows\Fonts\\BAUHS93.TTF"), ("Arial", "C:\Windows\Fonts\\arial.ttf"), ("HanaMinA", 'C:\Windows\Fonts\HanaMinA.ttf')]) (git) is as follows:

MultiFontParagraph

答案 1 :(得分:3)

来自slice!

  

Google一直在开发名为Noto的字体系列,旨在支持所有语言的外观和感觉。

Google Noto Fonts包含一种字体,支持以下区域的581种语言:

unified Noto Sans font

其他如希伯来语,阿拉伯语和日语在诺托网站上列为单独的项目。