html2canvas官方文档
jspdf官方文档
因为生成的PDF内还有富文本,后端不好生成PDF,故由前端完成。
html2canva生成截图,jsPDF利用图片生成PDF。
1、生成大于30多页时,容易造成生成页面黑屏问题。
2、 因为html内容时table包裹的,没有连续一行都是空白的,所以如何判断canvas可以截断
3、解决了黑屏问题,但是随之,想在一页上添加水印造成了困难。
<template>
<div class="app-container">
<div class="mask">
<div v-if="!isAddPage" class="tips">
<i class="el-icon-loading"/>
附件正在生成中......
div>
<div v-else class="tips">
<i class="el-icon-loading"/>
附件正在生成第<span class="pdfProgress">{
{ pdfPage }}span>页,共<span class="pdfTotal">{
{ pdfProgress }}span>页......
div>
div>
<div class="hideDiv">
<div id="title">
<p> 我是页眉 p>
div>
<div id="footer">
第<span class="pdfProgress">{
{ pdfPage }}span>页
div>
div>
<div id="pdfDom">
<div id="cover">
<div class="coverContent">
<h1 style="font-size: 22px;">XXX股份有限公司h1>
<h2 style="font-size: 22px;">《张三报告》h2>
div>
div>
<div class="content">
<div class="casepoint">
{
{ pdfContent.content }}
div>
<div class="casepoint">
{
{ pdfContent.content }}
div>
<div class="casepoint">
{
{ pdfContent.content }}
div>
div>
div>
div>
template>
<script>
import html2Canvas from 'html2canvas'
import jsPDF from 'jspdf'
export default{
name: 'SeePdf',
data() {
return {
pdfProgress: 1,
pdfPage: 1,
pdfTotal: null,
type: '01', // 01预览 02下载
taskno: '',
pdfContent: {
content: '我是内容' },
isDownloaded: false, // 是否生成PDF
isOver: false, // 是否生成完毕
a4Width: 595.28,
a4Height: 841.89,
pdf: null,
canvas: [],
a4HeightRef: 0,
position: 0,
leftHeight: 0,
pageFooter: null,
canvasFooter: null,
pageTitle: null,
canvasTitle: null,
canvasTitleH: null,
canvasbreakHeight: 0,
canvasIndex: 0,
pageData: null,
isAddPage: false
}
},
watch: {
isOver: function(newVal) {
if (newVal) {
setTimeout(function() {
window.close()
}, 300)
}
}
},
mounted() {
if (!this.isDownloaded) {
this.getPdfFun()
}
},
// 内容从后台接口获取时,在updated生命周期中调用生成PDF方法
// updated() {
// if (!this.isDownloaded) {
// this.getPdfFun()
// }
// },
methods: {
getPdfFun() {
// 初始化PDF
this.pdf = new jsPDF('x', 'pt', 'a4')
this.pdf.page = 1
this.pdf.setDisplayMode('fullwidth', 'continuous', 'FullScreen')
this.isDownloaded = true
if (this.type === '01') {
this.getPdf('pdf名字', true)
} else if (this.type === '02') {
this.getPdf('pdf名字', false)
}
},
async getPdf(title, show) {
// 生成页眉图片
this.canvasTitle = await html2Canvas(document.getElementById('title'))
this.pageTitle = this.canvasTitle.toDataURL('image/jpeg', 1.0)
// 生成首页图片
const canvasCover = await html2Canvas(document.querySelector('#cover'), {
allowTaint: true,
scale: 2
})
// 生成首页PDF
this.pdf.addImage(canvasCover.toDataURL('image/jpeg', 1.0), 'JPEG', 0, 0, this.a4Width, this.a4Width / canvasCover.width * canvasCover.height)
// 生成内容 6个案件点的图片
const doms = document.getElementsByClassName('casepoint')
for (let i = 0; i < doms.length; i++) {
if (