前端HTML转PDF的两种主流方案深度解析

前端 HTML 转 PDF 的两种主流方案深度解析(2026 年版)

目前前端生成 PDF 最主流的两种方案是:

  1. 客户端方案html2canvas + jsPDF(或其封装库 html2pdf.js
  2. 服务端方案Puppeteer / Playwright(Node.js 无头浏览器)

这两种方案几乎占据了 90% 以上的实际项目。下面从原理、优缺点、适用场景、核心代码、坑点与优化等维度进行深度对比。

一、核心对比表(快速决策)

维度客户端方案(html2canvas + jsPDF)服务端方案(Puppeteer / Playwright)胜出方
实现难度★☆☆☆☆(最简单)★★★☆☆(需后端)客户端
生成质量中等(样式丢失常见)极高(接近浏览器打印效果)服务端
中文/字体支持较差(需特殊处理)优秀(可加载本地字体)服务端
大文件 / 长页面容易卡顿、崩溃稳定服务端
分页控制弱(需 hack)强(支持 @page、页眉页脚)服务端
部署复杂度零(纯前端)中等(需 Node 服务)客户端
性能压力前端浏览器承担后端服务器承担看场景
安全性高(客户端)中(后端需注意 HTML 注入)客户端
2026 年推荐场景简单报表、导出预览、H5 小程序正式合同、发票、复杂报告、打印级 PDF

二、方案一:客户端 —— html2canvas + jsPDF(最常用)

原理
  1. html2canvas 把 DOM 元素渲染成 Canvas(像素级截图)
  2. jsPDF 把 Canvas 转为 PDF 文件并下载
推荐库
  • 直接用 html2pdf.js(封装版,最推荐)
  • 或手动组合 html2canvas + jsPDF
核心代码(Vue 3 + html2pdf.js)
<template> <div ref="content"> <!-- 你的 HTML 内容 --> <h1>发票标题</h1> <table>...</table> </div> <button @click="exportPDF">导出 PDF</button> </template> <script setup> import html2pdf from 'html2pdf.js' const content = ref(null) const exportPDF = () => { const opt = { margin: [10, 10, 10, 10], filename: 'report.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, // 清晰度(2倍最合适) useCORS: true, // 跨域图片 letterRendering: true }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } } html2pdf().set(opt).from(content.value).save() } </script> 
优点
  • 零后端,部署最简单
  • 适合 H5、小程序、内部工具
致命缺点(2026 年仍未彻底解决)
  • 复杂 CSS3(flex、grid、阴影、渐变)容易变形
  • 中文字体模糊或缺失
  • 超长页面容易内存溢出
  • 分页控制极差(经常出现表格断行、页眉页脚难处理)

优化技巧

  • 使用 scale: 2 提升清晰度
  • 提前把需要导出的内容克隆到一个隐藏的 div 中,专门优化样式
  • 对于表格推荐使用 jspdf-autotable 插件单独处理

三、方案二:服务端 —— Puppeteer / Playwright(质量之王)

原理

启动无头浏览器(Headless Chrome / Firefox / WebKit),加载完整 HTML 页面后,直接调用 page.pdf() 生成 PDF。

2026 年推荐:Playwright(已全面超越 Puppeteer)

Playwright 优势:多浏览器支持、自动等待、API 更现代、稳定性更高。

核心代码(Node.js + Express)
// pdfService.jsconst{ chromium }=require('playwright')asyncfunctionhtmlToPdf(htmlContent){const browser =await chromium.launch({headless:true})const page =await browser.newPage()// 关键:设置视口和打印样式await page.setContent(htmlContent,{waitUntil:'networkidle'})const pdfBuffer =await page.pdf({format:'A4',printBackground:true,margin:{top:'15mm',bottom:'15mm',left:'10mm',right:'10mm'},displayHeaderFooter:true,headerTemplate:'<div>页眉</div>',footerTemplate:'<div>第 <span></span> 页</div>'})await browser.close()return pdfBuffer }
前端调用示例
const res =awaitfetch('/api/export-pdf',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({html: document.getElementById('content').outerHTML })})const blob =await res.blob()const url =URL.createObjectURL(blob)const a = document.createElement('a') a.href = url a.download ='report.pdf' a.click()
优点
  • 生成效果几乎和浏览器打印一致
  • 原生支持 @pagepage-break-before/after 分页控制
  • 中文字体完美(可加载本地字体或系统字体)
  • 支持页眉页脚、加密、水印、目录等高级功能
缺点
  • 需要部署 Node 服务
  • 并发高时消耗服务器资源(可使用 puppeteer-cluster / playwright-cluster 做池化)

四、最终推荐(2026 年真实选择)

  • 推荐客户端方案:内部工具、简单报表、H5 活动页、快速 MVP
  • 强烈推荐服务端方案:合同、发票、正式报告、需要精确分页和美观样式的场景
  • 混合方案(最优解):前端负责编辑预览 + 服务端负责最终生成 PDF(目前大厂主流做法)

你现在要做的是哪类 PDF?

  • 简单数据报表?
  • 合同/发票类正式文件?
  • 还是需要页眉页脚 + 精确分页的复杂报告?

告诉我具体需求,我可以给你对应方案的最优完整代码模板。

Read more

AI之Tool:Google Stitch的简介、安装和使用方法、案例应用之详细攻略

AI之Tool:Google Stitch的简介、安装和使用方法、案例应用之详细攻略

AI之Tool:Google Stitch的简介、安装和使用方法、案例应用之详细攻略 目录 Google Stitch的简介 1、特点 Google Stitch的安装和使用方法 1、安装 2、使用方法 Google Stitch的案例应用 在电商和内容型页面上 在迭代层面,Stitch 很适合做“局部修正”案例 从草图到原型 Google Stitch的简介 2026年3月18日,Stitch 是 Google Labs 推出的实验性 AI 设计工具,官方把它描述为一个 AI-native software design canvas:你可以用自然语言、图片、文本甚至代码来生成高保真 UI,并在同一个画布里继续迭代、协作和完善设计。它的目标是把“想法”更快地变成“可预览的界面”

whisper.cpp CUDA加速终极指南:解锁NVIDIA GPU完整性能

whisper.cpp CUDA加速终极指南:解锁NVIDIA GPU完整性能 【免费下载链接】whisper.cppOpenAI 的 Whisper 模型在 C/C++ 中的移植版本。 项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp 还在为语音识别速度慢而烦恼吗?🤔 whisper.cpp结合CUDA技术,可以让你的语音识别速度提升3-10倍!无论你是AI开发者还是语音应用爱好者,本指南都将带你从零开始,轻松实现GPU加速,告别漫长的等待时间。 快速上手:一键开启CUDA加速 环境准备与安装 首先确认你的系统满足以下条件: * NVIDIA GPU(计算能力≥3.5) * 已安装CUDA Toolkit * 支持C++17的编译器 安装验证步骤: nvidia-smi nvcc --version 如果看到GPU信息和CUDA版本,恭喜你!

华为昇腾910B(Ascend 910B)+ LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的全流程操作指南

华为昇腾910B(Ascend 910B)+ LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的全流程操作指南

华为昇腾910B(Ascend 910B)上 LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的保姆级全流程操作指南 华为昇腾910B(Ascend 910B)上使用 LLaMA-Factory 对 Qwen3.5-32B 模型进行 LoRA 微调 的保姆级全流程操作指南,包含环境配置、依赖安装、数据准备、训练启动、验证与推理等完整步骤。本教程基于 Ubuntu 20.04 + CANN 8.0 + MindSpore/PyTorch NPU + LLaMA-Factory v0.9.3+ 环境,适用于 8卡昇腾910B服务器。 ✅ 前提条件 项目 要求 硬件

Stable-Diffusion-3.5城市规划辅助:景观效果图生成实践

Stable-Diffusion-3.5城市规划辅助:景观效果图生成实践 1. 引言:当AI画笔遇见城市规划 想象一下,你是一位城市规划师或景观设计师,面对一片待开发的空地或一个需要更新的老旧街区。客户或领导问:“这里未来会是什么样子?” 传统的做法是,你需要花费数天甚至数周时间,进行概念构思、草图绘制、建模渲染,才能产出一张初步的效果图。这个过程不仅耗时耗力,而且一旦方案需要调整,整个流程又得重来一遍。 现在,情况正在改变。借助 Stable Diffusion 3.5 (SD 3.5) 这样的新一代文本到图像生成模型,我们可以将脑海中的构想,用几句话描述出来,几分钟内就能看到高质量的视觉预览。这不仅仅是“画图”,而是一种全新的设计辅助和沟通工具。 本文将带你深入实践,看看如何利用基于 SD 3.5 优化的 Stable-Diffusion-3.5-FP8 镜像,快速、高效地生成城市规划与景观设计的效果图。我们将从零开始,一步步操作,