【问题标题】:"Error: Unknown Version 0" when using NodeJS PDFKit使用 NodeJS PDFKit 时出现“错误:未知版本 0”
【发布时间】:2018-03-15 06:08:02
【问题描述】:

我正在尝试让非常优秀的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 Family Selected”弹出窗口,然后点击右上角的下载图标弹出窗口。

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

【问题讨论】:

    标签: node.js node-pdfkit google-fonts


    【解决方案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"));
    

    然后您的字体将显示得一清二楚。向this answer 的道具提供我需要的线索。

    【讨论】:

    • 实际上,后来我发现我不小心通过一个修改字体编码的过滤器运行了我的 ttf 字体。确保您没有使用 ant/gradle 复制字体,它有一个过滤器,仅适用于您的源文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多