尝试从发送到 Lambda 后端(Node.js 运行时)的 JS 对象创建 PDF,但我似乎找不到错误

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

所以我设置了一个 GET 请求,在我的无服务器后端调用 Lambda 函数。 Lambda 函数包含一个处理程序和一些创建文档的业务逻辑(使用 PDFKit)。处理程序应该将响应返回给客户端 (React),但我没有任何运气。我在项目中使用的是 SST 框架,所有内容都是用 Typescript 编写的。 GET 请求是使用 AWS-Amplify API 方法创建的,我相信它使用了 axios。

在返回响应之前,我尝试使用不同的标题和转换 pdf 的方法。据我了解,最好采用 pdf 写入流并将其转换为缓冲区。然后将其连接成一个 Buffer 对象。然后我将其转换为 base 64 字符串。整个函数包装在处理程序中,其中包含所有标头。我从服务器得到的唯一响应是 403。

请求代码:

const createDoc = async(docData: any, id: any) => {
    const response = await API.get("api", `/doc/${id}`, {
        body: docData
      });

    return response;
    }

处理程序代码:

export default function handler(lambda: any) {
    return async function(event: any, context: any) {
      let body, statusCode;
  
      try {
        // Run the Lambda
        body = await lambda(event, context);
        statusCode = 200;
      } catch (e: any) {
        console.error(e);
        body = { error: e.message };
        statusCode = 500;
      }
  
      // Return HTTP response
      return {
        statusCode,
        body: body.pdf,
        responseType: 'arraybuffer',
        responseEncoding: 'binary',
        isBase64Encoded: true,
        headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Credentials": true,
          'Content-Type': 'application/pdf',
          'Content-Disposition': `attachment; filename="doc${body.id}.pdf"`
        },
      };
    };
  }

lambda函数:

export const main = pdfhandler(async(event: any) => {
    const data = JSON.parse(event.body);
    const id = event.pathParameters.id;

//converting the docData to a useable object would be here. We'll just call it "object". 

    const generateHeader = (doc: any) => {
        doc.image('logo.jpeg', 50, 45, { width: 50 })
            .fillColor('#444444')
            .fontSize(20)
            .text('Business', 110, 57)
            .fontSize(10)
            .text('Address', 200, 65, { align: 'right' })
            .text('Address pt 2', 200, 80, { align: 'right' })
            .moveDown();
    }

    const generateFooter = (doc: any) => {
        doc.fontSize(
            10,
        ).text(
            'Thank you.',
            50,
            780,
            { align: 'center', width: 500 },
        );
    }


    const createPurchaseOrderDoc = (object) => {
        let doc = new PDFDocument({ margin: 50 });

        generateHeader(doc); // Invoke `generateHeader` function.
        generateFooter(doc); // Invoke `generateFooter` function.

        //convert to buffer
        const buffers: any = [];
        doc.on('data', buffers.push.bind(buffers));
        doc.on('end', () => {
            const pdf = Buffer.concat(buffers).toString('base64');
            return pdf;
        });

        doc.end();
    }

    const binaryPdf = createDoc(object);
    return { pdf: binaryPdf, id: object.id };
});
node.js reactjs typescript aws-lambda pdf-generation
© www.soinside.com 2019 - 2024. All rights reserved.