irc_web/.svn/pristine/be/be13eb95f5273341f8cce3c733e...

135 lines
6.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 导出页面为PDF格式
// import html2Canvas from 'html2canvas'
// import jsPDF from 'jspdf'
// pdf导出:消除分页内容割裂的具体步骤
// 主要思路:pfd导出页面背景设置为纯白色, 根据内容之间的空白像素点来分页导出。
// 0、导出页面等比例转换成a4纸的格式, 此时宽度为a4w, 高度为H。
// 1、从高度为H的导出页面(已转换)取出一页a4纸高宽度内容, 内容高度为a4h, 位置标记高度h0(h0 = 0,从h0高度开始取), 页面宽度为a4w。
// 2、对高度范围为h (h = a4h + h0) 到h0, 宽度为a4w的内容从下到上, 从左到右遍历像素点。
// 3、当连续遍历到p (p是一个阈值, 一般设为10; 根据实际情形调整) 个白色(#fff)像素点时, 停止遍历。
// 4、记录此时的遍历高度h1 (h0 < h1 < h) ; 宽度为a4w, 高度范围为h1到h0的内容就是这一页要展示的内容(把该内容复制到新的canvas里, 然后将该canvas利用pdf导出来)。
// 5、更新位置高度h0 (h0 = h0 + h1)。
// 6、循环【1】到【5】直到 h0 > H 时跳出循环。
// export default {
// install(Vue) {
// Vue.prototype.getPdf = function(pdfDom) {
// this.loading = true // 显示导出loading
// const title = this.htmlTitle // PDF导出文件描述
// const w = document.querySelector(pdfDom).offsetWidth // 获得该容器的宽
// const h = document.querySelector(pdfDom).offsetHeight // 获得该容器的高
// const scale = 1 // 定义缩放倍数
// const canvas = document.createElement('canvas') // 定义画布canvas
// // PDF内容失真处理
// canvas.width = w * scale // 将画布宽&&高放大两倍
// canvas.height = h * scale
// canvas.state = false // canvas生成pdf过程状态
// canvas.getContext('2d').scale(scale, scale)
// const options = {
// scale: scale,
// canvas: canvas,
// width: w,
// height: h,
// background: '#ffffff'
// }
// html2Canvas(document.querySelector(pdfDom), options).then(function(canvas) {
// const a4Width = 552.28 // A4纸原始宽度为592.28, 这里减去了左右间距2个20
// const a4Height = 801.89 // A4纸原始高度为841.89, 这里减去了左右间距2个20
// const a4HeightRef = Math.floor(canvas.width / a4Width * a4Height) // html页面在a4纸中的高度 ,这里向下取整, 后面与这个变量相关的值都是近似值
// const pageData = canvas.toDataURL('image/jpeg', 1.0)
// let actualHeight = canvas.height // html页面在canvas中的高度
// let positionHeight = 0 // canvas分页, 位置高度
// // eslint-disable-next-line new-cap
// const pdf = new jsPDF('x', 'pt', 'a4')
// const currentCanvas = document.createElement('canvas') // 遍历canvas, 每一页生成的临时canvas
// let height // canvas分页, 每页实际分割的高度(如果每页没有空白, 该高度=a4HeightRef, 有空白的, 会将下面的空白高度去掉)
// function createPdfPage(canvas) {
// if (actualHeight > 0) {
// let checkCount = 0 // 统计出现空白的次数, 按照每页像素点从下到上, 从左到右同时去遍历; 这里根据实际PDF出现的内容, 灵活调整阈值, 使其分割更为合理(这里的阈值为10)
// if (actualHeight > a4HeightRef) {
// let currentHeight = positionHeight + a4HeightRef // 当前单页
// for (let i = currentHeight; i >= positionHeight; --i) {
// let isWrite = true
// for (let j = 0; j < canvas.width; ++j) {
// const c = canvas.getContext('2d').getImageData(j, i, 1, 1).data // 获取横轴为j, 纵轴为i, 高度宽度均为1的像素数据[255,255,255,0.8]
// if (c[0] !== 0xff || c[1] !== 0xff || c[2] !== 0xff) {
// isWrite = false
// break
// }
// }
// if (isWrite) {
// ++checkCount
// if (checkCount >= 10) {
// currentHeight = i
// break
// }
// } else {
// ++checkCount
// }
// }
// height = Math.round(currentHeight - positionHeight)
// } else {
// height = actualHeight
// }
// currentCanvas.width = canvas.width
// currentCanvas.height = height
// // 将当前遍历的canvas页内容复制到新的currentCanvas中
// currentCanvas.getContext('2d').drawImage(canvas, 0, positionHeight, canvas.width, height, 0, 0, canvas.width, height)
// pdf.addPage()
// // 将currentCanvas添加到页面中
// pdf.addImage(currentCanvas.toDataURL('image/jpeg', 1.0), 'JPEG', 20, 20, a4Width, a4Width / currentCanvas.width * height)
// actualHeight -= height
// positionHeight += height
// if (actualHeight > 0) {
// createPdfPage(canvas)
// } else {
// pdf.save(`${title}.pdf`)
// canvas.state = true
// }
// }
// }
// // 当内容未超过pdf一页显示的范围, 无需分页
// if (actualHeight < a4HeightRef) {
// // 这里默认执行了一次pdf.addPage();
// pdf.addImage(pageData, 'JPEG', 20, 20, a4Width, a4Width / canvas.width * actualHeight)
// pdf.save(`${title}.pdf`)
// canvas.state = true
// } else {
// // 删除第一张空白页
// // html2Canvas方法默认就有一页pdf即在进入createPdfPage()方法前就已经执行了一次pdf.addPage();
// pdf.deletePage(1)
// createPdfPage(canvas)
// }
// })
// .then(() => {
// if (canvas.state) {
// this.loading = false
// } else {
// this.$message({
// message: 'Error exporting pdf',
// type: 'error'
// })
// }
// })
// }
// }
// }