您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
javascript分页打印(非lodop)
发布时间:2024-07-05 23:24:06编辑:雪饮阅读()
-
以前基本lodop来实现JavaScript打印比较多。
但是这次要求是将pdf的内容写在网页上,可以编辑,可以打印。
写到网页上问题不大,可以编辑和打印也是没有问题,可是这次接触的是像一本书一样的pdf,有的17页,有的14页,有的30多页。。。
打印分页虽然有css可以处理,使得可以手动分页,
page-break-after:always;
但是这种css的很不友好,有好多css的布局,例如说是float,flex,over-flow:hidden等都可以使得其作用失效。那么对于布局效率是很大的破坏。
那么我的实现思路就是布局仍旧用现代css布局,打印时候先把每页用JavaScript进行截图,然后将所有截图发送到iframe里面另外一个简单的页面中,处理打印时候的布局
因为最后只是处理简单的图片打印,那么问题就不会很大了。
那么实现如下:
依赖:
import html2Canvas from 'html2canvas';核心打印方法:
async function prtSc(){ const loadingInstance = ElLoading.service({}); var pages=[]; var parentElements = document.querySelectorAll('#NbAllPage'); parentElements.forEach(function(parentElement) { var childElements = parentElement.querySelectorAll('.page'); childElements.forEach(function(childElement) { pages.push(childElement); }); }); var dataUrlList=[]; for(var i in pages){ var element=pages[i]; var rect = element.getBoundingClientRect(); var heightWithBorder = rect.height; var pageScreenShotRes=await html2Canvas(element, { allowTaint: true, useCORS: true, // 提升画面质量,但是会增加文件大小 scale: 2, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面 避雷避雷!!! height: heightWithBorder, windowHeight: element.scrollHeight, }); console.log("pageScreenShotRes",pageScreenShotRes); var dataURL = pageScreenShotRes.toDataURL('image/png'); dataUrlList.push(dataURL); } var message={ type:'canvasDataUrl', data:dataUrlList }; var iframe = document.getElementById('iframePrintContainer'); iframe.contentWindow.postMessage(message, '*'); loadingInstance.close(); return false; }Iframe实现:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>列印</title> <script src="/vue.global.js"></script> <style> *{ padding:0; margin:0; } .page{ margin: 0 auto; padding:0; width: 860px; page-break-after:always; margin-bottom:10px; } .page img{ width: 100%; height:100%; } @media print { .page { /* A4纸张宽度 */ width: 8.27in; /* A4纸张高度 */ height: 11.69in; /* 其他打印样式 */ } } </style> </head> <body> <div id="prints"> <template v-for="(item,index) in dataUrlList"> <div class="page"><img :src="item"/></div> </template> </div> <script> var canvas=localStorage.getItem("canvas"); console.log("收到的canvas",canvas); const { createApp, ref,nextTick } = Vue; const dataUrlList=ref([]); // 监听来自父页面的消息 window.addEventListener('message', function(event) { if (event.origin !== 'http://parent-page-origin.com') { // 应替换为父页面的实际源 // 如果不是预期的源,则忽略消息 //return; } console.log('Received from parent:', event.data); if(event.data.type=="canvasDataUrl"){ dataUrlList.value=event.data.data; nextTick(()=>{ window.print(); }); } }, false); createApp({ setup() { const message = ref('Hello vue!'); setTimeout(function(){ // window.print(); },500); return { message, canvas, dataUrlList } } }).mount('#prints') </script> </body> </html> 效果![]()
关键字词:javscript打印
下一篇:python转pdf为html
相关文章
-
无相关信息