0

我正在尝试让非常优秀的NodeJS PDFKit使用来自Google Fonts的自定义字体 OpenSans 和 Roboto 。我的代码如下所示:

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 个家庭”弹出窗口,然后单击该弹出窗口右上角的下载图标。

为什么这些字体不起作用?

4

1 回答 1

0

解决方案是将字体转换为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"));

然后你的字体就会清晰地显示出来。支持这个答案,为我提供所需的线索。

于 2017-10-03T23:20:15.903 回答