找不到错误"/>
尝试从发送到 Lambda 后端(Node.js 运行时)的 JS 对象创建 PDF,但我似乎找不到错误
所以我设置了一个 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 };
});
回答如下:
更多推荐
尝试从发送到 Lambda 后端(Node.js 运行时)的 JS 对象创建 PDF,但我似乎找不到错误
发布评论