Browse Source

feat: pdf分页 打印table border 线不一致问题

master
taqi be 1 month ago
parent
commit
4bfed9670d
  1. 336
      src/pages/deviceInfo/testPDF.vue

336
src/pages/deviceInfo/testPDF.vue

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
<template>
<div>
<div style="overflow: auto">
<el-button @click="generateAndPrintPDF">打印</el-button>
<div id="printArea" class="report">
<h2 class="title">北京比塔技术服务有限公司</h2>
@ -47,6 +47,134 @@ @@ -47,6 +47,134 @@
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>外观</td>
<td>表面光滑无划伤无明显凹凸不平无污渍腐蚀点及一致均匀无色差</td>
<td></td>
<td>合格</td>
<td></td>
</tr>
<tr>
<!-- rowspan="3" 动态生成 -->
@ -84,114 +212,7 @@ @@ -84,114 +212,7 @@
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<table class="table res-table">
<tr>
<td class="conclusion" rowspan="2">建议结论</td>
<td colspan="4">边缘控制器</td>
</tr>
<tr>
<td class="inspector">检验员</td>
<td class="value">xs</td>
<td class="data">检验日期</td>
<td class="value">2024.12.2</td>
</tr>
</table>
<div class="footer">
<span>电话: 010 - 82736682</span>
<span>地址: 北京市海淀区信息路28号上地信息大厦B座901</span>
@ -216,40 +237,41 @@ async function generateAndPrintPDF() { @@ -216,40 +237,41 @@ async function generateAndPrintPDF() {
const canvas = await html2canvas(printArea, {
scale: window.devicePixelRatio * 2,
})
// Canvas
const canvasWidth = canvas.width
const canvasHeight = canvas.height
// Canvas
const imgData = canvas.toDataURL('image/jpeg', 1.0)
// jsPDF
const pdf = new jsPDF('p', 'mm', 'a4')
const pdfWidth = pdf.internal.pageSize.getWidth() // PDF
const pdfHeight = pdf.internal.pageSize.getHeight() // PDF
const pdfWidth = pdf.internal.pageSize.getWidth()
const pdfHeight = pdf.internal.pageSize.getHeight()
pdf.setFontSize(12)
const headerHeight = 20 // Header
const footerHeight = 20 // Footer
const leftMargin = 15 //
const rightMargin = 15 //
const contentWidth = pdfWidth - leftMargin - rightMargin //
const contentHeight = pdfHeight - headerHeight - footerHeight //
// PDF
const imgHeight = (canvasHeight * pdfWidth) / canvasWidth
const imgHeight = (canvasHeight * contentWidth) / canvasWidth
const PDFInsertTextX = pdfWidth / 2
const PDFInsertTextY = pdfHeight / 2
const PDFInsertFooterTextY = pdfHeight - footerHeight / 2
// PDF
if (imgHeight <= contentHeight) {
pdf.text('Header Title', pdfWidth / 2, headerHeight / 2, { align: 'center' }) // Header
pdf.addImage(imgData, 'JPEG', 0, headerHeight, pdfWidth, imgHeight)
pdf.text('Footer Text', pdfWidth / 2, pdfHeight - footerHeight / 2, {
align: 'center',
}) // Footer
pdf.addImage(imgData, 'JPEG', leftMargin, headerHeight, contentWidth, imgHeight)
} else {
//
let position = 0 //
let page = 1 //
while (position < canvasHeight) {
const pageCanvas = document.createElement('canvas')
pageCanvas.width = canvasWidth
pageCanvas.height = (contentHeight * canvasWidth) / pdfWidth
pageCanvas.height = (contentHeight * canvasWidth) / contentWidth
const pageCtx = pageCanvas.getContext('2d')
pageCtx?.drawImage(
@ -266,14 +288,18 @@ async function generateAndPrintPDF() { @@ -266,14 +288,18 @@ async function generateAndPrintPDF() {
const pageImgData = pageCanvas.toDataURL('image/jpeg', 1.0)
// Header
pdf.text(' ', pdfWidth / 2, headerHeight / 2, { align: 'center' })
// PDF
pdf.addImage(pageImgData, 'JPEG', 0, headerHeight, pdfWidth, contentHeight)
// PDF
pdf.addImage(
pageImgData,
'JPEG',
leftMargin,
headerHeight,
contentWidth,
contentHeight
)
// Footer
pdf.text(' ', pdfWidth / 2, pdfHeight - footerHeight / 2, {
pdf.text(`${page}`, PDFInsertTextX, PDFInsertFooterTextY, {
align: 'center',
})
@ -281,6 +307,7 @@ async function generateAndPrintPDF() { @@ -281,6 +307,7 @@ async function generateAndPrintPDF() {
//
if (position < canvasHeight) {
page += 1
pdf.addPage()
}
}
@ -321,20 +348,23 @@ async function generateAndPrintPDF() { @@ -321,20 +348,23 @@ async function generateAndPrintPDF() {
height: 60px;
line-height: 60px;
text-align: center;
border: 1px solid #000;
border: 2px solid #000;
border-bottom: none;
}
table {
}
.table {
width: 100%;
border-collapse: collapse;
border-collapse: separate;
border-spacing: 0;
border: 1px solid black;
thead,
tbody {
th,
td {
border: 1px solid #000;
padding: 12px 18px;
border: 1px solid #000 !important;
padding: 12px 18px !important;
text-align: center;
box-sizing: border-box;
}
@ -343,7 +373,7 @@ async function generateAndPrintPDF() { @@ -343,7 +373,7 @@ async function generateAndPrintPDF() {
.result {
text-align: center;
border: 1px solid #000;
border: 2px solid #000;
border-top: none;
border-bottom: none;
height: 50px;
@ -352,27 +382,14 @@ async function generateAndPrintPDF() { @@ -352,27 +382,14 @@ async function generateAndPrintPDF() {
}
.result-table {
width: 100%;
border-collapse: collapse;
thead,
tbody {
th,
td {
border: 1px solid #000;
padding: 12px 18px;
text-align: center;
box-sizing: border-box;
}
}
border-bottom: none;
tr {
.index {
min-width: 40px;
min-width: 80px;
}
.project {
min-width: 80px;
min-width: 120px;
}
.content {
@ -380,11 +397,11 @@ async function generateAndPrintPDF() { @@ -380,11 +397,11 @@ async function generateAndPrintPDF() {
}
.consequence {
min-width: 40px;
min-width: 80px;
}
.decide {
min-width: 40px;
min-width: 80px;
}
.remark {
@ -394,20 +411,9 @@ async function generateAndPrintPDF() { @@ -394,20 +411,9 @@ async function generateAndPrintPDF() {
}
.res-table {
width: 100%;
border-collapse: collapse;
thead,
tbody {
td {
border: 1px solid #000;
padding: 12px 18px;
text-align: center;
}
}
border-top: none;
.conclusion {
width: 63px;
width: 80px;
font-weight: bold;
}

Loading…
Cancel
Save