前端项目使用js将dom生成图片、PDF
在进行下方操作前,请你先安装 html2canvas 和 jspdf 包。
1、使用html2canvas将dom元素生成图片
// 获取要转换的dom
const ele = document.getElementById("dom");
// 生成canvas对象
let canvas = await html2canvas(ele);
2、生成PDF对象,将生成的canvas对象转换成base64添加进PDF对象中
// 新建JsPDF对象
const PDF = new jsPDF({orientation: 'p', //参数: l:横向 p:纵向unit: 'mm', //参数:测量单位("pt","mm", "cm", "m", "in" or "px")format: 'a4', //A4纸
})// 将生成的canvas转换成base64添加进PDF对象中
PDF.addImage(canvas.toDataURL('image/jpeg', 1), 'JPEG', 10, 10);// 使用PDF.save()方法进行保存
PDF.save(`${你的文件名}.pdf`)
3、进阶用法
1. canvas要生成的dom高度比较大,a4纸放不下怎么分页?
2. 如何构建pdf文件上传到服务器中?
4、完整代码
// 新建JsPDF对象
const PDF = new jsPDF({orientation: 'p', //参数: l:横向 p:纵向unit: 'mm', //参数:测量单位("pt","mm", "cm", "m", "in" or "px")format: 'a4', //A4纸
})// 将dom转换成canvas对象
const ele = document.getElementById("qkqqProbationDetail");
let canvas = await html2canvas(ele);
const ctx = canvas.getContext('2d')//A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
const a4w = 190
const a4h = 277
//按A4显示比例换算一页图像的像素高度
const imgHeight = Math.floor(a4h * canvas.width / a4w)
let renderedHeight = 0
while (renderedHeight < canvas.height) {let page = document.createElement("canvas");page.width = canvas.width;//可能内容不足一页page.height = Math.min(imgHeight, canvas.height - renderedHeight);//用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);// canvas转图片数据保留10mm边距PDF.addImage(page.toDataURL('image/jpeg', 1), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));renderedHeight += imgHeight;//判断是否分页,如果后面还有内容,添加一个空页if (renderedHeight < canvas.height) {PDF.addPage()}
}// 简单版,不需要考虑分页
// PDF.addImage(canvas.toDataURL('image/jpeg', 1), 'JPEG', 10, 10)// **
// dataurlstring 可以拿到base64来进行你的展示
// blob 可以拿到文件流进行上传操作
const pdf_base64 = PDF.output("dataurlstring");
const pdf_blob = PDF.output("blob");
// 使用File构造函数和blob数据创建一个新的File对象
const file = new File([pdf_blob], `${你的pdf}.pdf`, {type: "application/pdf",
});// ** 不上传的话,直接调用保存,将pdf文件保存在你的电脑上
PDF.save(`${你的pdf}.pdf`)
相关文章:
前端项目使用js将dom生成图片、PDF
在进行下方操作前,请你先安装 html2canvas 和 jspdf 包。 1、使用html2canvas将dom元素生成图片 // 获取要转换的dom const ele document.getElementById("dom"); // 生成canvas对象 let canvas await html2canvas(ele); 2、生成PDF对象,将…...
在 Red Hat 上安装 SQL Server 2022 并创建数据库
适用于: SQL Server - Linux 本快速入门介绍如何在 Red Hat Enterprise Linux (RHEL) 8.x 或 9.x 上安装 SQL Server 2022 (16.x)。然后可以使用 sqlcmd 进行连接,创建第一个数据库并运行查询。 注意:本教程需要用户输入和 Internet 连接。 …...
游戏如何应对云手机刷量问题
云手机的实现原理是依托公有云和 ARM 虚拟化技术,为用户在云端提供一个安卓实例,用户可以将手机上的应用上传至云端,再通过视频流的方式,远程实时控制云手机。 市面上常见的几款云手机 原本需要手机提供的计算、存储等能力都改由…...
QTableView使用QSortFilterProxyModel后行号错乱
在Qt中,当你使用QSortFilterProxyModel对QTableView进行排序或过滤后,点击事件可能会返回一个不正确的行号,因为代理模型可能会改变数据的显示顺序。为了获取点击数据的真实行号和内容,你可以使用mapToSource()函数,它…...
【Python】 报错Can‘t find model ‘en_core_web_md‘
出现这种错误表明Python环境中找不到名为en_core_web_md的模型。这通常发生在使用spaCy库进行自然语言处理时,因为spaCy依赖于预先训练好的模型来进行词性标注、依赖分析、命名实体识别等任务。如果没有安装该模型,尝试加载它时会导致错误。 解决办法&a…...
每天五分钟深度学习框架pytorch:pytorch中已经定义好的损失函数
本文重点 前面我们学习了pytorch中两种模式的损失函数,一种是nn,另外一种是functional,本文将讲解pytorch中已经封装好的损失函数。其实nn的方式就是类,而functional的方式就是方法。nn中使用的也是functional。 损失函数中的参数 无论是nn还是functional,大多数的损失函…...
dedecms(四种webshell姿势)、aspcms webshell漏洞复现
一、aspcms webshell 1、登陆后台,在扩展功能的幻灯片设置模块,点击保存进行抓包查看 2、在slideTextStatus写入asp一句话木马 1%25><%25Eval(Request(chr(65)))%25><%25 密码是a,放行,修改成功 3、使用菜刀工具连…...
【STM32系统】基于STM32设计的智能垃圾桶(语音、颜色识别、称重、光强、烟雾、人体识别、步进电机、水泵)——文末资料下载
基于STM32设计的智能垃圾桶 演示视频: 基于STM32设计的智能垃圾桶 功能简介: 四个按键可分别打开四个垃圾桶(可回收垃圾、厨余垃圾、有害垃圾、其他垃圾) oled显示屏显示四个垃圾桶的打开/关闭状态、烟雾浓度、光照强度、称重的重量和识别到的颜色(白色、红色、绿色、蓝…...
GPT代码记录
#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…...
powerbi
一. CALCULATE 和 FILTER FILTER 返回的数据必须是表, 所以 可以 用在 新建表中, 不能直接用在度量值中其实 filter 相当于 用 外表字段 去进行筛选 不使用 filter, 只能使用本表字段 进行筛选,如下1, 只能使用 门店信…...
【Unity】检测鼠标点击位置是否有2D对象
在这里提供两种方案,一种是射线检测,另一种是非射线检测。 初始准备步骤: 创建2D对象(比如2D精灵)给要被检测的2D对象添加2D碰撞体(必须是2D碰撞体)创建一个空对象,再创建一个检测…...
Python学习——【2.1】if语句相关语法
文章目录 【2.1】if语句相关一、布尔类型和比较运算符(一)布尔类型(二)比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…...
机器学习--K-Means
K均值聚类 算法过程 K − m e a n s K-means K−means 是 聚类 c l u s t e r i n g clustering clustering 算法的一种,就是给你一坨东西,让你给他们分类: 我们的 K − m e a n s K-means K−means 大概是这样一个流程: 第一…...
模型训练时CPU和GPU大幅度波动——可能是数据的读入拖后腿
模型训练时CPU和GPU大幅度波动——可能是数据的加载拖后腿 问题 在进行猫狗大战分类任务时,发现模型训练时CPU和GPU大幅度波动,且模型训练速度很慢。 原因 初步分析可能是数据加载(包括数据的transform,我用了Resize&#…...
keep-alive的应用场景
...
【C++ Primer Plus习题】16.9
大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <ctime> #include <v…...
Java入门:09.Java中三大特性(封装、继承、多态)02
2 继承 需要两个类才能实现继承的效果。 比如:类A 继承 类B A类 称为 子类 , 衍生类,派生类 B类 称为 父类,基类,超类 继承的作用 子类自动的拥有父类的所有属性和方法 (父类编写,子类不需要…...
AI为云游戏带来的革新及解决方案:深度技术剖析与未来展望
近期,科技巨头埃隆马斯克与热门国产游戏《黑神话:悟空》的互动,再次引发了公众对AI技术在游戏产业中应用的关注。马斯克,作为特斯拉和SpaceX的掌门人,不仅在科技领域引领风骚,其个人兴趣也广泛涉猎…...
集合是什么
1.是什么 集合(Collection)是Java语言中一个非常重要的概念,它是一组对象的容器,用于存储、检索和操作对象。在Java中,集合框架定义了一系列接口和实现类,用于处理不同类型的集合。 集合的概念 集合框架提…...
JavaDS —— 图
图的概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构:G (V,E) 其中 V 表示的是顶点集合 : V { x | x 属于某个数据对象集} 是有穷非空集合 E 叫做边的集合 : E {(x, y) | x, y 属于 V} 或者 …...
自动化内容创作:OpenClaw+Qwen3.5-9B批量处理游记照片生成博客
自动化内容创作:OpenClawQwen3.5-9B批量处理游记照片生成博客 1. 为什么需要自动化内容创作流水线 去年夏天我从西藏旅行回来,手机里存了800多张照片。当我坐在电脑前准备写游记时,面对海量素材突然感到无从下手——每张照片都需要回忆拍摄…...
c++如何读取BMP位图文件并精确提取每个像素点的RGB值【实战】
直接用fread读BMP会错乱因像素数据BGR存储、行末补零对齐且从左下到右上排列;需跳过bfOffBits,按每行字节数对齐读取并反向索引,再手动转为RGB。为什么直接用 fread 读 BMP 文件会得到错乱的 RGB 顺序?BMP 文件头和信息头之后&…...
RoboCore SMW_SX1276M0 LoRaWAN协议栈开发指南
1. 项目概述RoboCore SMW_SX1276M0 是一款面向嵌入式物联网终端的 LoRaWAN 协议栈封装库,专为 RoboCore LoRaWAN Bee v2.0 模块设计。该模块核心采用 Semtech SX1276 射频收发器,集成高灵敏度 LoRa 调制解调器、前向纠错(FEC)、自…...
三极管的混合π模型
混合π模型如下图所示。 要用这个模型需要确定的参数有、、和。它们的公式如下。...
PicoClaw:10美元硬件上的AI革命,让Mac mini瞬间不香了!
PicoClaw:10美元硬件上的AI革命,让Mac mini瞬间不香了!一只皮皮虾搅动了整个AI助手江湖,95%代码由AI自主生成,在不到10MB内存中跑出完整智能体能力。最近,GitHub上有个项目像火箭般蹿升——PicoClaw&#x…...
OpenClaw+千问3.5-9B学术助手:自动整理参考文献与生成综述
OpenClaw千问3.5-9B学术助手:自动整理参考文献与生成综述 1. 为什么需要自动化文献处理 去年冬天,当我面对堆积如山的PDF文献时,突然意识到传统文献管理方式已经跟不上现代研究的节奏。手动标注重点、复制粘贴引用、反复切换不同文献工具—…...
云原生环境中的配置中心实践
云原生环境中的配置中心实践 🔥 硬核开场 各位技术老铁,今天咱们聊聊云原生环境中的配置中心实践。别跟我扯那些理论,直接上干货!在云原生时代,配置管理是系统可靠性和可维护性的关键。不搞配置中心?那你…...
自适应交易利器:KAMA指标在Python中的高效实现与实战解析
1. 认识KAMA指标:让移动平均线"活"起来 第一次接触KAMA指标是在2018年的一个量化交易项目中。当时我们团队正在寻找能够适应不同市场环境的趋势指标,传统的均线系统在震荡市中频繁发出假信号,而在趋势行情中又显得过于滞后。直到一…...
基于metaRTC的H264/H265嵌入式高清直播系统开发指南
1. 为什么选择metaRTC开发嵌入式直播系统 第一次接触metaRTC是在一个教育录播项目里,客户要求系统必须支持H265编码,还得能在ARM架构的嵌入式设备上稳定运行。当时试了好几个开源方案,不是编解码性能跟不上,就是内存占用太高。直到…...
PCK文件解析与资源提取全指南:从基础到高级的游戏资源逆向工程实践
PCK文件解析与资源提取全指南:从基础到高级的游戏资源逆向工程实践 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 在游戏开发与学习过程中,我们经常需要分析游戏资源文件以理…...
