2

我正在尝试使用PDFKit使用 Node.js 生成 pdf 。pdf 包含多种语言的文本,包括阿拉伯语和俄语,所以我尝试使用Google 的Noto Sans,但是一旦我使用该字体,布局就完全被破坏了,甚至没有显示拉丁字符:

var doc = new PDFDocument();
doc.registerFont('NotoSans', 'fonts/NotoSans-Regular.ttf');
doc.font('NotoSans');
doc.pipe(res);
doc.fontSize(15);
doc.text('UTF-8 Test');
doc.text('صباح الخیر');
doc.text('japanese');
doc.text('武大郎');
doc.text('RUSSIAN');
doc.text('Привет / здравствуйте');
doc.end();

但这就是结果。我希望日语不起作用,但没有正确显示。这是我得到的输出:

在此处输入图像描述

为日语和阿拉伯语使用特定字体可以渲染该语言,但我需要一种支持多种语言的字体,因为我正在打印一个动态表,我什至不知道需要哪些语言。

4

1 回答 1

2

您的问题是 NotoSans-Regular.ttf 没有您要查找的所有字符。它只有西里尔文、希腊文、拉丁文字符:

南非荷兰语、阿格姆语、阿坎语、阿尔巴尼亚语、阿苏语、阿塞拜疆语、巴菲亚语、班巴拉语、巴萨阿、巴斯克语、白俄罗斯语、本巴语、贝纳语、波斯尼亚语、布列塔尼语、保加利亚语、加泰罗尼亚语、中阿特拉斯语、塔马兹特语、奇加语、科隆语、康沃尔语、克罗地亚语、捷克语、丹麦语、 Duala, 荷兰语, Embu, 英语, 世界语, 爱沙尼亚语, 母羊, Ewondo, 法罗语, 菲律宾语, 芬兰语, 法语, 弗留利语, Fulah, 加利西亚语, 甘达语, 德语, 希腊语, Gusii, 豪萨语, 夏威夷语, 匈牙利语, 冰岛语, 伊博语, 印度尼西亚语,爱尔兰语、意大利语、Jola-Fonyi、Kabuverdianu、Kabyle、Kalaallisut、Kalenjin、Kamba、哈萨克语、Kikuyu、Kinyarwanda、Koyra Chiini、Koyraboro Senni、Kwasio、吉尔吉斯语、Langi、拉脱维亚语、林加拉语、立陶宛语、Luba-Katanga、Luo、Luyia、马其顿语、Machame、Makhuwa-Meetto、Makonde、马达加斯加语、马来语、马耳他语、Manx、Masai、Meru、蒙古语、Morisyen、Mundang、Nama、North Ndebele、Northern Sami、Norwegian Bokmål、挪威尼诺斯克语、努尔语、Nyankole、奥罗莫语、波兰语、葡萄牙语、罗马尼亚语、Rombo、Rundi、俄语、Rwa、萨哈语、桑布鲁语、桑戈语、桑古语、塞纳语、塞尔维亚语、香巴拉语、绍纳语、斯洛伐克语、斯洛文尼亚语、索加语、索马里语、西班牙语、斯瓦希里语, 瑞典语, 瑞士德语, Taita, 塔吉克语, Tasawaq, Teso, 汤加语, 土耳其语, 乌克兰语, 乌兹别克语, 越南语, Vunjo, Walser, 威尔士语, Yangben, Yoruba, Zarma, Zulu

您需要以您使用的所有语言加载 Noto-San。

将 nato 克隆到您的项目目录中:

git clone git@github.com:googlei18n/noto-fonts.git

如果您还需要韩文、日文或中文,请克隆这些字体:

git clone git@github.com:googlei18n/noto-cjk.git

现在您有了要使用的字体,您需要注册它们

// Default
doc.registerFont('NotoSans', 'noto-ckj/hinted/Noto-Regular.ttf');
// Ariabic
doc.registerFont('NotoSansAR', 'noto-ckj/hinted/NotoKufiArabic-Regular.ttf');
// Chines, Korean, Japanese
doc.registerFont('NotoSansCKJ', 'noto-ckj/NotoSansCJK-Regular.ttc');

一旦你加载了适当的字体,你就可以像这样使用它们:

doc.font('NotoSans');
doc.text('English');

doc.font('NotoSansAR');
doc.text('العربية'); // Arabic

doc.font('NotoSansCKJ');
doc.text('日本語'); // Japanese
doc.text('武大郎'); // Chinese
doc.text('한국어'); // Korean

doc.font('NotoSans');
doc.text('русский'); // Russian
doc.text('ελληνικά'); // Greek

请注意不要在 PDF 中加载太多字体,因为它们会增加文档的整体大小。您可以考虑使用像Franc这样的库来确定在加载它们之前需要哪些字体。

于 2016-06-09T19:44:04.880 回答