来了一个需求,要求做分页pdf文档 刚开始以为自己可以,用了插件html2canvas和jspdf (具体可以看我另一篇文章:vue将页面导出pdf,vue导出pdf),做出来了,但是支持下载一页的页面,多页的时候会切割,例如这样 所以我用了调用打印的方法iframe.window.print(),让客户自己另存为pdf 1先建一个文件PrintView.vue文件 内容:这是PrintView.vue的全部代码
<template>
<div class="print">
<iframe
id="iframe"
style="display: none; width: 100%; height: auto"
frameborder="0"
></iframe>
</div>
</template>
<script>
export default {
name: 'PrintView',
props: {},
watch: {},
methods: {
setBodyHtml(html) {
const document = window.document
const iframe = window.frames[0]
iframe.document.head.innerHTML = document.head.innerHTML
iframe.document.body.innerHTML = html
let arr = document.getElementsByTagName('tr')
console.log(arr)
let heightNum = 0
let onePage = 800
for (let i in arr) {
heightNum += arr[i].offsetHeight
if (heightNum > onePage) {
heightNum = arr[i].offsetHeight
onePage = 1500
}
}
Promise.all([this.loadStyle(), this.loadImage()]).then(() => {
iframe.window.print()
})
},
loadStyle() {
const iframe = window.frames[0]
const styles = iframe.document.head.getElementsByTagName('style')
const links = iframe.document.head.querySelectorAll(
'link[type="text/css"]'
)
let str = ''
str += '<style>html,body,div{height: auto!important;}</style>'
let arrs = []
arrs = arrs.concat(...styles, ...links)
for (let i = 0; i < arrs.length; i++) {
str += arrs[i].outerHTML
}
str += '<style>html,body,div{height: auto!important;}</style>'
},
loadImage() {
const iframe = window.frames[0]
const imgs = iframe.document.body.getElementsByTagName('img')
console.log(imgs)
return new Promise((resolve) => {
for (let i = 0; i < imgs.length; i++) {
imgs[i].onload = function () {
if (i === imgs.length - 1) {
console.log('img 加载完成')
resolve('img 加载完成')
}
}
}
})
},
},
}
</script>
2、然后在主页全代码
<template>
<div class="hello">
<button @click="handlePrint">下载打印</button>
<div>
<div class="contents" id="print_info">
<table border="0">
<tbody>
<div id="logo" class="logo">
<img src="../assets/logo.png" class="logo" />
</div>
<thead>
<tr>
<th colspan="8" id="title">报告</th>
</tr>
<tr>
<th colspan="8" id="title">TITLE</th>
</tr>
<tr class="right-text">
<th colspan="8" class="right-th">编号(No):312312312312</th>
</tr>
</thead>
</tbody>
<tbody>
<tr>
<td colspan="1">
<p>项目名称</p>
<p>Project Name</p>
</td>
<td colspan="3">
<p>项目</p>
<p>Nigeria KOGI Project</p>
</td>
<td colspan="2">
<p></p>
<p>Standard</p>
</td>
<td colspan="2">
<p>2015</p>
</td>
</tr>
<tr>
<td colspan="1">
<p>单号</p>
<p>Application No</p>
</td>
<td colspan="1">
<p>等级</p>
<p>Level</p>
</td>
<td colspan="1">
<p>单间</p>
<p>Worksheqwewqeop</p>
</td>
<td colspan="1">
<p>仗量</p>
<p>Pour cube</p>
</td>
<td colspan="2">
<p>养护类型</p>
<p>Curing type</p>
</td>
<td colspan="2">
<p>检验批次</p>
<p>Check batch</p>
</td>
</tr>
<tr>
<td colspan="1">
<p>JZ2021001</p>
</td>
<td colspan="1">
<p>C40</p>
</td>
<td colspan="1">
<p>1001/车间名称</p>
</td>
<td colspan="1">
<p>25</p>
</td>
<td colspan="2">
<p>同条件</p>
<p>Same condition</p>
</td>
<td colspan="2">
<p>1/2</p>
</td>
</tr>
<tr>
<td colspan="8" class="result">
<p>实验结果(Mpa)</p>
<p>Experimental result</p>
</td>
</tr>
</tbody>
<tbody v-for="(item, index) in tableList" :key="index">
<tr class="td-title">
<td colspan="2">期限(Age):7d</td>
<td colspan="3">方式(Lab method):测</td>
<td colspan="2">取样部位(Sample):面</td>
<td colspan="1">日期 (Fix date):{{ item.date }}</td>
</tr>
<tr>
<td>
<p>试验时间</p>
<p>Lab date</p>
</td>
<td>
<p>重量(Kg)</p>
<p>Weight</p>
</td>
<td>
<p>长(mm)</p>
<p>Length</p>
</td>
<td>
<p>宽(mm)</p>
<p>Width</p>
</td>
<td>
<p>高(mm)</p>
<p>Height</p>
</td>
<td>
<p>破坏荷载(KN)</p>
<p>Maximu load</p>
</td>
<td>
<p>破坏强度(Mpa)</p>
<p>Compressive Strength</p>
</td>
<td>
<p>强度代表(Mpa)</p>
<p>Cube Strength</p>
</td>
</tr>
<tr>
<td rowspan="3">{{ item.date }}</td>
<td>{{ item.weight }}</td>
<td>{{ item.length }}</td>
<td>{{ item.width }}</td>
<td>{{ item.height }}</td>
<td>{{ item.maximuLoad }}</td>
<td>{{ item.compressiveStrength }}</td>
<td rowspan="3">{{ item.cubeStrength }}</td>
</tr>
<tr>
<td>{{ item.weight2 }}</td>
<td>{{ item.length2 }}</td>
<td>{{ item.width2 }}</td>
<td>{{ item.height2 }}</td>
<td>{{ item.maximuLoad2 }}</td>
<td>{{ item.compressiveStrength2 }}</td>
</tr>
<tr>
<td>{{ item.weight3 }}</td>
<td>{{ item.length3 }}</td>
<td>{{ item.width3 }}</td>
<td>{{ item.height3 }}</td>
<td>{{ item.maximuLoad3 }}</td>
<td>{{ item.compressiveStrength3 }}</td>
</tr>
</tbody>
<tbody>
<tr class="result">
<td colspan="2">
<p>结论</p>
<p>Conclusion</p>
</td>
<td colspan="6">
<p>符合大萨达所</p>
<p>To satisfy requirements of standard</p>
</td>
</tr>
<tr>
<td colspan="4" class="autograph">
<p>代表签字及日期:</p>
<p>Owner Signature and date</p>
</td>
<td colspan="4" class="autograph">
<p>签字及日期:</p>
<p>CBMI Signature and date</p>
</td>
</tr>
</tbody>
</table>
<div class="foot">
<p>Test By:</p>
<p>Date of Report: 2022-06-09</p>
</div>
</div>
<print-view ref="PrintView" />
</div>
</div>
</template>
<script>
import PrintView from './PrintView'
export default {
name: 'HelloWorld',
data() {
return {
show: true,
tableList: [
{
date: '2022-5-8',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 758.1,
compressiveStrength: 33.7,
cubeStrength: 33.9,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 667.9,
compressiveStrength2: 29.7,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 859.5,
compressiveStrength3: 38.2,
},
{
date: '2022-5-29',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-30',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-31',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-31',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-31',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-31',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
{
date: '2022-5-31',
weight: 25,
length: 150,
width: 150,
height: 150,
maximuLoad: 1206,
compressiveStrength: 53.6,
cubeStrength: 51.4,
weight2: 25,
length2: 150,
width2: 150,
height2: 150,
maximuLoad2: 1147.1,
compressiveStrength2: 51,
weight3: 25,
length3: 150,
width3: 150,
height3: 150,
maximuLoad3: 1119,
compressiveStrength3: 49.7,
},
],
}
},
mounted() {},
methods: {
handlePrint() {
const html = document.getElementById('print_info').innerHTML
this.$refs.PrintView.setBodyHtml(html)
},
},
}
</script>
<style scoped>
.contents {
max-width: 900px;
margin: 0px auto;
page-break-inside: avoid;
}
.logo {
width: 245px;
height: 43px;
page-break-inside: avoid;
}
.right-text {
text-align: -webkit-right;
page-break-inside: avoid;
break-before: page;
}
.right-th {
font-size: 14px !important;
page-break-inside: avoid;
break-before: page;
}
.result {
font-size: 16px;
page-break-inside: avoid;
break-before: page;
}
.td-title {
background: #eee;
page-break-inside: avoid;
break-before: page;
}
thead {
page-break-inside: avoid;
break-before: page;
display: contents;
}
.autograph {
text-align: left !important;
padding-left: 10px;
page-break-inside: avoid;
break-before: page;
}
.foot {
display: flex;
align-items: center;
justify-content: space-between;
page-break-inside: avoid;
}
table {
border-collapse: collapse;
border: none;
}
th {
font-size: 20px;
padding: 10px;
page-break-inside: avoid;
break-before: page;
border: none;
}
tbody {
border: none;
page-break-inside: avoid;
break-before: page;
}
tr {
font-size: 14px;
page-break-inside: avoid;
text-align: -webkit-center;
break-before: page;
}
td {
width: 12.5%;
page-break-inside: avoid;
border: 1px solid black;
text-align: center;
page-break-before: auto;
break-before: page;
height: 45px;
}
</style>
这是打印预览的界面,虽然后面有一条横线,但是另存pdf之后是没有的。
请各位赐教,实在找不出其他办法分页不被截断了!!!
|