在 Vue 项目中,纯前端实现导出 PDF 文件是完全可行的。通常可以借助一些 JavaScript 库来将 HTML 内容或 DOM 元素转换为 PDF 并下载,无需后端参与。

下面介绍几种常用的方案和实现方法:


推荐方案:使用 html2canvas + jsPDF

安装依赖(npm)

npm install html2canvas jspdf --save

示例代码(Vue 3 + Composition API)

<template><div><div id="pdf-content"><h1>这是要导出的内容</h1><p>你可以放任意 HTML 内容,比如表格、图片等。</p></div><button @click="exportToPDF">导出 PDF</button></div>
</template><script setup>
import { ref } from 'vue';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';const exportToPDF = () => {const input = document.getElementById('pdf-content');html2canvas(input).then(canvas => {const imgData = canvas.toDataURL('image/png');const pdf = new jsPDF('p', 'mm', 'a4'); // A4纸张竖向const pdfWidth = 210; // A4宽度 mmconst pdfHeight = (canvas.height * pdfWidth) / canvas.width;pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);pdf.save('导出内容.pdf');});
};
</script>

可选增强功能

支持高清导出(缩放处理)

有时截图模糊,可适当放大 canvas 缩放比例:

html2canvas(input, { scale: 2 }).then(canvas => { ... })

多页支持(长页面自动分页)

如果你的 HTML 内容超过一页高度,建议使用插件如 html2pdf.js,它对多页支持更好:

安装:
npm install html2pdf.js --save
使用示例:
import html2pdf from 'html2pdf.js';const exportToPDF = () => {const element = document.getElementById('pdf-content');html2pdf().from(element).save('导出内容.pdf');
};

注意事项

问题建议
图片跨域问题确保所有图片资源都允许跨域加载,否则可能无法渲染
中文乱码使用 jsPDF 时需手动添加中文字体
表格样式丢失尽量使用简单布局,避免复杂 CSS 样式
高度自适应可结合 autoTable 插件绘制表格

可选库对比

库名特点是否推荐
html2canvas + jsPDF灵活,兼容性好✅ 强烈推荐
html2pdf.js一行代码搞定,支持分页✅ 推荐
dom-to-pdf轻量级,适合简单导出✅ 推荐
pdfmake更适合生成结构化 PDF,不直接支持 HTML 渲染❌ 不推荐用于 HTML 导出

📎 扩展:导出带样式的 PDF

如果需要保留完整的 CSS 样式,建议:

  • 使用 <style> 标签内联样式
  • 或者用 iframe 渲染一个完整的 HTML 页面并导出

总结

在 Vue 项目中,前端实现导出 PDF 的最佳实践是:

使用 html2canvas + jsPDFhtml2pdf.js,将 DOM 节点转为图片再生成 PDF

这种方式不需要任何后端接口,适合导出报表、简历、合同等内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912210.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912210.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++虚拟内存

常见的内存困惑 当你编写C程序时&#xff0c;是否遇到过&#xff1a; vector申请200MB内存&#xff0c;但系统显示只占用20MB&#xff1f;程序在低配机器上崩溃&#xff0c;报出std::bad_alloc但内存显示充裕&#xff1f;遍历数组时特定位置耗时突然增加&#xff1f;相同代码…

领域驱动设计(DDD)【22】之限定建模技术

文章目录 一 限定初识二 限定识别三 限定实现 一 限定初识 一个 员工 可以拥有多份 工作经验&#xff0c;而各个 工作经验 的 时间段 不能相互重叠。可以得出一个推论&#xff1a;对于一个 员工 而言&#xff0c;每个 时间段 只能有一条 工作经验。 UML中第二种表述方式&…

