Ошибка: Неизвестная версия 0 при использовании NodeJS PDFKit

Я пытаюсь получить отличный NodeJS PDFKit для использования пользовательских шрифтов OpenSans и Roboto из Шрифты Google. Мой код выглядит следующим образом:

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 семейство», а затем щелкнув значок загрузки в правом верхнем углу этого всплывающего окна.

Почему эти шрифты не работают?


person Ryan Shillington    schedule 03.10.2017    source источник


Ответы (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"));

Тогда ваши шрифты будут кристально чистыми. Поддерживает этот ответ за то, что дал мне нужные мне подсказки.

person Ryan Shillington    schedule 03.10.2017
comment
На самом деле, позже я понял, что случайно пропустил свои шрифты ttf через фильтр, который модифицировал кодировку шрифтов. Убедитесь, что вы не копируете шрифты с помощью ant/gradle, на котором есть фильтр, предназначенный только для ваших исходных файлов. - person Ryan Shillington; 04.04.2018