欢迎关注我的公众号

《人生代码》

我有一个大胆的想法,我要一直写到死,那一天我不写了,可能就死了。哈哈。

哈喽,大家好,我是你们的攻城狮,人贱人爱的 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 内容被截断的终极解决方案...相关推荐

  1. java导出pdf文件并下载_java根据模板生成pdf文件并导出

    1.首先需要依赖包:itext的jar包,我是maven项目,所以附上maven依赖 [html] view plain copy com.itextpdf itextpdf 5.5.10 [html ...

  2. PDF文件 支持拖拽盖章最后生成PDF文件

    项目说明: 根据b站一位博主提供的源码改写了部分方便大家参考 git地址 https://gitee.com/kong-lingbin/pdf-seal-dragging 最终实现效果 需求: 凡pf ...

  3. html2Canvas + jsPDF vue生成pdf(A4纵向或A3横向)

    1: 第一个.将页面html转换成图片 npm install --save html2canvas 第二个.将图片生成pdf npm install jspdf --save 2:创建名称 html ...

  4. php利用tcpdf导出pdf保存文件名,使用TCPDF撰写和生成PDF文件

    一.需求 某一个合同需要在线生成,其中一部分内容是固定的,而另一部分内容是需要添加和编辑的. 编辑的部分是表单内容的填写,内容涵盖了:table input 两个主要的html元素 现在需要在页面编辑 ...

  5. 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件

    参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...

  6. java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件

    简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...

  7. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  8. PDF是什么格式?怎么才能生成PDF文件?

    现在我们日常工作接触的文档大部分都是PDF格式,那么PDF到底是一种什么格式呢?要怎么样才能做出一个PDF文件呢? PDF也是一种文档格式,但相比较我们常用的office文档,格式会更稳定,不会因为版 ...

  9. java 生成pdf文件_Java 中HTTP响应数据生成PDF,PDF文件的读取

    将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因, 废话少说,先说踩的坑 1.区分字符流.字节流 这里可以百度一下,但是简言之就是: j ...

最新文章

  1. python selenium p_Python爬虫(二十一)_Selenium与PhantomJS
  2. mysql 20小时内_生产环境删除数据库,如何实现在1小时内快速恢复?
  3. 040_CSS3背景
  4. delphi和INNO SETUP 文件关联操作
  5. 这 56 个代码注释让我笑吐了
  6. ffmpeg使用总结
  7. python3的3D实战-基于panda3d(1)
  8. @qualifier注解_常见的 Spring 注解概览
  9. C++(11)--编程实践1-经典养成类游戏简单实践
  10. MySQL的常见命令
  11. 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
  12. Visual studio docker build no such file or directory
  13. atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39
  14. boost::bind 与 boost::function 的使用方法例子
  15. 无线路由器实现局域网内中继功能
  16. win10台式机,耳机插入没有声音
  17. 一道逻辑推理题---猜卡片的颜色和数字
  18. 智能点餐mysql框架图_SpringBoot微信点餐系统--P3数据库设计
  19. 云函数+微信公众号到个人微信
  20. Python控制Excel表格的操作以及问题处理

热门文章

  1. SQL语句基础-子查询
  2. 计算机自定义大小修改数值,如何将电脑excel文档中的单元格颜色设置为根据数值大小自动修改...
  3. Qt开发串口通信以及坐标显示程序并移植
  4. htc android sd卡,【HTC T328W】Android系统中SD卡各文件夹功能详解
  5. 小繁的Binary_Indexed_Tree学习笔记
  6. java调用百度AI实现图文识别功能
  7. sed 删除某一行_sed删除指定行
  8. loadrunner监控mysql服务性能
  9. 行业分析是什么?该怎么做?
  10. 弘辽科技:开网店前期需要做好什么工作?弘辽科技提供优质的资源