在 AWS Lambda 和 Node.js 12.x 中使用自定义字体

Fra*_*sco 5 fonts amazon-web-services aws-lambda sharp

我正在尝试创建一个 AWS Lambda 函数来对图像应用水印效果。原始图像将从 S3 中提取,应用水印并将结果上传回 S3。

我使用Sharp通过以下代码创建这些组合:

await sharp(inputImage)
              .rotate()
              .composite([{ input: new Buffer.from(watermark), tile: true, gravity: 'northwest' }])
Run Code Online (Sandbox Code Playgroud)

带有自定义水印 SVG

watermark = `<svg ... <text x="50%" y="100%" style="font-family:'Open Sans';font-weight:400;font-size:75px;font-style:normal;fill:rgba(128,128,128,1);stroke:none;" text-anchor="middle">${event.watermarkName}</text></g></svg>`;
Run Code Online (Sandbox Code Playgroud)

SVG 内部有一个文本元素,我可以动态更改该元素以包含指定的字符串。例如,我可以放置(c) Company Name一张图像和(c) John Doe另一张图像。

该代码在我的机器上运行时有效,但一旦进入具有 Node.js 12.x 运行时的 Lambda 函数,这就是结果 文本水印示例

正如你所看到的,我指定了Open Sans要使用的字体。事实上,我将OpenSans-Regular.ttf文件放入/fonts/,创建了一个fonts.conf文件并按照这个问题FONTCONFIG_PATH='/var/task/fonts'中的描述设置了 a 。

尽管如此,字体仍然无法工作。有人对我如何解决这个问题有建议吗?

Fra*_*sco 10

很好地询问 Stackoverflow 帮助我自己找到了答案,所以我分享以防将来有人偶然发现这个问题。

\n

AWS Lambda 本身似乎甚至不支持基本字体。因此,您需要将您的字体作为文件包含在部署 zip 文件中。

\n

就我而言,这有效:

\n
    \n
  • 创建一个/fonts文件夹并在里面放置所需的所有文件(在我的例子中OpenSans-Regular.ttf)。

    \n
  • \n
  • fonts.conf在此文件夹中放置一个名为的文件

    \n
    <?xml version="1.0"?>\n<!DOCTYPE fontconfig SYSTEM "fonts.dtd">\n<fontconfig>\n   <dir>/var/task/fonts/</dir>\n   <cachedir>/tmp/fonts-cache/</cachedir>\n   <config></config>\n</fontconfig>\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 通过创建环境变量告诉 Lambda 配置文件在哪里

    \n
     FONTCONFIG_PATH=\'./fonts\'\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

瞧\xc3\xa0!

\n

工作示例

\n