前端处理导出PDF。Vue导出pdf

前言:该篇主要是解决一些简单的页面内容导出为PDF

1.安装依赖

使用到两个依赖,项目目录下运行这两个

//页面转换成图片
npm install --save html2canvas 
//图片转换成pdf
npm install jspdf --save 

2.创建通用工具类exportPdf.js文件

可以保存在工具类目录下;

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'export function getPdf(title, id) {// 参数校验if (!title || !id) {console.error('Title and ID are required.')return}const element = document.querySelector(`#${id}`)if (!element) {console.error(`Element with ID "${id}" not found.`)return}html2Canvas(element, {allowTaint: true,useCORS: true,scale: 2}).then(function (canvas) {const contentWidth = canvas.widthconst contentHeight = canvas.height// A4纸尺寸 (单位: pt)const a4Width = 595.28const a4Height = 841.89// 设置外边距 (单位: pt)const marginLeft = 20const marginTop = 20const marginRight = 20const marginBottom = 20// 计算可用内容区域const availableWidth = a4Width - marginLeft - marginRightconst availableHeight = a4Height - marginTop - marginBottom// 计算缩放比例,使内容宽度适配可用区域const scale = availableWidth / contentWidth// 按比例计算图像在页面上的尺寸const imgWidth = contentWidth * scaleconst imgHeight = contentHeight * scale// 计算每页可容纳的高度(考虑上下边距)const pageHeight = availableHeightlet leftHeight = imgHeightlet position = 0const pageData = canvas.toDataURL('image/jpeg', 0.95)const PDF = new JsPDF('', 'pt', 'a4')if (leftHeight < pageHeight) {// 内容高度小于页面可用高度,直接添加图片(带外边距)PDF.addImage(pageData, 'JPEG', marginLeft, marginTop, imgWidth, imgHeight)} else {// 内容高度大于页面可用高度,分页处理while (leftHeight > 0) {// 添加当前页面图像(带外边距)PDF.addImage(pageData, 'JPEG', marginLeft, marginTop + position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= a4Height// 如果还有剩余内容,添加新页面if (leftHeight > 0) {PDF.addPage()}}}PDF.save(title + '.pdf')}).catch(function (error) {console.error('PDF导出失败:', error)})
}

3.Demo例子