《P6492 [COCI 2010/2011 #6] STEP》

题目描述 给定一个长度为 n 的字符序列 a&#xff0c;初始时序列中全部都是字符 L。 有 q 次修改&#xff0c;每次给定一个 x&#xff0c;若 ax​ 为 L&#xff0c;则将 ax​ 修改成 R&#xff0c;否则将 ax​ 修改成 L。 对于一个只含字符 L&#xff0c;R 的字符串 s&#…

macOS,切换 space 失效,向右切换space(move right a space) 失效

背景 准确来讲&#xff0c;遇到的问题是向右切换space&#xff08;move right a space) 失效&#xff0c;并向左是成功的。 在键盘-快捷键-调度中心中&#xff0c;所有的快捷键均可用&#xff0c;但是“向右移动一个空间”总是失效。 已经检查过不是快捷键冲突的问题&#x…

网飞猫官网入口 - 免费高清影视平台,Netflix一站观看

网飞猫是一个专注于提供丰富影视资源的在线平台&#xff0c;涵盖国内外热门电影、电视剧、动漫、综艺等多种类型。它不仅整合了Netflix的独家内容&#xff0c;还提供了大量高清、蓝光画质的影视作品&#xff0c;支持多语言字幕&#xff0c;满足不同用户的观影需求。网飞猫的界面…

Hyper-v-中的FnOs--飞牛Nas虚拟磁盘扩容(不清除数据)

在Hyper-v下的飞牛Nas要怎么在不删除原有虚拟磁盘数据的情况下扩容呢 OK下面开始教学&#xff08;适用于Basic模式的虚拟磁盘扩容&#xff0c;Linear没试过&#xff09; 先关闭飞牛Nas系统 找到飞牛Nas虚拟机&#xff0c;在设置下SCSI控制器找到要扩容的虚拟磁盘&#xff0c; 点…

掌握 MySQL 的基石:全面解读数据类型及其影响

前言 上篇文章小编讲述了关于MySQL表的DDL操作&#xff0c;在那里我多次使用了MySQL的数据类型&#xff0c;但是我并没有去讲述MySQL的数据类型&#xff0c;想必各位读者已经很好奇MySQL的数据类型都有什么了&#xff0c;今天这篇文章我将会详细的去讲述MySQL的数据类型&#x…

buildadmin 如何制作自己的插件

官方文档指引 提示&#xff1a;若不计划发布到应用市场&#xff0c;可省略图片等非必要功能 参考文档&#xff1a;https://doc.buildadmin.com/senior/module/basicInfo.html 目录 官方文档指引开发说明模块开发流程模块包结构示例安装开发工具 总结 开发说明 目标&#xff…

【数据标注师】关键点标注

目录 一、 **关键点标注的四大核心原则**二、 **五阶能力培养体系**▶ **阶段1&#xff1a;基础认知筑基&#xff08;1-2周&#xff09;**▶ **阶段2&#xff1a;复杂场景处理技能▶ **阶段3&#xff1a;三维空间标注&#xff08;进阶&#xff09;**▶ **阶段4&#xff1a;效率…

创建网站的基本步骤?如何建设自己的网站?

创建网站是一个系统化的过程&#xff0c;涵盖规划、设计、开发、测试和发布等多个阶段。以下是详细步骤及关键工具推荐&#xff1a; 一、规划阶段&#xff1a;明确目标与内容 定义目标 1、确定网站目的&#xff08;展示信息、销售、博客、服务等&#xff09;。 2、分析目标…

FreeSWITCH配置文件解析(2) dialplan 拨号计划中xml 的action解析

在 FreeSWITCH 的拨号计划&#xff08;Dialplan&#xff09;中&#xff0c;使用 XML 配置。其中&#xff0c;<action> 标签用于指定要执行的操作。这些操作通常是应用程序&#xff08;applications&#xff09;或设置变量等。下面列出常见的 <action> 类型及其含义…

MCPA2APPT:基于 A2A+MCP+ADK 的多智能体流式并发高质量 PPT 智能生成系统

&#x1f680; MCPA2APPT / MultiAgentPPT 集成 A2A MCP ADK 架构的智能化演示文稿生成系统&#xff0c;支持多智能体协作与流式并发&#xff0c;实时生成高质量 PPT 内容。 &#x1f9e0; 项目简介 MultiAgentPPT&#xff08;又名 MCPA2APPT&#xff09;采用 A2A&#xff…

Maven 多模块项目调试与问题排查总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

debian国内安装docker

先升级apt和安装依赖包 apt update apt upgrade apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates添加存储库的GPG密钥&#xff08;阿里云&#xff09; curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg…

vue网页中的一个天气组件使用高德api

今天写了一个天气组件效果如下&#xff1a; 实现代码如下&#xff1a; <template><div><span click"getLocation" style"cursor: pointer"><span style"color:white;">{{ weatherInfo.area }}</span></span&g…

5 手写卷积函数

5 手写卷积函数 背景介绍滑动窗口的方式代码问题 矩阵乘法的方式原理代码结果 效果对比对比代码日志结果 一些思考 背景 从现在开始各种手写篇章&#xff0c;先从最经典的卷积开始 介绍 对于卷积层的具体操作&#xff0c;我这里就不在具体说卷积具体是什么东西了。 对于手写…

vue3+element-plus,实现两个表格同步滚动

需求&#xff1a;现在需要两个表格&#xff0c;为了方便对比左右的数据&#xff0c;需要其中一边的表格滚动时&#xff0c;另一边的表格也跟着一起滚动&#xff0c;并且保持滚动位置的一致性。具体如下图所示。 实现步骤&#xff1a; 确保两个表格的宽度一致&#xff1a;如果两…

Mysql架构

思考&#xff1a;Mysql需要重点学习什么&#xff1a; 索引&#xff1a;索引存储结构、索引优化......事务&#xff1a;锁机制与隔离级别、日志、集群架构 本文是对Mysql架构进行初步学习 1、Mysql链接 Mysql监听器是长连接 BIO(阻塞同步IO调用)&#xff0c; 不是NIO. 为什么…

使用deepseek制作“喝什么奶茶”随机抽签小网页

教程很简单&#xff0c;如下操作 1. 新建文本文档&#xff0c;命名为奶茶.txt 2. 打开deepseek&#xff0c;发送下面这段提示词&#xff1a;用html5帮我生成一个喝什么奶茶的网页&#xff0c;点击按钮随机生成奶茶品牌等&#xff0c;包括喜茶等众多常见的奶茶品牌如果不满意还…

WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践

WOE值&#xff08;Weight of Evidence&#xff0c;证据权重&#xff09; 是信用评分和风险建模中用于量化特征分箱对目标变量的预测能力的核心指标。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关…