NodeJS 无法打开pdf aws lambda

8xiog9wr  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(95)

我的lambda函数遇到了问题。当我在Postman中运行它时,PDF不会显示。我还尝试了“发送和下载”选项,但它说文件没有有效的格式。有什么建议吗?
我对这个lambda函数有一个问题:

const { PDFDocument } = require('pdf-lib');

exports.getAll = async (req, res) => {
    try {
        
        const htmlContent = '<html><body><h1>Hello World</h1></body></html>';

        const pdfDoc = await PDFDocument.create();

        const page = pdfDoc.addPage();

        const { width, height } = page.getSize();
        await page.drawText(htmlContent, { x: 50, y: height - 100 });

        const pdfBytes = await pdfDoc.save();

        res.setHeader('Content-Type', 'application/pdf');
        res.setHeader('Content-Disposition', 'inline; filename=hello_world.pdf');
        res.status(200).send(pdfBytes);
        
    } catch (error) {
        console.error('Error:', error);
        res.status(500).json({ error: 'Internal Server Error' });
    }
};

字符串
当在Postman中运行它时,PDF不会显示。我也尝试了“发送和下载”选项,但它显示文件没有有效的格式。有什么建议吗?
我的package.json:

{
  "name": "formularios-pdf",
  "version": "1.0.0",
  "description": "description",
  "main": "index.js",
  "author": "author",
  "license": "ISC",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "aws-serverless-express": "^3.4.0",
    "axios": "^0.24.0",
    "chrome-aws-lambda": "^10.1.0",
    "express": "^4.17.1",
    "moment": "^2.29.4",
    "mysql2": "^2.3.3",
    "pdf-lib": "^1.17.1"
  }
}


Postman :


的数据

nafvub8i

nafvub8i1#

有几件事你做得不对:
1.函数params有(event, context, callback)而不是(req, res)

  1. API响应应该有base64数据。为此,您可以使用saveAsBase64
    1.如果你有API网关连接到它。那么你将不得不启用二进制媒体类型。
    1.还要注意drawText方法接受普通字符串而不是HTML字符串。虽然它可以工作,但它会呈现整个HTML字符串。
    演示示例:
const { PDFDocument } = require("pdf-lib");

export async function hello(event, context) {
  try {
    const pdfDoc = await PDFDocument.create();
    const text = "Hello World!";
    const page = pdfDoc.addPage([350, 400]);
    page.moveTo(110, 200);
    page.drawText(text);
    const pdfBase64 = await pdfDoc.saveAsBase64();
    const filename = "example.pdf";

    return {
      statusCode: 200,
      headers: {
        "Content-Type": "application/pdf",
        "Content-Disposition": `inline; filename=${filename}`,
      },
      body: pdfBase64,
      isBase64Encoded: true,
    };
  } catch (error) {
    console.error("Error generating PDF:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: "Internal Server Error" }),
    };
  }
}

字符串

启用二进制媒体类型

1.后藤您的API Jmeter 板
1.从左侧面板,后藤转到API设置
1.在“Binary media types(二进制媒体类型)”下,选择Manage Media Types
1.添加“/”以启用所有二进制支持。您可以根据自己的需求限制它。
1.从左侧面板转到后藤资源,从右上方部署API
注意:这可能需要一些时间来反映步骤5的变化。对我来说花了5分钟。
如果你使用的是函数URL,那么只需要函数部署就足够了。

相关问题