1.vue 转 PDF

在 Vue 项目中将 HTML 页面转换为 PDF 文件是一个常见需求,特别是在需要生成报告或打印页面时。本文将介绍如何使用 html2canvas 和 jspdf 库实现这一功能。

2.安装依赖

首先,我们需要安装两个库:html2canvas 和 jspdf 。可以使用以下命令安装:

npm install html2canvas
npm install jspdf --save

3.创建转换函数

 utils 文件夹下创建一个 htmlToPdf.js 文件,并编写以下代码:

import html2Canvas from 'html2canvas';
import jsPDF from 'jspdf';const htmlToPdf = {
getPdf(title) {
html2Canvas(document.querySelector('#pdfDom'), {//这里pdfDom就是你打印/下载页面区域的div的id
allowTaint: false,
taintTest: false,
logging: false,
useCORS: true,
dpi: window.devicePixelRatio * 4, // 提高分辨率
scale: 4 // 按比例增加分辨率
}).then(canvas => {
const pdf = new jsPDF('p', 'mm', 'a4'); // A4 纸,纵向
const ctx = canvas.getContext('2d');
const a4w = 190, a4h = 277; // A4 大小,四边各保留 10mm 边距
const imgHeight = Math.floor(a4h * canvas.width / a4w);
let renderedHeight = 0;while (renderedHeight < canvas.height) {
const page = document.createElement('canvas');
page.width = canvas.width;
page.height = Math.min(imgHeight, canvas.height - renderedHeight);
page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));
renderedHeight += imgHeight;
if (renderedHeight < canvas.height) {
pdf.addPage();
}
}
pdf.save(title + '.pdf');    //这里title可以改为你下载pdf文件时的默认文件名
});
}
};export default htmlToPdf;

4.在vue组件中使用

需要生成 PDF 的 Vue 组件中引用并使用上述函数。首先,在组件中引入 htmlToPdf 

import htmlToPdf from '@/utils/htmlToPdf';

然后,在模板中添加一个包含需要转换内容的 div,并设置一个按钮来触发 PDF 生成

<div id="pdfDom">    这里的 id 要和 htmlToPdf 函数中你写的id保持一致
<!-- 这里是你需要打印/转为pdf文件下载的页面内容 -->
</div>
<div class="preview-content-operateBtn">
<button class="previewBtn" @click="onClickDownLoad">下载 PDF 简历</button>
</div>

在按钮的点击方法中调用 htmlToPdf.getPdf 函数

methods: {    //这里以vue2的选项式代码示例onClickDownLoad() {htmlToPdf.getPdf('下载名称');}
}

解决常见问题:

  1. 模糊问题:通过放大 canvas 尺寸和调整 DPI 来解决。

  2. 页边距问题:在生成 PDF 时预留页边距。

  3. 跨域图片问题:将图片转换为 base64 格式,避免跨域错误。

通过以上步骤,我们可以在 Vue 项目中轻松实现 HTML 转 PDF 的功能,并解决常见的模糊、页边距和跨域图片问题。

本文仅供个人学习使用记录

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

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

相关文章

TCP 坚持定时器详解:原理、配置与最佳实践​

一、TCP 坚持定时器基础原理 1.1 坚持定时器的设计目的 TCP 坚持定时器 (TCP Persist Timer) 是 TCP 协议中用于处理接收窗口为零情况的重要机制&#xff0c;其核心设计目的是防止 TCP 连接在窗口更新 ACK 丢失时陷入死锁状态。当 TCP 连接的接收方通告一个窗口大小为 0 的 A…

大厂测开实习和小厂开发实习怎么选

先说选择&#xff0c;这个可以百分百确定选大厂&#xff0c;title很重要。 要想弄清楚那个选择对自己最有利&#xff0c;可以思考下实习的意义是什么&#xff1f; 实习无非就是给简历加分&#xff0c;拿到好offer&#xff0c;高薪offer。 那这就需要思考&#xff0c;简历怎么让…

Unity中的urp和普通的标准渲染管线区别在哪

Unity中的URP&#xff08;Universal Render Pipeline&#xff09;与内置标准渲染管线&#xff08;Built-in Render Pipeline&#xff09;的区别深刻反映了Unity渲染技术的演进方向。以下从架构、性能、功能、工作流等多个维度进行深度分析&#xff1a; 1. 底层架构与设计哲学 标…

Vscode 编写Markdown支持 plantuml书写

1&#xff1a; 下载PlantUml 插件&#xff1a; 2&#xff1a; 安装java https://www.oracle.com/java/technologies/downloads/ 3&#xff1a; 安装Graphviz https://graphviz.org/download/ 4&#xff1a; 下载plantuml.jar https://plantuml.com/zh/download 5&…

设计模式(C++/Qt)-工厂模式

在软件开发中&#xff0c;对象创建是基础但关键的任务——工厂模式提供了一种优雅的解决方案&#xff0c;让您的代码摆脱硬编码的依赖关系 一、为什么需要工厂模式&#xff1f; 在C/Qt开发中&#xff0c;我们经常面临这样的困境&#xff1a; 对象创建逻辑分散在代码各处新增…

Pydantic 模型

本文将详细介绍 Pydantic 模型 和 BaseModel 的核心概念&#xff0c;并通过实际代码示例如何从零开始编写自己的 Pydantic 模型。 1. Pydantic 是什么&#xff1f; Pydantic 是一个 Python 库&#xff0c;主要用于&#xff1a; 数据验证&#xff1a;确保输入数据符合预期的类…

