当前位置: 首页 > news >正文

基于 Node.js 的 HTML 转 PDF 服务

这是一个基于 Node.js 开发的 Web 服务,主要功能是将 HTML 内容转换为 PDF 文件。项目使用了 Express 作为 Web 框架,Puppeteer 作为 PDF 生成引擎,提供了简单易用的 API 接口。前端开发人员提供了一个简单而强大的 HTML 转 PDF 解决方案,特别适合需要生成报表、订单等业务场景的应用。
后端框架 :Express.js , PDF 生成 :Puppeteer , 开发工具 :Nodemon(热更新),跨域支持 :CORS

创建 node js 项目 安装依赖
项目git地址

cd my-node-project  // 你的文件夹
npm init  
npm install  cors express puppeteer  nodemon
npm run dev

项目结构
├── modules/
│ ├── pdfGenerator.js # PDF 生成核心模块
├── public/ # 静态资源目录
├── pdfs/ # PDF 输出目录
├── app.js # 应用主入口
├── index.html # 首页
└── package.json # 项目配置文件

API 接口

POST /generatepdf/htmlToPdf

项目中使用 接口

try {const response: any = await axios.post('http://localhost:3000/generatepdf/htmlToPdf', {fileName: 'pdf文件名',html: rssRef.value.innerHTML,styles: '.pdfDom{line-height:30px;color:#000;width:800px;margin:0auto;padding:20px;box-sizing:border-box;font-size:14px;}...........'},)console.log(response.data, 'PDF生成成功')//将服务器返回的 base64 数据转换为字节数组const byteArray = new Uint8Array(response.data.data.split(',').map(Number))//创建 PDF 类型的 Blob 对象const blob = new Blob([byteArray], { type: 'application/pdf' });console.log(blob)// 转为文件对象const file = new File([blob], 'filename.pdf', {type: 'application/pdf',lastModified: Date.now(), });console.log(file)} catch (error) {console.error('生成PDF失败:', error)message.error('生成PDF失败,请重试')}

请求参数:

  • html : HTML 内容
  • styles : 自定义样式
  • fileName : 输出文件名

响应格式:

{"success": true,"message": "PDF生成成功","data": "base64编码的PDF内容"
}

核心功能
主要通过 pdfGenerator.js 模块实现,核心功能包括:

  • HTML 内容转换为 PDF
  • 自定义 PDF 页面大小(A4)
  • 自定义页面边距
  • 支持背景打印
  • 支持自定义缩放
    通过接口调用 传参 实现生成pdf
const puppeteer = require("puppeteer");
const path = require("path");// HTML内容生成PDF
async function generatePdfFromHtml(html, outputDir, fileName) {let browser;try {// 启动浏览器browser = await puppeteer.launch({headless: "new",args: ["--no-sandbox", "--disable-setuid-sandbox"],});const page = await browser.newPage();// 设置视口await page.setViewport({width: 1920,height: 1080,deviceScaleFactor: 1,});// 加载HTML内容await page.setContent(html, {waitUntil: "networkidle0",});// 生成PDFconst pdfPath = path.join(outputDir, `${fileName}.pdf`);let pdfBuffer = await page.pdf({path: pdfPath,format: "A4",margin: { top: "20mm", right: "20mm", bottom: "20mm", left: "20mm" },printBackground: true,preferCSSPageSize: true,scale: 1, // 设置缩放比例为1});return pdfBuffer;} catch (error) {console.error("生成PDF失败:", error);throw error;} finally {if (browser) {await browser.close();}}
}module.exports = {generatePdfFromHtml,
};
http://www.xdnf.cn/news/560899.html

相关文章:

  • 在C#中对List<T>实现多属性排序
  • PostgreSQL日常维护
  • FastAPI 支持文件下载和上传
  • Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)
  • PDF 文档结构化工具对比:Marker 与 MinerU
  • 整除的进一步性质与最小公倍数
  • 【深度剖析】三一重工的数字化转型(上1)
  • 11-码蹄集600题基础python篇
  • 【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈
  • 智能指针RAII
  • springboot3+vue3融合项目实战-大事件文章管理系统-文章分类也表查询(条件分页)
  • 年会招标抽奖活动软件———仙盟创梦IDE
  • 【后端】【UV】【Django】 `uv` 管理的项目中搭建一个 Django 项目
  • Mysql索引实战1
  • 【人工智能发展史】从黎明到曙光01
  • 回溯法求解N皇后问题
  • 力扣-有效三角形的个数
  • 超低延迟音视频直播技术的未来发展与创新
  • (2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板
  • 提问的艺术
  • 华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent
  • Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]
  • labview硬件部分——压力测量
  • labview——控制继电器模块
  • Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
  • 【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)
  • 两个重要的alpha表达式
  • 三维表面轮廓仪的维护保养是确保其长期稳定运行的关键
  • 高速串行差分信号仿真分析及技术发展挑战