给页面内所有要转换成PDF的HTML元素添加一个class="item" ,

遍历所有class="item"的HTML元素,

将它们逐个加入到pdf文档中,添加的时候计算图片高度和页面高度,如果超过另起一页。

下面直接上代码

async function printOut(title) { //打印的内容 var ele = document.querySelector('#printId'); //根据特定的class 筛选出来的List (防止文字被切断) let item = ele.querySelectorAll(".item") let eleW = ele.offsetWidth// 获得该容器的宽 let eleH = ele.offsetHeight// 获得该容器的高 let eleOffsetTop = ele.offsetTop // 获得该容器到文档顶部的距离 let eleOffsetLeft = ele.offsetLeft // 获得该容器到文档最左的距离 var canvas = document.createElement('canvas') var abs = 0 let win_in = document.documentElement.clientWidth || document.body.clientWidth // 获得当前可视窗口的宽度(不包含滚动条) let win_out = window.innerWidth // 获得当前窗口的宽度(包含滚动条) if (win_out > win_in) { // abs = (win_o - win_i)/2; // 获得滚动条长度的一半 abs = (win_out - win_in) / 2 // 获得滚动条宽度的一半 // console.log(a, '新abs'); canvas.width = eleW * 2 // 将画布宽&&高放大两倍 canvas.height = eleH * 2 var context = canvas.getContext('2d') context.scale(2, 2) context.translate(-eleOffsetLeft - abs, -eleOffsetTop) // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此 // translate的时候,要把这个差值去掉 var pdf = new jsPDF('', 'pt', 'a4') let position = 0 //页面偏移 let pageHeight = 801.89 //PDF页面高度 for (let i = 0; i < item.length; i++) { canvas = await html2canvas(item[i], {dpi: 300, useCORS: true}) // console.log(item[i]) var contentWidth = canvas.width var contentHeight = canvas.height // a4纸的尺寸[595.28,841.89] var imgWidth = 535.28 //图片宽度 原是595.38,因左右留白30,减去60 var imgHeight = 595.28 / contentWidth * contentHeight //图片高度 var pageData = canvas.toDataURL('image/jpeg', 1.0) if (imgHeight < pageHeight){ if (position === 0){ //页面偏移为0 position = 30; //第一张图片,上边距留白30,页面偏移从30开始 }else { //页高剩余的高度不足放下当前图片高度,则另起一页 pdf.addPage() //新增一张空白的页面 position = 0 //页面偏移初始化 pageHeight = 801.89 //页面高度初始化 if (position === 0){ position = 30; //第一张图片,上边距留白30,页面偏移从30开始 //pdf.addImage(pageData, 'JPEG', 30, position, imgWidth, imgHeight); //添加图片 //position = position + imgHeight; //pageHeight = pageHeight - imgHeight; pdf.addImage(pageData, 'JPEG', 30, position, imgWidth, imgHeight); //添加图片,30:为向左偏移30 position = position + imgHeight; //新偏移 = 旧偏移 + 图片高度 pageHeight = pageHeight - imgHeight; // 新页面高度 = 剩余页高 - 图片高度 pdf.save(title + '.pdf')

原文地址:https://www.cnblogs.com/zbit/p/15080930.html

文中内容是在 Vue 项目中使用 html 2canvas和 js pdf 插件实现将页面的内容生成 PDF ,并记录在使用过程中遇到的一些 问题 解决 方案。文中将会贴出很多参考文章,如果各位有需要,可以前往原文章查阅。 html 2canvas + js pdf 介绍使用方法分页分割 问题 html 2canvas生成图片只有一半其他参考文章 1、 html 2canvas 该插件允许我们直接在浏览器上对网页或其部分进行“截图”操作,但是屏幕截图基于 DOM,这一点很关键。这就会导致截图的结果,很可能不是自己想要的。. 在打印表格 ,偶尔出现表格内容显示不 完整 的状况,这是什么原因导致的呢?出现这样的情况应该如何处理?接下来为大家介绍几种处理方法,可以对应情况来 解决 。一、取消打印区域打印表格显示不 完整 ,有可能是因为设置了固定的打印区域,导致打印表格 ,只打印所选则的区域。遇到这样的情况,点击上方菜单栏-页面布局-打印区域-取消打印区域,即可全部显示出内容。二、更改分页设置可以点击上方菜单栏-页面布局-分页预览,点击... 为了使横向滚动条的内容全部展示,需要指定 width: document.getElementById(id).scrollWidth。 <div ref="myContainer"> <!-- 我是需要导出的内容 --> // 生成 pdf get PDF () { this.generate PDF ( this.$refs.myContainer, "我是下载的 pdf 的名字,随便起. var pdf Content = document.getElementById(" pdf Div");var width = pdf Content.offsetWidth; //获取dom 宽度var height = pdf Content.offsetHeight; //获取dom 高度var canvas = document.createElement("canvas"); //创建一个ca... 欢迎关注我的公众号《人生代码》我有一个大胆的想法,我要一直写到死,那一天我不写了,可能就死了。哈哈。哈喽,大家好,我是你们的攻城狮,人贱人爱的 Ken,一个永远充满激情的人。最近接收到一个优化需求:就是对之前的行程文档的图文介绍添加打印生成 pdf 的功能当然,我们需要依赖 html 2canvas 和 js pdf .min.js 这两个库, html 2canvas 是用于生成 canvas,js pdf ... 一, html 2 pdf html 页面下载 pdf 文件 需求: html 2 pdf html 页面下载 pdf 文件 使用的插件js是 html 2 pdf .js, html 2 pdf 官方链接地址, 按照官方的说明,直接调用save方法就可以。 var element = document.getElementById('element-to-print'); var opt = { margin: 1, filename: 'myfile. pdf ', image: { type: 'j 如果不是有特别的需求,比如打印或者分页,还是建议能在一页显示 pdf ,这样就避免了 文字 被截断的风险。 不做分页处理 html 2canvas(copyDom[0], opts).then((canvas) => { debugger var contentWidth = canvas.width; var contentHeight =... Js pdf 是一个将 html 内容生成 pdf 文件的库,原理是对输入浏览器的 文字 或二进制图片进行base64编码 转换 ,以 pdf 中应有的形式组织,最终以data uri scheme, data:application/ pdf ;base64;[content] 的格式输出 里面的save方法是如何做到浏览器端保存文件的呢? 看下这个: <a href="data:ima...