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

Utilizing custom font in AWS Lambda and Node.js 12.x

提问人:Francesco 提问时间:7/30/2020 更新时间:11/28/2021 访问量:3350

问:

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

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

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

带有自定义水印 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>`;

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

代码在我的机器上运行时有效,但是一旦进入具有 Node.js 12.x 运行时的 Lambda 函数,这就是结果Example of text watermark

如您所见,我指定为要使用的字体。事实上,我把文件放进去,创建了一个文件并设置了一个,如本问题所述。Open SansOpenSans-Regular.ttf/fonts/fonts.confFONTCONFIG_PATH='/var/task/fonts'

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

amazon-web-services 字体 aws-lambda sharp

评论


答:

9赞 Francesco 7/30/2020 #1

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

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

就我而言,这奏效了:

  • 创建一个文件夹,并在里面放置了所需的所有文件(在我的情况下)。/fontsOpenSans-Regular.ttf

  • 将名为 的文件放在此文件夹中fonts.conf

    <?xml version="1.0"?>
    <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
    <fontconfig>
       <dir>/var/task/fonts/</dir>
       <cachedir>/tmp/fonts-cache/</cachedir>
       <config></config>
    </fontconfig>
    
  • 通过创建环境变量告诉 Lambda 配置文件的位置

     FONTCONFIG_PATH='./fonts'
    

瞧!

Working example

评论

1赞 cyrf 5/12/2021
FONTCONFIG_PATH 对我不起作用。只对我有用。FONTCONFIG_FILE="/var/task/fonts.conf"
0赞 windowsill 3/1/2022
有没有人能够在无法设置环境变量的 Edge Lambda 中配置此功能?
0赞 windowsill 3/1/2022
通过以编程方式设置 envvar 让它工作process.env['FONTCONFIG_PATH'] = './fonts';
0赞 krishna422 11/24/2023
谢谢为我工作,但值得一提的是,如果您为其他任务/PDF 或相同的 PDF 使用多种字体,我们也必须包含这些字体。
1赞 Afonso Silva 11/28/2021 #2

也为我工作过FONTCONFIG_FILE="/var/task/fonts.conf"

评论

0赞 Daniel 11/29/2021
这并不能提供问题的答案。一旦你有足够的声誉,你就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。- 来自评论