2016-05-18 108 views
1

我正在嘗試使用PDFKit生成帶有Node.js的pdf。該pdf包含多種語言的文本,包括阿拉伯語和俄語,所以我試圖使用谷歌的Noto Sans,但只要我使用該字體,佈局就完全破裂,甚至沒有顯示拉丁字符:使用Noto Sans時PDFKit損壞字體

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(); 

但這是結果。我期望日本人不工作,但沒有得到正確顯示。這是輸出我得到:

enter image description here

使用特定的字體爲日語和阿拉伯語作品渲染的語言,但我需要的是支持多國語言,因爲我打印動態表的字體,我不甚至知道需要哪些語言。

回答

0

你的問題是NotoSans-Regular.ttf沒有你要找的所有字符。它只有西里爾文,希臘文,拉丁文字符:

南非荷蘭語,Aghem,阿寒湖,阿爾巴尼亞,亞利桑那州立大學,阿塞拜疆,銀行法,班巴拉語, Basaa,巴斯克,白俄羅斯,本巴,笨啊,波斯尼亞語,布列塔尼語,保加利亞語, 加泰羅尼亞,中央阿特拉斯柏柏爾語,Chiga,Colognian,康沃爾,克羅地亞語, 捷克語,丹麥語,Duala,荷蘭,恩布,英語,世界語,愛沙尼亞語,埃維, Ewondo,法羅羣島,菲律賓語,芬蘭語,法語,弗留利,富拉語,加利西亞語, Ganda,德國,希臘,古西,豪薩,夏威夷,匈牙利,冰島, 伊博,印度尼西亞,愛爾蘭,意大利,Jola-Fonyi,Kabuverdianu,Kabyle, Kalaallisut,Kalenjin,Kamba,哈薩克斯坦,基庫尤,基亞爾萬達,KoyraChiini,Koyraboro森妮,Kwasio,吉爾吉斯,Langi,拉脫維亞語,林加拉語, 立陶宛,盧巴 - 加丹加,羅,Luyia,馬其頓語,Machame, Makhuwa-Meetto,馬孔德,馬達加斯加,馬來西亞,馬耳他,馬恩島,馬賽,梅魯, 蒙古,Morisyen,Mundang,那抹,北恩德貝勒語,北薩米, 挪威語,挪威尼諾斯克文,努爾,Nyankole,奧羅莫,波蘭語, 葡萄牙語,羅馬尼亞語,凱萊,隆迪語,俄語,RWA,薩哈,桑布魯, 三鄉, Sangu,塞納,塞爾維亞,Shambala,紹納,斯洛伐克,斯洛文尼亞,索加, 索馬里,西班牙語,斯瓦希里語,瑞典語,瑞士德語,泰塔語,塔吉克語, Tasawaq,特索,湯加,土耳其,烏克蘭,烏茲別克語,越南語,Vunjo, Walser,威爾士人,揚本人,約魯巴人,Zarma人,祖魯人

您需要使用所有正在使用的語言加載Noto-San。

克隆北約到項目目錄:

git clone [email protected]:googlei18n/noto-fonts.git 

如果你需要韓語,日語,還是中國克隆這些字體,以及:

git clone [email protected]: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這樣的庫在加載它們之前找出你需要的字體。

+0

P.S.我注意到,當使用不受限制的(而不是暗示)時,我看到了一些與你相同的結果。 這是來自[Google搜索樣式指南](https://material.google.com/style/typography.html#typography-typeface):「提示是嵌入字體中關於如何修改(扭曲)字形在低分辨率顯示器上看起來更好,作爲一種折衷,暗示字體消耗的空間要比無泄漏版本更多。「 – jwerre

+0

這是有道理的,但我仍然困惑,因爲如果我刪除所有其他語言,即使英文文本不起作用。感謝Franc鏈接,我會檢查它,看看我是否可以用於動態語言(我不知道我將要打印什麼語言) – jasalguero

+0

如果你克隆上面提到的git repo,你會注意到子目錄: 「hinted」和「unhinted」確保你使用了字體的「暗示」版本。我遇到了同樣的問題,就是「不願意」。 – jwerre