"Ошибка: неизвестная версия 0" при использовании NodeJS PDFKit
Я пытаюсь получить очень хороший NodeJS PDFKit для использования пользовательских шрифтов OpenSans и Roboto от Google Fonts. Мой код выглядит следующим образом:
this.doc = new PDFDocument({bufferPages: true});
this.doc.registerFont("Roboto-Black", path.join(__dirname, "fonts", "Roboto-Black.ttf"));
Я напечатал путь - он находит нужный файл. Я получаю следующую ошибку:
C:\projects\qbdvision\node_modules\restructure\src\VersionedStruct.js:37
throw new Error("Unknown version " + res.version);
^
Error: Unknown version 0
at VersionedStruct.decode (C:\projects\qbdvision\node_modules\restructure\src\VersionedStruct.js:37:15)
at C:\projects\qbdvision\node_modules\restructure\src\Pointer.js:69:30
at Pointer.decode (C:\projects\qbdvision\node_modules\restructure\src\Pointer.js:79:16)
at ArrayT.decode (C:\projects\qbdvision\node_modules\restructure\src\Array.js:49:30)
at VersionedStruct.Struct._parseFields (C:\projects\qbdvision\node_modules\restructure\src\Struct.js:53:22)
at VersionedStruct.decode (C:\projects\qbdvision\node_modules\restructure\src\VersionedStruct.js:42:12)
at VersionedStruct.decode (C:\projects\qbdvision\node_modules\restructure\src\VersionedStruct.js:40:23)
at C:\projects\qbdvision\node_modules\restructure\src\Pointer.js:69:30
at Pointer.decode (C:\projects\qbdvision\node_modules\restructure\src\Pointer.js:79:16)
at ArrayT.decode (C:\projects\qbdvision\node_modules\restructure\src\Array.js:49:30)
FAILED
Когда я удалил шрифт Roboto и попробовал один из OpenSans, он работал по крайней мере, но все выглядело ужасно. Письма кровоточили вместе и выглядели почти нечеткими.
Я загрузил шрифты с сайта fonts.google.com, нажав "Выбрать этот шрифт", щелкнув всплывающее всплывающее окно "1 выбранное семейство", а затем щелкнув значок загрузки в верхнем правом углу этого всплывающего окна.
Почему не работают эти шрифты?
1 ответ
Решение состоит в том, чтобы преобразовать шрифты в кодировку base64 и затем импортировать их. Поэтому в командной строке, используя Linux / Cygwin, введите:
base64 --wrap=0 Roboto-Black.ttf > Roboto-Black-Base64.ttf
Это создаст новый файл TTF, который должен содержать весь текст внутри. Если вы пользуетесь внешним сервисом, убедитесь, что упаковки нет. Это должен быть один непрерывный блок текста.
Затем в своем коде NodeJS выполните:
let fs = require("fs");
let doc = new PDFDocument({bufferPages: true});
let filePath = path.join(__dirname, "fonts", "Roboto-Black-Base64.ttf");
let fileContents = fs.readFileSync(filePath, "utf8");
this.doc.registerFont(fontName, new Buffer(fileContents, "base64"));
Тогда ваши шрифты будут отображаться кристально ясно. Подсказки к этому ответу за то, что дали мне подсказки, которые мне были нужны.