我正在尝试在 BIRT 的 PDF 报告上打印针叶提取物。相反,它显示的是针桃提取物,因此在 PDF 中缺少叶樱。这是一个字体问题,类似于这个人的问题。但是,我们已经在使用无衬线字体。那个人的解决方案是字体有些不同。
有谁知道在 Linux 上下文中用于这种事情的正确字体?
问题
这个字体问题不是由于 serif / sans serif 字体本身,而是由于字体没有覆盖文本中的字符。未渲染的字符指的是“樱花叶”,是汉文(中日韩统一表意文字)的一部分:
Glyph Unicode code point Represents Code Block
叶 U+53F6 to harmonize, to rhyme; to unite; (borrowed for) leaf CJK Unified (plane 5 stroke 5)
樱 U+6A31 cherry/cherryblossom CJK Unified (plane 6 stroke 15)
http://www.fileformat.info/info/unicode/char/53f6/index.htm
http://www.fileformat.info/info/unicode/char/6a31/index.htm
http://www.decodeunicode。 org/en/u+53f6/properties
http://www.decodeunicode.org/en/u+6A31/properties
unicode 代码点是字符的“通用虚拟表示”——它们不包含在您的文件中,也不呈现在您的屏幕上。
过程如下:
Author's Head/ Virtual Space Bytes In
Generating Tool ---> (Incl. Strings ---> File ----> Screen/Printer
In Tool Memory)
Desired Unicode Character Encoded Symbol Rendered Via
Language Symbol Code Point Via Nominated Nominated Font In
File Encoding File
在 Microsoft 中,Arial 掩盖了将字体与文本匹配的需要,因为Arial Unicode MS字体实际上是Arial字体之外的一个大扩展 - 它包括大多数 Microsoft 代码页,包括这个包含这两个字符的代码页。
现代 Linux 安装应该有支持的字体。如果你的没有,那么肯定是没有安装中文功能的。使用Ubuntu 管理语言支持功能解决此问题的示例。键入以下内容以发现匹配的字体:
xlsfonts | grep gb
xlsfonts | grep big5
xlsfonts | grep han
xlsfonts | grep ming
xlsfonts | grep song
xlsfonts | grep kai
下载适用于 Linux 的中文/亚洲字体
来自 Adobe:
http://www.adobe.com/support/downloads/product.jsp?platform=windows&product=10(转到附加组件)
http://www.adobe.com/support/downloads/detail.jsp?ftpID= 4883
http://www.adobe.com/support/downloads/product.jsp?platform=windows&product=10
优点:如果您使用这些字体生成 PDF,那么当用户尝试在未安装字体的情况下使用 adobe reader 阅读 PDF 时,会自动通知他们并提示下载字体。在非 Linux 客户端上提供兼容性。
非 Adobe:
在 Linux 上,以下字体支持这两个字符:
GNU 统一字体
明字体
文泉驿点阵宋体 wqy-bitmapfont
无衬线字体
文泉驿微黑
常规字体
见https://wiki.archlinux.org/index.php/Fonts#.28Mainly.29_Chinese
如果您自己下载,则需要管理员权限才能将字体复制到适当的 linux 目录(定义见/etc/fonts/fonts.conf
、 例如/var/font/truetype, /usr/share/fonts, /usr/local/share/fonts,
和/home/<username>/.fonts
)。 这里和这里的方向。
缺点:您需要手动将这些字体分发给客户端。非 Linux 客户端不兼容的风险。
在 Birt 中配置字体路径
在此步骤和下一步中更改 fontsConfig.xml 后,需要重新启动 BIRT 才能使更改生效。
设置font-paths
元素fontsConfig.xml;
<font-paths>
---------------
---------------
---------------
<path path="/var/font/truetype" />
</font-paths>
另请注意,块元素允许您指定字体仅适用于特定范围内的字符,允许为不同文本动态切换字体(对于多语言/多符号文本很有用:
<block name="Thai" start="e00" end="e7f" index="27" font-family="Font-Family"/>
在 Birt 中配置字体编码:
此外fontConfig.xml
,在font-encodings
元素中,确保您的字体具有覆盖您的字符的适当字符编码。例如,选择以下选项之一:
<font-encodings>
<encoding font-family="STSong-Light" encoding="UniGB-UCS2-H" />
<encoding font-family="STSongStd-Light" encoding="UniGB-UCS2-H" />
<encoding font-family="MHei-Medium" encoding="UniCNS-UCS2-H" />
<encoding font-family="MSung-Light" encoding="UniCNS-UCS2-H" />
<encoding font-family="MSungStd-Light" encoding="UniCNS-UCS2-H" />
</font-encodings>
注意:包含的任何 True Type 字体都将嵌入 PDF 中,显着影响其大小,同时确保所有客户都能正确阅读文档。
这些是 Adobe 编码,涵盖了大部分/所有更广泛的 GB10380 字符集,而不是较旧的 GB2312 集(或 EUC-CN),这对您来说太窄了。上面的例子来自 BIRT 论坛,但是一个关于 Adobe 已经弃用 UCS2 的小警告——你可以用“UTF16”替换字符串中的“UCS2”。
使用 Adobe 编码的原因:Adobe 被认为是跨平台编码广泛 CJK 字符的标准。历史上很少有系统直接支持 GB10380 字符集。 此外,许多打印机都支持 Adobe 编码和字体——这是一个重要因素。 默认 Linux 字符集/编码可能不支持您的需求,但您可以尝试参考可用的 Linux 编码:
可用的字符集(编码): locale -c
或 charsets
(或 Gnome 版本的字符映射程序)
可用的 Linux 语言环境: locale -a
locale
locale charset
在 debian 上,我安装了一大堆中文和其他亚洲字体,以确保在我生成数千个不同字符集的 PDF 时,这种情况不会再次发生在我身上。
这些是我安装的字体:
ttf-arphic-bkai00mp ttf-arphic-bsmi00lp ttf-arphic-gbsn00lp ttf-arphic-gbsn00lp ttf-arphic-gkai00mp ttf-arphic-ukai ttf-arphic-uming ttf-kochi-gothic ttf-kochi-mincho ttf-baekmuk
我建议您一一安装/卸载它们,看看您需要哪一个。参考一篇非常好的 Debian 文章:Debian 中的所有中文字体