html页面导出pdf截断问题,html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案...
欢迎关注我的公众号
《人生代码》
我有一个大胆的想法,我要一直写到死,那一天我不写了,可能就死了。哈哈。
哈喽,大家好,我是你们的攻城狮,人贱人爱的 Ken,一个永远充满激情的人。
最近接收到一个优化需求:就是对之前的行程文档的图文介绍添加打印生成 pdf 的功能
当然,我们需要依赖 html2canvas 和 jspdf.min.js 这两个库,html2canvas 是用于生成 canvas,jspdf.min.js 是用于生成 pdf 的。
首先我们需要引入 html2canvas, jspdf
import html2canvas from 'html2canvas'
import './jspdf.min.js'
如果有滚动条,先把滚动条置顶
document.body.scrollTop = document.documentElement.scrollTop = 0
if (!selector) {
throw new Error('缺少selector')
}
let el = document.querySelector(selector)
if (!el) {
throw new Error('未找到' + selector + '对应的dom节点')
}
设置背景色为白色,然后转成图片后,获取截断处图片像素点,从截断处往上一行行扫描像素点颜色,碰到这一行颜色都是全白的,代表是从这里开始截断,将这个高度开始将往下的内容都放到下一页
html2canvas(el, {
allowTaint: true,
useCORS: true,
dpi: 120, // 图片清晰度问题
background: '#FFFFFF', //如果指定的div没有设置背景色会默认成黑色,这里是个坑
}).then(canvas => {
//未生成pdf的html页面高度
var leftHeight = canvas.height
var a4Width = 595.28
var a4Height = 841.89 //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
//一页pdf显示html页面生成的canvas高度;
var a4HeightRef = Math.floor((canvas.width / a4Width) * a4Height)
//pdf页面偏移
var position = 0
var pageData = canvas.toDataURL('image/jpeg', 1.0)
var pdf = new jsPDF('p', 'pt', 'a4') //A4纸,纵向
var index = 1,
canvas1 = document.createElement('canvas'),
height
pdf.setDisplayMode('fullwidth', 'continuous', 'FullScreen')
var pdfName = title
function createImpl(canvas){
console.log(leftHeight, a4HeightRef)
if (leftHeight > 0) {
index++
var checkCount = 0
if (leftHeight > a4HeightRef) {
var i = position + a4HeightRef
for (i = position + a4HeightRef; i >= position; i--) {
var isWrite = true
for (var j = 0; j
var c = canvas.getContext('2d').getImageData(j, i, 1, 1).data
if (c[0] != 0xff || c[1] != 0xff || c[2] != 0xff) {
isWrite = false
break
}
}
if (isWrite) {
checkCount++
if (checkCount >= 10) {
break
}
} else {
checkCount = 0
}
}
height = Math.round(i - position) || Math.min(leftHeight, a4HeightRef)
if (height <= 0) {
height = a4HeightRef
}
} else {
height = leftHeight
}
canvas1.width = canvas.width
canvas1.height = height
console.log(index, 'height:', height, 'pos', position)
var ctx = canvas1.getContext('2d')
ctx.drawImage(
canvas,
0,
position,
canvas.width,
height,
0,
0,
canvas.width,
height,
)
var pageHeight = Math.round((a4Width / canvas.width) * height)
// pdf.setPageSize(null, pageHeight)
if (position != 0) {
pdf.addPage()
}
pdf.addImage(
canvas1.toDataURL('image/jpeg', 1.0),
'JPEG',
10,
10,
a4Width,
(a4Width / canvas1.width) * height,
)
leftHeight -= height
position += height
if (leftHeight > 0) {
setTimeout(createImpl, 500, canvas)
} else {
pdf.save(pdfName + '.pdf')
}
}
}
//当内容未超过pdf一页显示的范围,无需分页
if (leftHeight
pdf.addImage(
pageData,
'JPEG',
0,
0,
a4Width,
(a4Width / canvas.width) * leftHeight,
)
pdf.save(pdfName + '.pdf')
} else {
try {
pdf.deletePage(0)
setTimeout(createImpl, 500, canvas)
} catch (err) {
// console.log(err);
}
}
})
如果是连续的表格的,我们的方案是不使用一个表格来填充所有数据,这就有点像那个分页加载数据一样了,如果我们使用多个表格来循环这些数据,然后每个表格的高度设置为 a4 纸的高度,这样也许能够做到不被截断了
html页面导出pdf截断问题,html2canvas 与 jspdf 相结合生成 pdf 内容被截断的终极解决方案...相关推荐
- java导出pdf文件并下载_java根据模板生成pdf文件并导出
1.首先需要依赖包:itext的jar包,我是maven项目,所以附上maven依赖 [html] view plain copy com.itextpdf itextpdf 5.5.10 [html ...
- PDF文件 支持拖拽盖章最后生成PDF文件
项目说明: 根据b站一位博主提供的源码改写了部分方便大家参考 git地址 https://gitee.com/kong-lingbin/pdf-seal-dragging 最终实现效果 需求: 凡pf ...
- html2Canvas + jsPDF vue生成pdf(A4纵向或A3横向)
1: 第一个.将页面html转换成图片 npm install --save html2canvas 第二个.将图片生成pdf npm install jspdf --save 2:创建名称 html ...
- php利用tcpdf导出pdf保存文件名,使用TCPDF撰写和生成PDF文件
一.需求 某一个合同需要在线生成,其中一部分内容是固定的,而另一部分内容是需要添加和编辑的. 编辑的部分是表单内容的填写,内容涵盖了:table input 两个主要的html元素 现在需要在页面编辑 ...
- 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件
参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...
- java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件
简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...
- java pdf 首行缩进_java使用iText生成pdf文档的对齐方式
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- PDF是什么格式?怎么才能生成PDF文件?
现在我们日常工作接触的文档大部分都是PDF格式,那么PDF到底是一种什么格式呢?要怎么样才能做出一个PDF文件呢? PDF也是一种文档格式,但相比较我们常用的office文档,格式会更稳定,不会因为版 ...
- java 生成pdf文件_Java 中HTTP响应数据生成PDF,PDF文件的读取
将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因, 废话少说,先说踩的坑 1.区分字符流.字节流 这里可以百度一下,但是简言之就是: j ...
最新文章
- python selenium p_Python爬虫(二十一)_Selenium与PhantomJS
- mysql 20小时内_生产环境删除数据库,如何实现在1小时内快速恢复?
- 040_CSS3背景
- delphi和INNO SETUP 文件关联操作
- 这 56 个代码注释让我笑吐了
- ffmpeg使用总结
- python3的3D实战-基于panda3d(1)
- @qualifier注解_常见的 Spring 注解概览
- C++(11)--编程实践1-经典养成类游戏简单实践
- MySQL的常见命令
- 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
- Visual studio docker build no such file or directory
- atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案 v3 q39
- boost::bind 与 boost::function 的使用方法例子
- 无线路由器实现局域网内中继功能
- win10台式机,耳机插入没有声音
- 一道逻辑推理题---猜卡片的颜色和数字
- 智能点餐mysql框架图_SpringBoot微信点餐系统--P3数据库设计
- 云函数+微信公众号到个人微信
- Python控制Excel表格的操作以及问题处理
热门文章
- SQL语句基础-子查询
- 计算机自定义大小修改数值,如何将电脑excel文档中的单元格颜色设置为根据数值大小自动修改...
- Qt开发串口通信以及坐标显示程序并移植
- htc android sd卡,【HTC T328W】Android系统中SD卡各文件夹功能详解
- 小繁的Binary_Indexed_Tree学习笔记
- java调用百度AI实现图文识别功能
- sed 删除某一行_sed删除指定行
- loadrunner监控mysql服务性能
- 行业分析是什么?该怎么做?
- 弘辽科技:开网店前期需要做好什么工作?弘辽科技提供优质的资源