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

Loading…
Cancel
Save