前端js实现把网页导出为pdf
创始人
2024-12-26 17:09:28
0次

前段时间遇到一个需求,产品说需要把当前页面,点击导出按钮,导出为pdf,所以就有了以下代码:
部分来自于官方直连GPT4o

import $ from "jquery"; import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'  export default {     data () {         return {}     },     mounted() {              },     methods: {         formatterPdfElement($dom) {             var $copyElement = $dom.cloneNode(true);             document.querySelector('.export-preview-container').appendChild($copyElement);             this.visiblePreview = true;             this.$nextTick(() => {                 var results = [{                     position: 0,                     height: 0                 }];                 var pageOffsetTop = $copyElement.offsetTop;                 var pageOffsetWidth = $copyElement.offsetWidth;                 // var $unitElements = $($copyElement).find('.minimum-unit'); // 遍历所有子元素不可取,应只遍历第一层子元素                 var $unitElements = $($copyElement).children(); // 遍历所有子元素不可取,应只遍历第一层子元素                 var perPageHeight = pageOffsetWidth / 595.28 * 841.89;                 let tHeight = perPageHeight;                 let insertList = [];                 $unitElements.each((index, $element) => {                     console.log(tHeight, 'tHeight');                     console.log($($element), $($element).outerHeight(true));                     tHeight -= $($element).outerHeight(true);                     if (tHeight < 0) {                         let remainHeight = parseInt(tHeight + $($element).outerHeight(true) + 30);                         tHeight = perPageHeight - $($element).outerHeight(true);                         let obj = {index, remainHeight};                         insertList.push(obj);                     }                 });                 insertList.forEach((dif, index) => {                     let remHeight = dif.remainHeight;                     let domObj = document.createElement("div");                     domObj.innerHTML = "";                     domObj.setAttribute("style", `width:100%;height:${remHeight}px`)                     console.log('$unitElements[dif.index] :>> ', $unitElements[dif.index]);                     $unitElements[dif.index].before(domObj);                 })                 console.log($copyElement, "241");                 // return                  var pdf = new jsPDF('', 'pt', 'a4');                 html2canvas($copyElement, {                     useCORS: true,                     scale: 2,                     allowTaint: true,                     background: '#f0f4f7',                     ignoreElements: (element) => {                         if (element.className.indexOf('top-btns') > -1) {                             return true;                         }                         return false;                     }                 }).then(canvas => {                     var contentWidth = canvas.width;                     var contentHeight = canvas.height;                     var pageHeight = contentWidth / 592.28 * 841.89;                     var leftHeight = contentHeight;                     var position = 0;                     var imgWidth = 592.28;                     var imgHeight = 592.28 / contentWidth * contentHeight;                     if (leftHeight < pageHeight) {                         pdf.addImage(canvas.toDataURL('image/jpeg', 1), 'JPEG', 0, position, imgWidth, imgHeight)                     } else {                         while (leftHeight > 0) {                             pdf.addImage(canvas.toDataURL('image/jpeg', 1), 'JPEG', 0, position, imgWidth, imgHeight);                             leftHeight -= pageHeight;                             position -= 841.89;                             if (leftHeight > 0) {                                 pdf.addPage();                             }                         }                     }                 }).then(() => {                     const name = `${this.reportInfo.devPath}-${this.reportInfo.startDtm}~${this.reportInfo.endDtm}`;                     pdf.internal.scaleFactor = 1.33;                     pdf.save(`${name}.pdf`);                     this.isExporting = false;                     this.visiblePreview = false;                 });             })         },         exportReport() {             var content = document.querySelector('.mian-box-contain');             this.formatterPdfElement(content);         },         /*         *  导出pdf函数         **/         exportReportPdf() {             window.open(this.newUrl)         }     }, }  

相关内容

热门资讯

研究成果开挂!红拐弯开挂多功能... 研究成果开挂!红拐弯开挂多功能AI教程,红拐弯原来有开挂教程红拐弯辅助器是一种具有地方特色的麻将游戏...
研究成果透视器!领悟棋牌透视器... 研究成果透视器!领悟棋牌透视器多功能AI教程,领悟棋牌一直真的有透视器教程1、下载好领悟棋牌正确养号...
揭秘真相辅助器!战皇辅助器多功... 揭秘真相辅助器!战皇辅助器多功能AI技巧,战皇一贯真的有辅助器技巧进入游戏-大厅左侧-新手福利-激活...
必看攻略辅助!红拐弯辅助多功能... 必看攻略辅助!红拐弯辅助多功能AI教程,红拐弯一贯真的有辅助教程1、每一步都需要思考,不同水平的挑战...
重大通报透视器!半岛透视器多功... 重大通报透视器!半岛透视器多功能AI工具,半岛竟然存在有透视器工具1)半岛免费钻石:进一步探索半岛免...
玩家必备教程开挂!富友茶苑开挂... 玩家必备教程开挂!富友茶苑开挂多功能AI脚本,富友茶苑竟然真的有开挂脚本富友茶苑破解侠是真的助透视。...
玩家必看科普辅助!冰球突破辅助... 玩家必看科普辅助!冰球突破辅助多功能AI插件,冰球突破总是有辅助插件1、上手简单,内置详细流程视频教...
一分钟揭秘外挂!皮皮衡阳字牌外... 一分钟揭秘外挂!皮皮衡阳字牌外挂多功能AI方法,皮皮衡阳字牌切实有外挂方法1、任何皮皮衡阳字牌透视是...
推荐攻略透视器!九九麻将透视器... 推荐攻略透视器!九九麻将透视器多功能AIapp,九九麻将原来是真的有透视器app1、九九麻将辅助软件...
一分钟了解开挂!鸿福休闲开挂多... 一分钟了解开挂!鸿福休闲开挂多功能AI教程,鸿福休闲原来存在有开挂教程1、鸿福休闲免费辅助多个强度级...