5

我一直在使用 html-pdf (phantomjs) 在 AWS Lambda 上使用 NodeJS 8.0 创建 PDF,它运行良好。由于 AWS Lambda 已停止对 NodeJS 8.0 的支持,我们已将 NodeJS 版本更新到最新的 12.x,当我们用完 PDF Lambda 函数时出现以下错误:

{"errorType":"Error","errorMessage":"write EPIPE","code":"EPIPE","errno":"EPIPE","syscall":"write","stack":["Error: write EPIPE"," at afterWriteDispatched (internal/stream_base_commons.js:154:25)"," at writeGeneric (internal/stream_base_commons.js:145:3)"," at Socket._writeGeneric (net.js:784:11)"," at Socket._write (net.js:796:8)"," at doWrite (_stream_writable.js:403:12)"," at writeOrBuffer (_stream_writable.js:387:5)"," at Socket.Writable.write (_stream_writable.js:318:11)"," at PDF.PdfExec [as exec] (/var/task/node_modules/html-pdf/lib/pdf.js:141:15)"," at PDF.PdfToBuffer [as toBuffer] (/var/task/node_modules/html-pdf/lib/pdf.js:44:8)"," at /var/task/index.js:121:38"]}

phantomPath: './phantomjs_lambda/phantomjs'
process.env.FONTCONFIG_PATH='/var/task/fonts'

我试图检查 StackOverflow 中的类似问题。我已经正确地指出了 phantomjs 路径,也有适当的 fontconfig。我们现在卡住了,因为我们无法更新 Lambda 函数。任何帮助将不胜感激。

更新:更改了 phantomjs 二进制文件的路径:

phantomPath: './node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs'

将路径更改为phantomjs二进制后,错误已更改为:

{"errorType":"Error","errorMessage":"write EPIPE","code":"EPIPE","errno":"EPIPE","syscall":"write","stack":["Error: write EPIPE","    at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:92:16)"]}
4

3 回答 3

3

当我将 lambda 的 Node 版本更新为14.x时,我最近也遇到了这个问题。遵循以下步骤后,我可以解决我的问题。

我通过phantomPath : "./node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs"pdf.create(html,tempParamms)

  • 从此回购中获取所有文件:https ://github.com/naeemshaikh27/phantom-lambda-fontconfig-pack
  • 复制所有.so文件并将它们粘贴到您的项目根目录中。
  • fonts在项目根目录中创建一个名为的目录。
  • 复制文件以外的所有文件.so并将所有文件粘贴到新创建的fonts目录中。
  • 从文件中替换以下代码fonts/fonts.conf
  • FONTCONFIG_PATH添加具有值 = 的Lambda 环境变量/var/task/fonts
  • 将代码上传到 Lambda。

字体/fonts.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/var/task/fonts/</dir>
  <cachedir>/tmp/fonts-cache/</cachedir>
  <config></config>
   <match target="font">
  <edit mode="assign" name="rgba">
   <const>rgb</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hinting">
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hintstyle">
   <const>hintslight</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="antialias">
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="lcdfilter">
   <const>lcddefault</const>
  </edit>
 </match>
</fontconfig>

参考:链接

于 2021-05-15T08:15:44.503 回答
0

html-pdf 使用 npm 包 phantomjs-prebuilt

phantomjs-prebuilt 将根据您的操作系统/架构自动为您安装 phantomjs

重要的是 node_modules 不会被复制到 docker 映像中,而是安装在 docker 映像本身上

我已经为 azure 创建了自定义 docker 映像,对于 AWS,您需要执行相同的操作https://docs.aws.amazon.com/lambda/latest/dg/images-create.html

在这个线程之后,您还需要安装几个依赖项https://gist.github.com/julionc/7476620

确保您的 .dockerignore 文件中有 node_modules/

node_modules/

用于 azure 函数的 Docker 文件(应该为 AWS lambdas 创建模拟 dockerfile)

FROM mcr.microsoft.com/azure-functions/node:3.0-node12-appservice

RUN apt-get update
RUN apt-get install build-essential chrpath libssl-dev libxft-dev -y
RUN apt-get install libfreetype6 libfreetype6-dev -y
RUN apt-get install libfontconfig1 libfontconfig1-dev -y

ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
    OPENSSL_CONF=/etc/ssl/

COPY . /home/site/wwwroot


RUN cd /home/site/wwwroot && \
    npm install

添加 OPENSS_CONF=/etc/ssl/ 是必不可少的,因为 phantomjs 会引发另一个错误

于 2021-08-31T05:13:19.233 回答
0

您收到此错误是因为 AWS 将环境中的基本实用程序从节点 10.x 拉到 12.x(例如 ImageMagick)。

解决方案是包含您自己缺少的功能或使用 lambda 层。以下是有关使用 ImageMagic https://github.com/serverlesspub/imagemagick-aws-lambda-2的 lambda 层的信息

为了进一步阅读这个问题,我建议在这里查看 AWS 论坛: https ://forums.aws.amazon.com/thread.jspa?threadID=305691

于 2021-01-14T08:50:53.797 回答