
结果:


业务:将页面右侧的table打印成想要的格式的pdf,首先遇到的问题是table表上下左右都有滚轮而html2canvas相当于屏幕截图,那滚动区域如何显示出来是个问题?
gif有点模糊,但是大致功能可以看出
参考文章:主要思路就是table既然原始高度宽度不对,那你在转pdf之前就把他的宽度高度还原成真实的高度宽度然后打印成pdf,最后再转成原始高度宽度。(值得注意的是画布的高度宽度也要设置,和table一样就行)

html代码:

script代码
table表上有个“导出按钮”,点击就会触发handleExport函数



全部代码:
html:
- <div
- ref="myContainer"
- id="fatherDiv"
- class="demo-form-inline"
- style="height: calc(100% - 120px)"
- >
- <el-table
- ref="workforceTable"
- :data="tableData"
- border
- @drop.native="drop($event)"
- @dragover.native="allowDrop($event)"
- stripe
- :span-method="objectSpanMethod"
- :cell-class-name="tableCellClassName"
- max-height="100%"
- height="100%"
- class="demo-form-inline"
- id="factTable"
- >
- <el-table-column
- prop="time"
- label="时间"
- width="70"
- align="center"
- fixed
- >el-table-column>
- <el-table-column
- :prop="item.sectorCode"
- :label="item.sectorName"
- v-for="item in sectorList"
- :key="item.sectorCode"
- align="center"
- >
- <el-table-column
- :prop="seat.seatId"
- :label="seat.seatName"
- v-for="seat in item.seatList"
- :key="seat.seatId"
- align="center"
- min-width="102px"
- >
- <template slot-scope="scope">
- <span
- :defProp="seat.seatId"
- :defTime="scope.row.time"
- :defIndex="scope.$index"
- >span>
- <span
- class="el-tag el-tag--light"
- defid="scope.row[seat.seatId]"
- v-if="scope.row[seat.seatId]"
- >
-
-
-
- {{ scope.row[seat.seatId] }}
- <i
- class="el-tag__close el-icon-close"
- @click="onRemovePerson(scope.$index, seat.seatId)"
- v-if="isManual"
- >i>
- span>
- template>
- el-table-column>
- el-table-column>
-
- <el-table-column
- :prop="seat.seatId"
- :label="seat.seatName"
- v-for="seat in seatList"
- :key="seat.seatId"
- align="center"
- min-width="102px"
- >
- <template slot-scope="scope">
- <span
- :defProp="seat.seatId"
- :defTime="scope.row.time"
- :defIndex="scope.$index"
- >span>
- <span
- class="el-tag el-tag--light"
- defid="scope.row[seat.seatId]"
- v-if="scope.row[seat.seatId]"
- >
-
-
-
- {{ scope.row[seat.seatId] }}
- <i
- class="el-tag__close el-icon-close"
- @click="onRemovePerson(scope.$index, seat.seatId)"
- v-if="isManual"
- >i>
- span>
- template>
- el-table-column>
- el-table>
- div>
script代码:
- handleExport() {
- this.$nextTick(() => {
- let pdfName =
- (this.deptRegion == "TWR"
- ? "塔台"
- : this.deptRegion == "APP"
- ? "进近"
- : "区域") +
- "管制室" +
- this.$common.parseTime(this.selectedMonth, "{y}/{m}/{d}") +
- "日排班表";
- document
- .getElementsByClassName("demo-form-inline")[0]
- .classList.add("export-pdf-style");
- this.generatePDF(this.$refs.myContainer, pdfName);
- });
- },
- generatePDF(el, name) {
- let bodyWrapper = document.querySelector(
- "#factTable .el-table__body-wrapper"
- );
- let headerNode = document.querySelector(
- "#factTable .el-table__header-wrapper"
- );
- bodyWrapper.style.height = `${bodyWrapper.scrollHeight}px`;
- document.getElementById("fatherDiv").style.width = `${bodyWrapper.scrollWidth}px`;
- document.getElementById("fatherDiv").style.height = `${bodyWrapper.scrollHeight + headerNode.scrollHeight不}px`;
- setTimeout(function () {
- html2canvas(el, {
- scale: 4,
- width: bodyWrapper.scrollWidth + 60, // 为了使横向滚动条的内容全部展示,这里必须指定!!
- height: bodyWrapper.scrollHeight + headerNode.scrollHeight ,
- }).then((canvas) => {
- let contentWidth = canvas.width;
- let contentHeight = canvas.height;
- let pageHeight = (contentWidth / 592.28) * 841.89; //一页pdf显示html页面生成的canvas高度;
- let leftHeight = contentHeight; //未生成pdf的html页面高度
- let position = 0; //页面偏移
- let imgWidth = 595.28; //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
- let imgHeight = (592.28 / contentWidth) * contentHeight;
- let pageData = canvas.toDataURL("image/jpeg", 1.0);
- let pdf = new jsPDF("", "pt", "a4");
- if (leftHeight < pageHeight) { //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
- pdf.addImage(pageData, "JPEG", 5, 30, imgWidth, imgHeight); //当内容未超过pdf一页显示的范围,无需分页
- } else {
- while (leftHeight > 0) {
- pdf.addImage(pageData, "JPEG", 5, position, imgWidth, imgHeight); //arg3-->距离左边距;arg4-->距离上边距;arg5-->宽度;arg6-->高度
- leftHeight -= pageHeight;
- position -= 841.89;
- if (leftHeight > 0) { //避免添加空白页
- pdf.addPage(); //添加新页
- }
- }
- }
- pdf.save(`${name}.pdf`);
- document.getElementById("fatherDiv").style.width = `${100}%`;
- document.getElementById("fatherDiv").style.height = `calc(100% - 120px)`;
- document.getElementsByClassName("demo-form-inline")[0].classList.remove("export-pdf-style");
- });
- }, 200);
- },
css代码:
- .export-pdf-style >>> .el-table ,
- .export-pdf-style >>> .el-tag{
- background: white !important;
- color: black !important;
- }
-
- .export-pdf-style >>> .el-table th,
- .export-pdf-style >>> .el-table .el-table__cell {
- color: black;
- border: 1px solid black;
- background: white !important;
- }