[转]JS导出PDF

通过纯js将网页保存为pdf,A4分页,无需服务端参与

1.引入js库文件:

<script src="../static/jspdf/html2canvas.js"></script><script src="../static/jspdf/jsPdf.debug.js"></script>


2.思路:

用html2canvas截取页面(html2canvas就是这样一款前端插件,它的原理是将Dom节点在Canvas里边画出来),然后用jsPDF来生成pdf文件。

3.核心代码:

为了保证生成的pdf空白区域没有黑色背景,在操作之前先把背景设置为白色(因为沒有背景色,截取时会以黑色填充)

$("#"+divID).css("background-color","white");

解决html2canvas截取页面太模糊,创建一个新的canvas:


var canvas_new = document.createElement("canvas");var scale = 2;var w = parseInt(window.getComputedStyle(document.querySelector("#"+divID)).width);var h = parseInt(window.getComputedStyle(document.querySelector("#"+divID)).height);

将canvas画布放大若干倍,然后盛放在较小的容器内,就显得不模糊了:

canvas_new.width = w * scale;canvas_new.height = h * scale;canvas_new.getContext("2d").scale(scale, scale);


进行导出:

var options = {canvas: canvas_new};html2canvas(document.querySelector("#"+divID),options)..then(function(canvas) {var contentWidth = canvas.width;var contentHeight = canvas.height;//一页pdf显示html页面生成的canvas高度;var pageHeight = contentWidth / 592.28 * 841.89;//未生成pdf的html页面高度var leftHeight = contentHeight;//页面偏移var position = 0;//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高var imgWidth = 595.28;var imgHeight = 592.28/contentWidth * contentHeight+45;var pageData = canvas.toDataURL('image/jpeg', 1.0);var pdf = new jsPDF('', 'pt', 'a4');//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)//当内容未超过pdf一页显示的范围,无需分页if (leftHeight < pageHeight) {pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight );} else {while(leftHeight > 0) {pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)leftHeight -= pageHeight;position -= 841.89;//避免添加空白页if(leftHeight > 0) {pdf.addPage();}}}pdf.save('name.pdf');

 


---------------------
作者:致虚极POLE守静笃
来源:CSDN
原文:https://blog.csdn.net/u011821334/article/details/79389426
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

js浏览器对象模型(BOM)

浏览器对象模型(Browser Object Model,BOM)&#xff1a;浏览器为js提供的对象集合。 1 windows对象 windows对象&#xff1a;表示浏览器的框架以及与其相关的内容&#xff0c;比如滚动条和导航栏图标等等。或者说windows对象就代表浏览器本身。windows对象是个全局对象&#xf…

Hello Playwright:(8)等待页面加载

在我们前面的文章中&#xff0c;我们始终使用await page.GotoAsync(url);加载页面&#xff0c;我们的目的是等待足够长的时间让页面上的元素出现。但是&#xff0c;我们更希望永远不要因为等待浪费任何时间。WaitUntilGotoAsync方法的定义如下&#xff1a;Task<IResponse?&…

【ArcGIS微课1000例】0012:ArcGIS创建及连接ArcSDE企业级地理数据库实例

文章目录 实验材料实验过程创建企业级数据库连接企业级数据库创建要素类要素入库实验材料 ArcGIS:版本为10.2Server.ecp:版本为10.2SQL Server:版本为2008实验过程 创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。 数据库平台:SQL Server 实例:localhos…

C语言试题172之实现冒泡排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:实现冒泡…

Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染

Qt移动应用开发&#xff08;八&#xff09;&#xff1a;实现跨平台的QML和OpenGL混合渲染 上一篇文章讲到了利用C这个桥梁&#xff0c;我们实现了QML和Java的交互。Qt 5大力推崇的QML/JS开发&#xff0c;让轻量、高速开发的QML/JS打头阵&#xff0c;让重量的C撑腰&#xff0c;差…

【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放

导航【初探HTML5之使用新标签布局】用html5布局我的博客页&#xff01;【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放【HTML5初探之绘制图像&#xff08;上&#xff09;】看我canvas元素引领下一代web页面【HTML5初探之绘制图像&#xff08;下&#xff09;】看…

两时间差

/** * Comments:返回时间差 * param 两个字符串类型的时间差(time1-time2),type(D天,H时,M分,S秒,Z-S天时分秒) * return */ public final static SimpleDateFormat SF_SIZE19 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//初始化时间格式 public static String …

【ArcGIS微课1000例】0013:ArcGIS创建色带图例(以GlobeLand30土地覆盖数据为例)

本文以GlobeLand30土地覆盖数据(2010年)为例,讲解在ArcGIS中创建色带图例的方法。 案例数据: 色带图例: 创建过程: 选择2010年数据,点击添加到右侧的图例项。 在图例向导里面,删除图例标题,点击下一步。

使用.NET IoT驱动超声波测距传感器

背景最近买的一堆传感器到货了&#xff0c;先来把玩一下超声波测距传感器。超声波传感器一般用于机器人&#xff0c;小车的避障&#xff0c;物体的测距&#xff0c;液位检测&#xff0c;停车检测等领域。HC-SR04知识回顾开始之前我们先复习一下高中的物理知识。原理通过上图的原…

2019-nCoV 全国新型肺炎疫情每日动态趋势可视图

传染源: 野生动物&#xff0c;可能为中华菊头蝠 病毒: 新型冠状病毒 2019-nCoV 传播途径: 经呼吸道飞沫传播&#xff0c;亦可通过接触传播 易感人群: 人群普遍易感。老年人及有基础疾病者感染后病情较重&#xff0c;儿童及婴幼儿也有发病 潜伏期: 一般为 3~7 天&#xff0c;最长…

C语言试题173之实现插入排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:实现排序…

【ArcGIS遇上Python】ArcGIS Python将多个文件夹内的分幅数据整合到同一个文件夹内——以Globeland30数据为例

文章目录 WinRAR解压缩ArcGIS Python批处理从Glabeland30官网下载的全球地覆盖数据包括3年(2000、2010、2020),每一年都是按图幅存储的tif格式栅格数据。以2000的数据为例,全球共812个图幅,每一个图幅对应一个压缩包,如下图所示。 WinRAR解压缩 在进行数据预处理时,必须…

Delphi中字符串比较大小 VS Oracle-SQL中字符串比较大小

重点注意Delphi和Oracle-SQL中比较字符串时空字符串的根本性的不同Delphi中的字符串比较 Delphi中字符串比较大小的规则&#xff1a;对应位置的字符按照字符编码值逐个对比&#xff0c;直到遇到可以确定大小关系的就结束比较参考《Delphi的Ord函数和ASCII码对照表》 常见的一些…

STM8S和STM8L调试串口中断的注意点

源&#xff1a;STM8S和STM8L调试串口中断的注意点

C语言试题174之实现快速排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:实现快速…

解决slideDown()、slideUp()执行结束后才执行下一次,导致鼠标离开后很久动画依然在执行的问题...

问题描述&#xff1a; 给一个容器设置了mouseenter时&#xff0c;一个隐藏的box通过slideDown()显示出来&#xff1b;mouseleave时&#xff0c;通过slideUp()隐藏。 当鼠标不断在容器上滑过时&#xff0c;会导致鼠标离开很久后&#xff0c;动画也在不断执行 解决方法&#xff…

Docker Compose 安装 Superset

前言动手学 dockerSuperset 是一个强大的在线 SQL 查询编辑工具&#xff0c;同时也是一个轻量级的 BI 工具&#xff0c;今天我们就来动手学一下用 docker compose 安装 Superset。安装动手学 docker安装 git 并克隆项目&#xff1a;yum install git -ygit clone https://github…

[转]再见 NoSQL!

为解决大规模数据集合多重数据种类带来的挑战&#xff0c;NoSQL 应运而生&#xff0c;但现在却也遇到了诸多问题&#xff0c;本文作者 Rick Negrin&#xff0c;曾在微软工作 12 年&#xff0c;并在 SQL Server 团队度过大部分光阴&#xff0c;他提出&#xff0c;是时候「和 NoS…

【ArcGIS Pro微课1000例】0008:ArcGIS Pro加载不同来源的在线底图数据

ArcGIS Pro可以很方便的选择不同来源的在线底图数据,如中国地图彩色版、各种形式的天地图等。 打开ArcGIS Pro,点击左下角的【设置】。 点击【选项】。 ArcGIS Pro提供了三种形式的底图:组织的默认底图、自定义底图<

ORA-16198: LGWR received timedout error from KSR

ORA-16198: LGWR received timedout error from KSRORA-16198 意味着主库上的LOG_ARCHIVE_DEST_2的NET_TIMEOUT设置的太小&#xff0c;导致LNS不能在设置的时间内将日志传输到备库。解决方法是提高NET_TIMEOUT的值到15-20 秒&#xff0c;SQL>ALTER SYSTEM SET LOG_ARCHIVE_D…