1

我从基于 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;
    }
}

4

0 回答 0