<template><div><!-- 容器 --><div id="pdfHtml" ref="printHtml"><h1>这是一个Demo。</h1></div><button @click="exportPDF">PDF导出</button></div>
</template>
<script>
import { getPdf } from '@/utils/exportPdf';
export default {methods: {// 导出pdfexportPDF() {getPdf('关键因素', 'pdfHtml');}}
}
</script>

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

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

相关文章

【GM3568JHF】FPGA+ARM异构开发板烧录指南

1. Windows烧录说明 SDK 提供 Windows 烧写工具(工具版本需要 V3.31或以上)&#xff0c;工具位于工程根目录&#xff1a; tools/ ├── windows/RKDevTool 如下图&#xff0c;编译生成相应的固件后&#xff0c;设备烧写需要进入 MASKROM 或 LOADER 烧写模式&#xff0c;准备…

C++ 多进程编程深度解析【C++进阶每日一学】

文章目录一、引言二、核心概念&#xff1a;进程 (Process)功能与作用三、C 多进程的实现方式四、核心函数详解1. fork() - 创建子进程函数原型功能说明返回值完整使用格式2. wait() 和 waitpid() - 等待子进程结束函数原型参数与返回值详解3. exec 系列函数 - 执行新程序函数族…

一周学会Matplotlib3 Python 数据可视化-绘制面积图(Area)

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

北京JAVA基础面试30天打卡11

1.索引创建注意事项 适合的场景 1.频繁使用where语句查询的字段 2.关联字段需要建立索 3.如果不创建索引&#xff0c;那么在连接的过程中&#xff0c;每个值都会进行一次全表扫描 4.分组和排序字段可以建立索引因为索引天生就是有序的&#xff0c;在分组和排序时优势不言而喻 5…

vscode无法检测到typescript环境解决办法

有一个vitereacttypescript项目&#xff0c;在工作电脑上一切正常。但是&#xff0c;在我家里的电脑运行&#xff0c;始终无法检测到typescript环境。即使出现错误的ts语法&#xff0c;也不会有报错提示&#xff0c;效果如下&#xff1a;我故意将一个string类型&#xff0c;传入…

【MCP开发】Nodejs+Typescript+pnpm+Studio搭建Mcp服务

MCP服务支持两种协议&#xff0c;Studio和SSE/HTTP&#xff0c;目前官方提供的SDK有各种语言。 开发方式有以下几种&#xff1a; 编程语言MCP命令协议发布方式PythonuvxSTUDIOpypiPython远程调用SSE服务器部署NodejspnpmSTUDIOpnpmNodejs远程调用SSE服务器部署… 一、初始化项…

vscode使用keil5出现变量跳转不了和搜索全局不了

vscode使用keil5出现变量跳转不了&#xff0c;或者未包含文件&#xff0c;或者未全局检索&#xff1b; 参考如下文章后还会出现&#xff1b; 为什么vscode搜索栏只搜索已经打开的文件_vscode全局搜索只能搜当前文件-CSDN博客 在机缘巧合之下发现如下解决方式&#xff1a; 下载…

命名空间——网络(net)

命名空间——网络&#xff08;net&#xff09; 一、网络命名空间&#xff1a;每个都是独立的“网络房间” 想象你的电脑是一栋大楼&#xff0c;每个网络命名空间就是大楼里的一个“独立房间”&#xff1a; 每个房间里有自己的“网线接口”&#xff08;网卡&#xff09;、“门牌…

一文读懂16英寸笔记本的实际尺寸与最佳应用场景

当您搜索"16寸笔记本电脑长宽"时&#xff0c;内心真正在问的是什么&#xff1f;是背包能否容纳&#xff1f;桌面空间是否足够&#xff1f;还是期待屏幕尺寸与便携性的完美平衡&#xff1f;这个看似简单的尺寸数字背后&#xff0c;凝结着计算机制造商对用户体验的深刻…

Android Studio中创建Git分支

做一些Android项目时&#xff0c;有时候想要做一些实验性的修改&#xff0c;这个实验可能需要很多步骤&#xff0c;所以不是一时半会能完成的&#xff0c;这就需要在实验的过程中不断修改代码&#xff0c;且要提交代码&#xff0c;方便回滚或比较差异&#xff0c;但是既然是实验…

内存可见性和伪共享问题

文章目录什么是内存可见性问题为什么会出现可见性问题解决可见性问题的方法1. 使用volatile关键字2. 使用synchronized3. 使用java.util.concurrent包下的原子类什么是伪共享问题CPU缓存行伪共享的危害解决伪共享的方法1. 缓存行填充2. 使用Contended注解&#xff08;JDK 8&…

Spring MVC 九大组件源码深度剖析(三):ThemeResolver - 动态换肤的奥秘

文章目录一、主题机制的核心价值二、核心接口设计三、四大实现类源码解析1. FixedThemeResolver&#xff08;固定主题策略&#xff09;2. CookieThemeResolver&#xff08;Cookie存储策略&#xff09;3. SessionThemeResolver&#xff08;Session存储策略&#xff09;4. Abstra…

一、Docker本地安装

((这里引用知乎上大佬的说法&#xff1a;https://www.zhihu.com/question/48174633 服务器虚拟化解决的核心问题是资源调配&#xff0c;而容器解决的核心问题是应用开发、测试和部署。 一、参考帖子 Ubuntu 的 |Docker 文档 【docker】ubuntu完全卸载docker及再次安装_ubuntu…

LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组

题目给你一个整数数组 nums 和一个 正整数 k 。请你统计有多少满足 「 nums 中的 最大 元素」至少出现 k 次的子数组&#xff0c;并返回满足这一条件的子数组的数目。子数组是数组中的一个连续元素序列。示例 1&#xff1a;输入&#xff1a;nums [1,3,2,3,3], k 2 输出&#…

10分钟掌握swift

整理一个 10分钟掌握 Swift 的精华指南&#xff0c;用一个 Demo 串联 Swift 的核心语法、数据结构、函数、类/结构体和闭包&#xff0c;让你快速入门。1️⃣ 基础语法与变量import Foundation // 引入基础库// 变量和常量 var name: String "Alice" // 可变 let…

【完整源码+数据集+部署教程】食品分类与实例分割系统源码和数据集:改进yolo11-AggregatedAttention

背景意义 研究背景与意义 随着全球食品产业的快速发展&#xff0c;食品安全和质量控制日益成为社会关注的焦点。食品分类与实例分割技术的应用&#xff0c;能够有效提升食品识别的准确性和效率&#xff0c;为食品监管、营养分析以及智能餐饮等领域提供重要支持。传统的食品识别…

C# 中的N+1问题

目录 含义 影响 避免方法 1. 立即加载&#xff08;Eager Loading&#xff09; 2. 显式加载&#xff08;Explicit Loading&#xff09; 3. 投影&#xff08;Projection&#xff09; 4. 批处理查询 5. 禁用延迟加载 含义 N1 问题 是 ORM&#xff08;对象关系映射&#x…

国内多光谱相机做得好的厂家有哪些?-多光谱相机品牌厂家

多光谱相机是一种能够同时捕捉多个特定波段的光谱信息&#xff0c;这些波段覆盖可见光、近红外以及短波红外等区域。广泛应用于遥感、农业、环境监测、工业检测、安防等领域。近年来&#xff0c;我国在多光谱技术领域取得了显著进步&#xff0c;涌现出一批技术实力强、产品性能…

如何用外部电脑访问本地网页?

之前本来说用内网穿透工具来查看完成这个工具&#xff0c;结果感觉各种不符合心意&#xff0c;突然发现有更简单的方法。如果想让两台电脑在 同一局域网 内都能访问运行在 http://localhost:5174/ 上的项目&#xff0c;而不需要使用内网穿透工具&#xff0c;可以通过以下方法实…

PromptPilot — AI 自动化任务的下一个环节

作者:陈大鱼头 github:https://github.com/KRISACHAN 邮箱:chenjinwen77@gmail.com PromptPilot 体验地址:https://promptpilot.volcengine.com/ 前言 如果大家有关注 AI 相关新闻的话,一定会知道在 2025 年 6 月 11 日火山引擎 FORCE 原动力大会上,豆包大模型 1.6 系列…