html文本下一页,Javascript html2canvas + jsPDF 导出PDF,解决一半文字在上一页一半文字在下一页的问题...

var pdfContent = document.getElementById("pdfDiv");

var width = pdfContent.offsetWidth; //获取dom 宽度

var height = pdfContent.offsetHeight; //获取dom 高度

var canvas = document.createElement("canvas"); //创建一个canvas节点

var scale = 3; //定义任意放大倍数 支持小数,越大越清晰

var offsetTop = pdfContent.offsetTop;

var rect = pdfContent.getBoundingClientRect();//获取元素相对于视察的偏移量

canvas.width = width * scale; //定义canvas 宽度 * 缩放

canvas.height = (height + offsetTop) * scale; //定义canvas(高度 +偏移量 )*缩放

var content = canvas.getContext("2d");

content.scale(scale, scale); //获取context,设置scale

content.translate(-rect.left, -rect.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位

var opts = {

background: "#fff",

scale: scale, // 添加的scale 参数

canvas: canvas, //自定义 canvas

// logging: true, //日志开关,便于查看html2canvas的内部执行流程

width: width, //dom 原始宽度

height: height,

useCORS: true, // 【重要】开启跨域配置

allowTaint: true,

taintTest: false

};

html2canvas(pdfContent,opts ).then(function (canvas) {

downloadCanvasWithMargin(canvas);

})

//-----------------------

function downloadCanvasWithMargin(canvas){

//关闭锯齿

var context = canvas.getContext('2d');

context.mozImageSmoothingEnabled = false;

context.webkitImageSmoothingEnabled = false;

context.msImageSmoothingEnabled = false;

context.imageSmoothingEnabled = false;

let contentWidth = canvas.width;

let contentHeight = canvas.height;

//一页pdf显示html页面生成的canvas高度;

let pageHeight = contentWidth / 595.28 * 841.89;

//未生成pdf的html页面高度

let leftHeight = contentHeight;

let cutStartHeight = 0;

let canvasArr = [];

if(leftHeight > pageHeight) {

while (leftHeight > 0) {

//复制出(0, cutStartHeight)开始,contentWidth宽和pageHeight高的图片

let cutImage = context.getImageData(0, cutStartHeight, contentWidth, pageHeight);

//从图像底部开始校验颜色,直到验证到以白色结尾才开始切图像

let moveUpPx = 0; //上移px数

let totalLength = cutImage.data.length;

let lineLength = 4 * contentWidth * 1; //一行的data容量

let leftLength = totalLength - lineLength;

let rightLength = totalLength;

let circle = 0; //循环次数

let pointRatio = 0.98; //一行给定颜色的占比系数

let pointRatioNum = contentWidth * pointRatio;

while( circle === moveUpPx ){

circle ++;

let ignorePoint = 0;

for(let i = leftLength; i< rightLength ; i+=4){

if(cutImage.data[i] === 255 || cutImage.data[i] === 251){

if(cutImage.data[i] === cutImage.data[i+1] && cutImage.data[i] === cutImage.data[i+2]){

ignorePoint++;

}

}

}

if(ignorePoint < pointRatioNum){

leftLength -= lineLength;

rightLength -= lineLength;

moveUpPx ++;

}

}

if(moveUpPx > 0){

cutImage = context.getImageData(0, cutStartHeight, contentWidth, pageHeight - moveUpPx);

}

leftHeight -= pageHeight - moveUpPx;

cutStartHeight += pageHeight - moveUpPx;

//创建新图片

let nCanvas = document.createElement("canvas"); //创建一个canvas节点

nCanvas.width = canvas.width;

nCanvas.height = pageHeight - moveUpPx;

let nContext = nCanvas.getContext("2d");

nContext.mozImageSmoothingEnabled = false;

nContext.webkitImageSmoothingEnabled = false;

nContext.msImageSmoothingEnabled = false;

nContext.imageSmoothingEnabled = false;

nContext.putImageData(cutImage, 0, 0)

canvasArr.push(nCanvas);

}

}else{

canvasArr.push(canvas);

}

//处理尾页图片透明背景

let lastCanvas = canvasArr[canvasArr.length - 1];

let ctx = lastCanvas.getContext("2d");

// 将canvas的透明背景设置成白色--解决translate后便黑色背景的问题

let imageData = ctx.getImageData(0, 0, lastCanvas.width, lastCanvas.height);

for(var i = 0; i < imageData.data.length; i += 4) {

// 当该像素是透明的,则设置成白色

if(imageData.data[i + 3] === 0) {

imageData.data[i] = 255;

imageData.data[i + 1] = 255;

imageData.data[i + 2] = 255;

imageData.data[i + 3] = 255;

}

}

ctx.putImageData(imageData, 0, 0);

var pdf = new jsPDF('', 'pt', 'a4');

let leftMargin = 20;

let topMargin = 20;

let a4Width = 595.28;

let a4Height = 841.89;

let imgWidth = a4Width - leftMargin * 2;

let imgHeight = a4Height - 2 * topMargin;

for(let i =0; i < canvasArr.length; i++){

let curCanvas = canvasArr[i];

let pageData = curCanvas.toDataURL('image/jpeg', 1.0);

//小于切分的高度,要换算比例高

if(curCanvas.height < pageHeight){

let ratioHeight = imgWidth / curCanvas.width * curCanvas.height;

pdf.addImage(pageData, 'JPEG', leftMargin, topMargin, imgWidth, ratioHeight);

}else{

pdf.addImage(pageData, 'JPEG', leftMargin, topMargin, imgWidth, imgHeight);

}

if(i < (canvasArr.length-1)){

pdf.addPage();

}

}

let date = new Date();

let year = date.getFullYear();

let month = date.getMonth() + 1;

let day = date.getDate();

let milliSeconds = date.getMilliseconds();

pdf.save(year + month + day + milliSeconds +'.pdf');

}

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

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

相关文章

无法设置html过渡效果,html – CSS3过渡显示无阻止过度滚动

我假设你的弹出窗口是绝对定位的,所以你可以做以下事情&#xff1a;>隐藏时,将弹出窗口设置为巨大的负值.这会将其移出屏幕并摆脱滚动条.>在悬停时,将顶部设置为正确的值并转换不透明度值.>确保CSS转换规则仅适用于opacity属性.HTMLPopup go nowMy cats breath smells…

ACM 题目分类POJ(自用,精)

详情见博客&#xff1a;http://exp-blog.com/2018/06/28/pid-38/ 和博客https://blog.csdn.net/a1dark/article/details/11714009/ http://exp-blog.com/2018/06/10/pid-136/ https://blog.csdn.net/lyy289065406/article/details/6642573

html表格全屏显示,tableView滑动全屏显示

今天要分享的一个效果是在一个页面弹出视图展示一个tableview&#xff0c;然后手指滑动tableview时&#xff0c;视图随着tableview偏移量增加而慢慢增加&#xff0c;到达临界时&#xff0c;全屏显示&#xff0c;然后再次向下滑动时&#xff0c;当偏移量到达临界点&#xff0c;视…

【 CodeForces - 864B】Polycarp and Letters(水题,字符串,有坑)

题干&#xff1a; Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string sconsisting only of lowercase and uppercase Latin letters. Let A be a set of positions in the string. Lets call it pretty if following conditions are met:…

计算机网络65535,计算机网络1

1.网络基础&#xff1a;1.1 IT行业铁三角&#xff1a;os&#xff0c;web&#xff0c;sql 不管是哪个IT岗位都应该懂&#xff0c;1.2 开发铁三角&#xff1a;语言&#xff0c;数据结构算法&#xff0c;数据模式1.3 测试铁三角&#xff1a;需求&#xff0c;搭环境和设计用例&…

【CodeForces - 864C】Bus (模拟,有坑)

题干&#xff1a; A bus moves along the coordinate line Ox from the point x  0 to the point x  a. After starting from the point x  0, it reaches the point x  a, immediately turns back and then moves to the point x  0. After returning to the point…

大量html乱码seo,HTTPS改造之后网页错位乱码,影响SEO和正常访问,应该这样改

有一些朋友可能不太知道https改造怎么做&#xff0c;就学着网站的步骤进行&#xff0c;实际操作过程中可能会遇到很多问题。比如说有的会出现网页错位、页面乱码、后台功能无法使用的情况。昨天我们就有一个客户他自己做了https改造&#xff0c;但是造成后台无法上传图片的情况…

【NOIP2013积木大赛,NOIP2018铺设道路】积木大赛(思维,贪心)

题干&#xff1a; 题目描述 春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为nn的大厦&#xff0c;大厦可以看成由n块宽度为1的积木组成&#xff0c;第i块积木的最终高度需要是h_ihi​。 在搭建开始之前&#xff0c;没有任何积木&#xff08;可以看…

微型计算机中最小的单位,微型计算机中最小的数据单位是

微型计算机中最小的数据单位是比特。微型计算机&#xff0c;是指由微处理器作为CPU的计算机。由大规模集成电路组成的、体积较小的电子计算机。由微处理机(核心)、存储片、输入和输出片、系统总线等组成。特点是体积小、灵活性大、价格便宜、使用方便。这类计算机的普遍特征就是…

【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】

最小边覆盖 最大独立集 |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同&#xff0c;不要求给的图是二分图&#xff0c;而是要求是N x N的有向图&#xff0c;不能有环&#xff0c;然后根据原图构造二分图&#xff0c;构造方法是将点一分为二&am…

【51Nod - 1344】走格子 (思维)

题干&#xff1a; 有编号1-n的n个格子&#xff0c;机器人从1号格子顺序向后走&#xff0c;一直走到n号格子&#xff0c;并需要从n号格子走出去。机器人有一个初始能量&#xff0c;每个格子对应一个整数Aii&#xff0c;表示这个格子的能量值。如果Aii > 0&#xff0c;机器人…

计算机算法在生物信息学中的应用,计算机算法在生物信息学中的应用综述.doc...

计算机算法在生物信息学中的应用综述摘 要&#xff1a;在人类基因组计划的推动下&#xff0c;生物信息学得到了人们的广泛关注&#xff0c;并呈现出数量多、计算量大等鲜明特征&#xff0c;因此要求在生物信息学中采用计算机算法&#xff0c;以提高生物信息学处理问题的效率。以…

信息学竞赛计算机基础知识,信息学奥赛-计算机基础知识.doc

信息学奥赛-计算机基础知识TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc303947525" 第一章 计算机基础知识 PAGEREF _Toc303947525 \h 2HYPERLINK \l "_Toc303947526" 第一节 数制及其转换 PAGEREF _Toc303947526 \h 2HYPERLINK \l "_Toc3039…

【51Nod - 1182】完美字符串(贪心,字符串)

题干&#xff1a; 约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配&#xff0c;不同字母的完美度不同&#xff0c;分别对应一个1-26之间的整数。 约翰不在乎字母大小写&#xff08;也就是说字母A和a的完美度相同&#xff09;。给定一…

【51Nod - 1133】不重叠的线段 (贪心)

题干&#xff1a; X轴上有N条线段&#xff0c;每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。&#xff08;注&#xff1a;起点或终点重叠&#xff0c;不算重叠&#xff09;。 例如&#xff1a;151523233636&#xff0c;可以选23233636&#xff0c;这2条线段…

xml html 转化为字符串,XSLT:将字符串解析为XML节点集(concret:将HTML-String转换为节点集)?...

我面临的问题是我在XML中有一个字符串的节点&#xff0c;代表HTML。 我需要削减该字符串&#xff0c;但是&#xff0c;当然&#xff0c;这可能导致在invalide HTML的标记(例如&#xff0c;如果我切字符串总是后30个字符我很容易失去闭元件等等)。 怎么办&#xff1f; 这似乎是非…

【51Nod - 1106 】质数检测 (水题,数论)

题干&#xff1a; 给出N个正整数&#xff0c;检测每个数是否为质数。如果是&#xff0c;输出"Yes"&#xff0c;否则输出"No"。 Input 第1行&#xff1a;一个数N&#xff0c;表示正整数的数量。(1 < N < 1000) 第2 - N 1行&#xff1a;每行1个数…

华中科技大学计算机系统结构,华中科技大学计算机系统结构复习题.pdf

Advanced Computer Architecture高级计算机系统结构 (复习题)-考试时间&#xff1a;1月20号下午根据曹强老师的写的&#xff0c;不知道会不会有错误&#xff0c;祝大家好成绩——by刘梦博By刘梦博Amdahl’s Law Fractionenhanced  ExTimenew  ExTimeold  1 Fract…

琴生不等式一般形式_001.二次函数、方程和不等式知识点

学法指导&#xff1a;本专题讲授不等式内容&#xff0c;这部分内容是学生的难点&#xff0c;为此有几点说明&#xff1a;1.把握好学习的难度。按教材内不等式部分展现的内容看&#xff0c;它很简单&#xff0c;但学过的知道&#xff0c;这部分内容很难&#xff0c;直白的讲&…

【51Nod - 1432】独木舟 (贪心,思维,好题)

题干&#xff1a; n个人&#xff0c;已知每个人体重。独木舟承重固定&#xff0c;每只独木舟最多坐两个人&#xff0c;可以坐一个人或者两个人。显然要求总重量不超过独木舟承重&#xff0c;假设每个人体重也不超过独木舟承重&#xff0c;问最少需要几只独木舟&#xff1f; …