myprint-design
Version:
操作简单,组件丰富的一站式打印解决方案打印设计器
1 lines • 8.73 kB
Source Map (JSON)
{"version":3,"file":"pdfUtil.mjs","sources":["../../../../src/utils/pdfUtil.ts"],"sourcesContent":["import html2canvas from 'html2canvas';\nimport JsPDF from 'jspdf';\nimport { unit2unit } from '@myprint/design/utils/devicePixelRatio';\n\nlet defaultOptions = {\n name: new Date().getTime(),\n scale: window.devicePixelRatio,\n padding: 0,\n useCORS: true,\n logging: true,\n dpi: 144, // 设置dpi,会使图片高清一些\n width: -1,\n height: -1\n // allowTaint: true\n};\n\nexport function chrome2Img(pageDomList: any, options: any) {\n return new Promise<Blob[]>((resolve, _reject) => {\n defaultOptions.width = options.width;\n defaultOptions.height = options.height;\n const imageMap: Record<number, Blob> = {};\n const imageList: Blob[] = [];\n let count = 0;\n for (let i = 0; i < pageDomList.length; i++) {\n let pageDom = pageDomList[i] as HTMLDivElement;\n // console.log(pageDom)\n // pageDom.style.display = 'block';\n // 忽略无用节点(主要是这个)\n // @ts-ignore\n // defaultOptions.ignoreElements = e => {\n // if (\n // e.contains(pageDom) ||\n // pageDom.contains(e) ||\n // e.tagName === 'STYLE' ||\n // e.tagName === 'LINK' ||\n // e.getAttribute('data-html2canvas') != null // header里面的样式不能筛掉\n // ) {\n // console.log(e);\n // return false;\n // }\n // // console.log(e.tagName);\n // return true;\n // };\n requestAnimationFrame(() => {\n html2canvas(pageDom, defaultOptions)\n .then(canvas => {\n canvas.toBlob((blob: Blob) => {\n count++;\n imageMap[i] = blob;\n if (count == pageDomList.length) {\n for (let j = 0; j < count; j++) {\n imageList.push(imageMap[j]);\n }\n // imgListCallback(imageList);\n resolve(imageList);\n }\n }, 'image/jpeg', 1.0);\n });\n });\n\n // 生成的画布元素宽高(需要收缩回原比例大小)\n // console.log(canvas.width, canvas.height)\n // console.log(options.scale)\n // let canvasWidth = canvas.width / defaultOptions.scale;\n // let canvasHeight = canvas.height / defaultOptions.scale;\n // console.log(canvasWidth, canvasHeight);\n\n // 页面等比例缩放后宽高\n // let pageWidth = a4Width;\n // let pageHeight = (a4Width / canvasWidth) * canvasHeight;\n\n\n //返回图片dataURL,参数:图片格式和清晰度(0-1)\n // let jpeg = canvas.toDataURL();\n // console.log(canvasHeight, options.height)\n // let img = document.createElement(\"img\");\n // img.src = jpeg\n // img.style.zIndex = 99999\n // document.body.append(img)\n\n //方向默认竖直,尺寸ponits,格式a4[595.28,841.89]\n\n //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)\n //当内容未超过pdf一页显示的范围,无需分页\n // doc.addImage(jpeg, 'JPEG', 0, 0, canvasWidth, canvasHeight); // 从图片顶部开始打印\n\n // doc.addImage(jpeg, 'JPEG', 0, 0, canvasWidth, canvasHeight); // 从图片顶部开始打印\n\n // doc.output('dataurlnewwindow');\n // doc.save(options.name + '.pdf');\n\n // if (i + 1 < pageDomList.length) {\n // doc.addPage();\n // }\n }\n\n // const blob = doc.output('blob');\n // window.open(URL.createObjectURL(blob));\n });\n\n}\n\n/**\n * 单页打印\n * @param pageDomList\n * @param options\n */\nexport async function toPdf(pageDomList: any, options: any) {\n let w = unit2unit('px', 'cm', options.width);\n let h = unit2unit('px', 'cm', options.height);\n let doc = new JsPDF(undefined, 'cm', [w, h]);\n defaultOptions.width = options.width;\n defaultOptions.height = options.height;\n // console.log(pageDomList);\n for (let i = 0; i < pageDomList.length; i++) {\n let pageDom = pageDomList[i];\n // console.log(pageDom)\n const canvas = await html2canvas(pageDom, defaultOptions);\n // 生成的画布元素宽高(需要收缩回原比例大小)\n // console.log(canvas.width, canvas.height)\n // console.log(options.scale)\n // let canvasWidth = canvas.width / defaultOptions.scale;\n // let canvasHeight = canvas.height / defaultOptions.scale;\n // console.log(canvasWidth, canvasHeight);\n\n // 页面等比例缩放后宽高\n // let pageWidth = a4Width;\n // let pageHeight = (a4Width / canvasWidth) * canvasHeight;\n\n\n //返回图片dataURL,参数:图片格式和清晰度(0-1)\n let jpeg = canvas.toDataURL('image/jpeg', 1.0);\n // console.log(jpeg);\n // canvas.toBlob(blob1 => {\n // console.log(URL.createObjectURL(blob1));\n // })\n // console.log(canvasHeight, options.height)\n // let img = document.createElement(\"img\");\n // img.src = jpeg\n // img.style.zIndex = 99999\n // document.body.append(img)\n\n //方向默认竖直,尺寸ponits,格式a4[595.28,841.89]\n\n //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)\n //当内容未超过pdf一页显示的范围,无需分页\n // doc.addImage(jpeg, 'JPEG', 0, 0, canvasWidth, canvasHeight); // 从图片顶部开始打印\n // console.log(canvasWidth, canvasHeight);\n doc.addImage(jpeg, 'JPEG', 0, 0, w, h); // 从图片顶部开始打印\n\n // doc.output('dataurlnewwindow');\n // doc.save(options.name + '.pdf');\n\n if (i + 1 < pageDomList.length) {\n doc.addPage();\n }\n }\n\n return doc.output('blob');\n // window.open(URL.createObjectURL(blob));\n}\n"],"names":[],"mappings":"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"}