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

问题描述 投票:0回答:3

我正在尝试创建一个 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 Sans
作为要使用的字体。事实上,我将
OpenSans-Regular.ttf
文件放入
/fonts/
,创建了
fonts.conf
文件并设置了
FONTCONFIG_PATH='/var/task/fonts'
,如这个问题中所述。

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

amazon-web-services fonts aws-lambda sharp
3个回答
11
投票

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

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

就我而言,这有效:

  • 创建一个

    /fonts
    文件夹并在里面放置所需的所有文件(在我的例子中为
    OpenSans-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


2
投票

也为我工作过

FONTCONFIG_FILE="/var/task/fonts.conf"


0
投票

这个解决方案真的帮助了我,谢谢

环境变量

FONTCONFIG_PATH: /var/task/assets/fonts

fonts.conf
里面
/var/task/assets/

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
   <dir>/var/task/assets/fonts/</dir>
   <cachedir>/tmp/fonts-cache/</cachedir>
   <config></config>
</fontconfig>
© www.soinside.com 2019 - 2024. All rights reserved.