You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:03:03