我从基于 NestJS 的 AWS Lambda 函数生成的 PDF 文件的所有页面都是空白的。当我生成 PDF 文件并将其附加到电子邮件时,我会收到包含所有内容的正确文件。
但是当我在浏览器中从 AWS Lambda GET API 请求下载相同的文件时,会得到一个带有空白页的文件。
下面的代码工作得很好。
@Get('/send-pdf-email')
async sendPDF() {
const buffer = await this.reportsService.getPDFBuffer();
this.emailService.sendApplicationPDF({ filename: "report.pdf", data: buffer });
}
但是当我生成相同的 PDF 文件并作为响应返回时,下载的文件所有页面都是空白的。
@Get('/download-pdf')
@Header('Content-Type', 'application/pdf')
@Header('Content-Disposition', 'attachment; filename=report.pdf')
async getApplicationCompilancePDF(
@Param('id', ParseIntPipe) id: number,
@Res() res: Response,
) {
const buffer = await this.reportsService.getPDFBuffer();
const stream = this.reportsService.getReadableStream(buffer);
stream.pipe(res);
}
这是我的代码ReportsService
import { Injectable } from '@nestjs/common';
import htmlPdf from 'html-pdf';
import path from 'path';
import { Readable } from 'stream';
@Injectable()
export class ReportsService {
async getPDFBuffer(): Promise<Buffer> {
const html = "<p>Hello World!</p>";
return new Promise((resolve, reject) => {
htmlPdf.create(html, {
phantomPath: path.resolve(
process.cwd(),
"node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs"
),
}).toBuffer((err, buffer) => {
if (err) {
reject(err);
} else {
resolve(buffer);
}
});
});
}
getReadableStream(buffer: Buffer): Readable {
const stream = new Readable();
stream.push(buffer);
stream.push(null);
return stream;
}
}