本教程操作环境:Windows10系统、react18版、Dell G3电脑。
react打印样式丢失怎么办?
(相关资料图)
vue print打印div样式丢失 (react通用)
使用网上的print.js插件,打印发现样式丢失。
解决方案 > 将html转成pdf,再打印pdf
使用jspdf将需要打印的div转成pdf(转成的pdf样式不会丢失,因为pdf.js是将div转成canvas)
安装jspdf
npm install --save html2canvas
登录后复制
npm install jspdf --save
登录后复制
上代码
utli.js 直接复制,注意outPutPdf方法入参即可
import html2canvas from "html2canvas";import jsPDF from "jspdf";// base64转blobexport function toBlob(base64Data) { let byteString = base64Data if (base64Data.split(",")[0].indexOf("base64") >= 0) { byteString = atob(base64Data.split(",")[1]); // base64 解码 } else { byteString = unescape(base64Data.split(",")[1]); } // 获取文件类型 const mimeString = base64Data.split(";")[0].split(":")[1]; // mime类型 // ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区 // let arrayBuffer = new ArrayBuffer(byteString.length) // 创建缓冲数组 // let uintArr = new Uint8Array(arrayBuffer) // 创建视图 const uintArr = new Uint8Array(byteString.length); // 创建视图 for (let i = 0; i < byteString.length; i += 1) { uintArr[i] = byteString.charCodeAt(i); } // 生成blob const blob = new Blob([uintArr], { type: mimeString }) // 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上 return blob;};/** * 输出pdf * @param {*} idName html元素 * @param {*} pdfName 输出pdf文件名 * @param {*} isDownload 是否直接下载 * @param {*} isPrint 是否直接打印 * @param {*} callback 执行后的回调 */ export function outPutPdf(idName, pdfName, isDownload = false, isPrint = false, callback) { const element = document.getElementById(idName); // 这个dom元素是要导出的pdf的div容器 const w = element.offsetWidth; // 获得该容器的宽 const h = element.offsetHeight; // 获得该容器的高 const offsetTop = element.offsetTop; // 获得该容器到文档顶部的距离 const offsetLeft = element.offsetLeft; // 获得该容器到文档最左的距离 const canvas = document.createElement("canvas"); let abs = 0; const winI = document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条) const winO = window.innerWidth; // 获得当前窗口的宽度(包含滚动条) if (winO > winI) { abs = (winO - winI) / 2; // 获得滚动条宽度的一半 } canvas.width = w * 2; // 将画布宽&&高放大两倍 canvas.height = h * 2; const context = canvas.getContext("2d"); context.scale(2, 2); context.translate(-offsetLeft - abs, -offsetTop); // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此translate的时候,要把这个差值去掉 html2canvas(element, { useCORS: true, // 允许加载跨域的图片 allowTaint: true, scale: 2 // 提升画面质量,但是会增加文件大小 }).then(cs => { const contentWidth = cs.width; const contentHeight = cs.height; // 一页pdf显示html页面生成的canvas高度 const pageHeight = contentWidth / 592.28 * 841.89; // 未生成pdf的html页面高度 let leftHeight = contentHeight; // 页面偏移 let position = 0; // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高 const imgWidth = 595.28; const imgHeight = 592.28 / contentWidth * contentHeight; const pageDate = cs.toDataURL("image/jpeg", 1.0); const pdf = new jsPDF("", "pt", "a4"); // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面的高度(841.89) // 当内容未超过pdf一页显示的范围,无需分页 if (leftHeight < pageHeight) { pdf.addImage(pageDate, "JPEG", 0, position, imgWidth, imgHeight); } else { // 分页 while (leftHeight > 0) { pdf.addImage(pageDate, "JPEG", 0, position, imgWidth, imgHeight) leftHeight -= pageHeight; position -= 841.89; // 避免添加空白页 if (leftHeight > 0) { pdf.addPage() } } } if (isDownload) { pdf.save(`${pdfName}.pdf`); } if (isPrint) { const link = window.URL.createObjectURL(toBlob(pdf.output("datauristring"))); const myWindow = window.open(link); myWindow.print(); } callback && callback(pdf); })}
登录后复制
需要打印部分
登录后复制
vue 全部代码
入库单 打印报表 入库单 {{ viewInfo.accessNumber }} {{ viewInfo.supplier }} {{ viewInfo.accessDate && $moment(viewInfo.accessDate).format("YYYY-MM-DD HH:mm:ss") }} {{ viewInfo.warehouse }} {{ viewInfo.source }} {{ viewInfo.handledBy }} {{ viewInfo.purchaseOrderNo }} {{ viewInfo.invoiceNo }} {{ viewInfo.contractNo }} {{ viewInfo.accessType }} {{ viewInfo.addTime }} {{ viewInfo.content }} 取消 <script>import { outPutPdf } from "@/utils/util";import { getStorageOrderTopDetail, getStorageOrderBottomListNoPage } from "@/api/stock";export default { name: "StockStorageOrderViewModal", components: {}, data() { return { visible: false, form: null, title: "出库确认", loading: false, viewInfo: {}, columns: [ { title: "序号", key: "index", customRender: (text, render, index) => { return index + 1 }, align: "center" }, { title: "产品编号", key: "productNumber", dataIndex: "productNumber" }, { title: "类别", key: "type", dataIndex: "type" }, { title: "产品名称", key: "productName", dataIndex: "productName" }, { title: "规格型号", dataIndex: "specifications", dataIndex: "specifications" }, { title: "计量单位", key: "unit", dataIndex: "unit" }, { title: "批次", key: "batch", dataIndex: "batch" }, { title: "数量", key: "number", dataIndex: "number" }, { title: "单价", key: "price", dataIndex: "price" }, { title: "金额", key: "total", dataIndex: "total" }, { title: "已入库", key: "inbound", dataIndex: "inbound" }, { title: "未入库", key: "notInbound", dataIndex: "notInbound" } ], data: [], pdfing: false, // 打印中 }; }, methods: { // 显示弹框 show(id) { this.visible = true; // 获取上方数据 getStorageOrderTopDetail({ id }).then(res => { if (res.code === 0) { this.viewInfo = res.data; } }); // 获取下方表格数据 this.getTableData(id); }, /** * 关闭弹框 */ close() { this.visible = false; this.$emit("cancel"); }, // 获取表格数据 getTableData(warehouseRegisterId) { const params = { warehouseRegisterId }; getStorageOrderBottomListNoPage(params).then(res => { this.loading = false; if (res.code === 0) { this.data = res.data; } else { this.$common.showErrorMessage(res.msg || "请求出现错误,请稍后再试"); } }); }, // 打印 printChart() { this.pdfing = true; this.$nextTick(() => { outPutPdf("printDiv", "入库单", false, true, () => { this.pdfing = false; }); }); } }};</script>
登录后复制
推荐学习:《react视频教程》
以上就是react打印样式丢失怎么办的详细内容,更多请关注php中文网其它相关文章!