Vue2 项目中使用 html2canvas + jsPDF 导出 A4 PDF 实战指南

在 Vue2 项目中实现「页面导出 PDF(A4尺寸)」是一个非常常见的需求,比如:

  • 报表导出

  • 合同生成

  • 发票打印

  • 审批单据

但实际开发中你很容易遇到这些问题:

  • 引入 jspdf 报错(Module parse failed)

  • 页面比例不对

  • 导出 PDF 被拉伸

  • 多页分页错乱

  • 打印尺寸不准确

这篇文章会从 依赖安装 → 导入方式 → A4尺寸 → 实战代码 一步一步带你彻底解决。

一、依赖安装(Vue2重点)

Vue2 老项目(尤其 webpack3)对 jspdf 2.x 支持不好,推荐直接使用稳定版本:

复制代码
npm install html2canvas
npm install jspdf@1.5.3

二、正确引入方式(避免报错)

复制代码
import html2canvas from "html2canvas"
import jsPDF from "jspdf"

⚠️ 注意:

不要写:

复制代码
import { jsPDF } from "jspdf" ❌(Vue2老项目容易报错)

三、为什么会报错?

常见报错:

复制代码
Module parse failed: Unexpected token

原因:

jspdf 2.x 使用 ES Module

你的 Vue2(webpack3)不支持解析

node_modules 默认不编译

解决方案:

  • 使用 jspdf@1.5.3(推荐)

  • 或使用 require

  • 或配置 babel 编译(复杂)


四、A4 页面尺寸(核心知识)

A4 标准尺寸:

  • 宽:210mm

  • 高:297mm

浏览器换算:

复制代码
1mm ≈ 3.78px

所以:

单位
mm 210 297
px 794 1123

五、页面样式(推荐用 mm)

标准 A4 页面写法

复制代码
.a4-page {
  width: 210mm;
  min-height: 297mm;
  background: #fff;
  margin: 0 auto;
  padding: 20mm;
  box-sizing: border-box;
}

优点:

  • 完全匹配打印尺寸

  • PDF 不变形

  • 不需要换算


如果用 px(不推荐)

复制代码
.a4-page {
  width: 794px;
  min-height: 1123px;
}

问题:

  • 不同设备会缩放

  • 打印可能失真

六、导出 PDF 核心代码

复制代码
methods: {
  async exportPDF() {
    const dom = document.getElementById("pdfDom")

    const canvas = await html2canvas(dom, {
      scale: 2,
      useCORS: true
    })

    const imgData = canvas.toDataURL("image/png")

    const pdf = new jsPDF("p", "mm", "a4")

    const pageWidth = 210
    const pageHeight = 297

    const imgWidth = pageWidth
    const imgHeight = (canvas.height * imgWidth) / canvas.width

    let heightLeft = imgHeight
    let position = 0

    pdf.addImage(imgData, "PNG", 0, position, imgWidth, imgHeight)
    heightLeft -= pageHeight

    // 多页处理
    while (heightLeft > 0) {
      position = heightLeft - imgHeight
      pdf.addPage()
      pdf.addImage(imgData, "PNG", 0, position, imgWidth, imgHeight)
      heightLeft -= pageHeight
    }

    pdf.save("导出文件.pdf")
  }
}

七、总结

核心逻辑只有一句话:

始终按照 A4 宽度 210mm 等比例缩放

复制代码
const imgHeight = (canvas.height * 210) / canvas.width

这样可以保证:

  • 不变形

  • 不拉伸

  • 比例正确

相关推荐
2601_949950634 小时前
Word、PDF、Excel题目怎么快速整理?
pdf·word·excel
redfred18 小时前
Stirling-PDF 使用教程:开源 PDF 工具箱 50+ 工具 PDF转Word/合并/压缩/OCR 桌面版 Docker 部署详解
pdf·开源·word
2501_9307077820 小时前
如何使用C#代码向 PDF 文档添加多种类型的注释
pdf
SamChan901 天前
Python+PyMuPDF提取PDF表格并翻译:表格结构检测与双语重建实战
windows·python·ai·pdf·wpf
E_ICEBLUE1 天前
Python 实现 Markdown 转 Word、PDF:从转换到页面设置
python·pdf·word·markdown·格式转换
zhonyu鱼1 天前
Drawpile:多人实时协作绘画,一起在同一块画布上画画
笔记·pdf·开源·开源软件
SamChan901 天前
Python+OpenCV检测PDF翻译后排版偏移:像素级格式一致性验证
python·opencv·ai·pdf·wpf
todoitbo1 天前
PDF 合并、转换也能自己部署:极空间运行 Stirling PDF,文件交给自己的服务器处理
网络安全·pdf·文件·nas·极空间
专家大圣1 天前
给自己搭一个 PDF 工具站:Stirling-PDF 部署、格式转换与远程访问实战
网络·pdf·内网穿透
XLYcmy2 天前
PDF论文处理器 - 完整使用指南
pdf·llm·json·agent·token·csv·dify