首页 > 解决方案 > 使用 html-pdf npm 包生成 pdf,在 AWS 上部署为 GET api

问题描述

我可以在我的 Mac 上本地使用 nodejs 中的 html-pdf 生成 pdf。当我在 AWS 上使用无服务器部署我的 GET api 时,一切都失败了。pdf 没有生成,我收到 400 个错误请求和消息,如html-pdf:收到退出代码 '127'\n/var/task/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs:加载时出错共享库:libfontconfig.so.1:无法打开共享对象文件:没有这样的文件或目录\n

我更改了 html-pdf 包的版本,尝试安装 fontmanager 但没有任何帮助。

//pdf generation class
{
.....
const pdfSettings = {
                "border": '1cm',
                "header": {
                    "height": "15mm"
                }
            };

            const PDFBuffer = new Promise((resolve, reject) => {
                pdf.create(pdfContent, pdfSettings).toBuffer(
                    (err, buffer) => {
                        err ? reject(err) : resolve(buffer);
                    });
            });

            const buffer = await PDFBuffer;
            return actions.downloadPDF(contactId, buffer);
}

//function which returns pdf in binary to api gateway
downloadPDF(pdfName, pdfBuffer) {

    let responseObj = {
      statusCode: 200,
      isBase64Encoded: true,
      headers: {
        'Content-type': 'application/pdf',
        'accept-ranges': 'bytes',
        'Content-Disposition': 'attachment; filename=' + pdfName + '.pdf'
      },
      body: pdfBuffer && JSON.stringify(pdfBuffer.toString('base64'))
    }
    return responseObj;
  }

我应该能够使用 AWS 中的 GET api 生成 pdf。请让我知道任何可以帮助我解决此问题的宝贵建议。提前致谢

标签: node.jsamazon-web-servicespdfserverlesshtml-pdf

解决方案


通过使用 puppeteer 库,我能够找到更好的解决方案。选择不同图书馆的原因

  • html-pdf 已弃用
  • puppeteer 有更好的选择
  • puppeteer 具有异步/等待功能
  • 尽管要使用 serverless 和 serverless-plugin-optimize 在 AWS 中进行这项工作,但我确实面临许多挑战。在实现这种类似场景时注意以下几点

    让 API 网关发送任何二进制文件(pdf / jpeg / jpg)作为响应

  • Binary Media Types 应该*/*在 API Gateway 资源设置选项中设置为,如果通过 serverless.yaml 中的 provider 下的 serverless 添加 apiGateway: binaryMediaTypes: -*/*
  • 如果您有任何机会使用 serverless-plugin-optimize 来减小 lambda 大小,请为此包 chrome-aws-lambda 使用“外部”选项,参考链接https://www.npmjs.com/package/serverless-plugin-optimize

  • 推荐阅读