使用Puppeteer生成PDF后,如何获取其二进制数据并作为响应返回?
解决方案
分两种场景给出实现方式,以 Node.js + Express 为例:
1. 直接生成PDF并返回二进制流(无需保存到本地)
这种方式更高效,无需先写入本地文件,直接获取 Puppeteer 生成的 Buffer 响应给客户端:
const express = require('express'); const puppeteer = require('puppeteer'); const app = express(); app.get('/generate-pdf', async (req, res) => { const browser = await puppeteer.launch(); const page = await browser.newPage(); const targetUrl = req.query.url; // 从请求参数获取客户端提供的链接 try { await page.goto(targetUrl, { waitUntil: 'networkidle2' }); // 生成PDF的Buffer const pdfBuffer = await page.pdf({ format: 'A4', printBackground: true }); // 设置响应头 res.setHeader('Content-Type', 'application/pdf'); // 若要触发下载而非浏览器预览,将inline改为attachment res.setHeader('Content-Disposition', 'inline; filename="generated.pdf"'); // 返回二进制数据 res.send(pdfBuffer); } catch (err) { res.status(500).send('生成PDF失败:' + err.message); } finally { await browser.close(); } }); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
2. 读取本地已生成的PDF文件并返回
如果已将PDF保存到本地目录,用 Node.js 的fs模块读取文件并返回二进制流:
const express = require('express'); const fs = require('fs'); const path = require('path'); const app = express(); app.get('/get-pdf', (req, res) => { const pdfPath = path.join(__dirname, 'generated.pdf'); // 本地PDF文件路径 // 检查文件是否存在 if (!fs.existsSync(pdfPath)) { return res.status(404).send('PDF文件不存在'); } // 设置响应头 res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', 'inline; filename="generated.pdf"'); // 创建文件流并返回 const pdfStream = fs.createReadStream(pdfPath); pdfStream.pipe(res); pdfStream.on('error', (err) => { res.status(500).send('读取PDF文件失败:' + err.message); }); }); app.listen(3000, () => { console.log('服务运行在 http://localhost:3000'); });
关键说明
Content-Type必须设为application/pdf,确保客户端识别文件类型Content-Disposition的inline表示在浏览器内预览,attachment会触发下载弹窗,可按需调整- 第一种方式跳过本地IO操作,性能更优;第二种适合需要保留本地文件备份的场景
内容的提问来源于stack exchange,提问作者craft55
相关产品推荐
相关产品推荐