【Unity智能模型系列】MediaPipeUnityPlugin 实现人脸数据获取

目录 一、MediaPipeUnity 简介 二、MediaPipeUnity 的核心组成 1. Graph 构建系统 2. 解决方案类(Solution) 3. 解释注释Annotation 系统 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection图形人脸检测 2、案例 Face Detection图形人脸检…

iOS App 上架步骤解析:适合资源有限团队的上架流程与注意事项

对于不少创业型或初创阶段的开发团队来说&#xff0c;人员配置紧凑、设备有限是常态。在这种背景下&#xff0c;完成一次合规、高效的iOS应用发布往往不是技术难点&#xff0c;而是流程协同与资源调配的问题。 我们是一支5人团队&#xff0c;开发一款社交类工具型App&#xff…

Redis雪崩、穿透、击穿原理及解决方案

以下是 Redis 缓存穿透、击穿与雪崩的原理及解决方案的深度解析&#xff0c;结合工业级实践整理&#xff1a; &#x1f50d; ‌一、问题原理与区别‌ ‌问题类型‌‌触发条件‌‌核心特征‌‌危害‌‌缓存穿透‌查询‌不存在的数据‌绕过缓存直击数据库&#xff0c;导致无效查…

DFX 动态重构的概念和实现

DFX 动态重构的概念和实现 背景介绍 本文内容当前仅限于XILINX或者和XILINX具有相同结构的FPGA器件。 FPGA 技术提供了在现场进行编程和重新编程的灵活性&#xff0c;而无需通过重新制造流程来实现设计修改。动态功能交换&#xff08;Dynamic Function eXchange, DFX&#x…

hutool 导出数据报错:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 导出报错 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…

【学习】win 本地部署qwen3

这里写自定义目录标题 环境搭建下载Ollama安装olama修改模型下载位置&#xff08;可以不设置&#xff09;通过ollama下载/启动模型常用命令其他 环境搭建 下载Ollama 安装olama 默认安装位置是c盘 安装到指定位置使用以下命令 OllamaSetup.exe /DIR"d:\Ollama"修改…

python的__init__.py

在此之前先确认一个概念是否弄清 模块命名空间 1. 目录结构 假设你有以下结构&#xff1a; testpkg/__init__.pyfool.pymaybe.py内容如下&#xff1a; fool.py # testpkg/fool.py class Fool:passmaybe.py # testpkg/maybe.py class Maybe:pass__init__.py &#xff08…

四核 A53+工业级存储:移远 SC200L 与 pSLC SD NAND 如何重构 T-BOX 性能边界?

博客目录 一、移远 SC200L&#xff1a;T-BOX 的 “智慧大脑”二、米客方德 MKDN064GIL-ZA T-BOX&#xff1a;数据安全的坚固堡垒三、深度协同&#xff1a;拓展 T-BOX 应用边界 在车联网浪潮席卷而来的当下&#xff0c;T-BOX 作为汽车与外界交互的核心枢纽&#xff0c;其性能优劣…

JavaEE-统一功能处理

拦截器 实现强制登录的功能, 后端程序根据Session来判断⽤⼾是否登录, 但是实现⽅法是⽐较⿇烦的 需要修改每个接⼝的处理逻辑 需要修改每个接⼝的返回结果 接⼝定义修改, 前端代码也需要跟着修改 有没有更简单的办法, 统⼀拦截所有的请求, 并进⾏Session校验呢, 这⾥我们学…

vscode运行c++文件和插件的方法

1.运行c文件全过程 VSCode运行C全教程-CSDN博客 按照以上的操作即可完成正常的配置流程。但是在运行我的文件时&#xff0c;总是出现终端和输出混乱的情况&#xff0c;我想要在终端中进行输入输出的话&#xff0c;需要加一个改动&#xff1a;设置--输入Run In Terminal--勾选…

利用云效实现自动化部署gitee仓库中的项目

本文主要介绍如何利用云效 实现Node项目&#xff08;vue/react....&#xff09;自动化部署 1.准备工作 Git 仓库【Gitee】 云服务器【华为云】 你的项目 2. 创建目录 服务器上创建两个目录 一个专门用来放压缩包&#xff1a; /home/www/dist &#xff08;aaa.tgz bbb.tgz&am…

Flink SourceFunction深度解析:数据输入的起点与奥秘

在Flink的数据处理流程中&#xff0c;StreamGraph构建起了作业执行的逻辑框架&#xff0c;而数据的源头则始于SourceFunction。作为Flink数据输入的关键组件&#xff0c;SourceFunction负责从外部数据源读取数据&#xff0c;并将其转换为Flink作业能够处理的格式。深入理解Sour…

LabVIEW 共享变量通讯方式

在LabVIEW 开发中&#xff0c;共享变量&#xff08;SharedVariable&#xff09;作为实现数据实时交换的关键技术&#xff0c;广泛应用于 LabVIEW、PLC 编程、分布式 SCADA 系统等领域。解析主流共享变量通讯机制的技术原理、性能特性及工程实践中的选型策略。​ 一、Network -P…

Angular进阶之十二:Chrome DevTools+Angular实战诊断指南

引言 最近有一个工单是说用户在使用我们的系统的时候&#xff0c;如果使用某个页面的次数多了以后浏览器就开始变慢甚至卡死崩溃掉。这个问题明显是提示有内存泄露&#xff0c;今天就由这个问题开始分享一些关于内存泄漏的知识。 一、 Web 应用内存泄漏的危害与易忽略性 危害&…