|
@@ -1,6 +1,8 @@
|
|
import axios from 'axios';
|
|
import axios from 'axios';
|
|
-import dayjs from "dayjs";
|
|
|
|
-
|
|
|
|
|
|
+import dayjs from 'dayjs';
|
|
|
|
+import html2canvas from 'html2canvas';
|
|
|
|
+import JSPDF from 'jspdf';
|
|
|
|
+import { formatDate } from '@/utils/formatTime';
|
|
/**
|
|
/**
|
|
* @description 防抖
|
|
* @description 防抖
|
|
* @param func 功能函数(即要防抖的函数)
|
|
* @param func 功能函数(即要防抖的函数)
|
|
@@ -134,11 +136,11 @@ export function downloadFileByStream(res: any, filename?: string) {
|
|
a.href = URL.createObjectURL(blob);
|
|
a.href = URL.createObjectURL(blob);
|
|
if (!filename) {
|
|
if (!filename) {
|
|
const fileNameStr = res.headers['content-disposition']?.split(';')[2]?.split('filename*=')[1];
|
|
const fileNameStr = res.headers['content-disposition']?.split(';')[2]?.split('filename*=')[1];
|
|
- if(fileNameStr){
|
|
|
|
|
|
+ if (fileNameStr) {
|
|
const index = fileNameStr.lastIndexOf("'");
|
|
const index = fileNameStr.lastIndexOf("'");
|
|
const result = fileNameStr.substring(index + 1, fileNameStr.length);
|
|
const result = fileNameStr.substring(index + 1, fileNameStr.length);
|
|
filename = decodeURIComponent(result);
|
|
filename = decodeURIComponent(result);
|
|
- }else{
|
|
|
|
|
|
+ } else {
|
|
filename = dayjs().format('YYYYMMDDHHmmss'); // 如果没有文件名,则默认取当前时间
|
|
filename = dayjs().format('YYYYMMDDHHmmss'); // 如果没有文件名,则默认取当前时间
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -287,7 +289,7 @@ export function handleRowAccordingToProp(row: { [key: string]: any }, prop: stri
|
|
* @param {String} size 需要分割多少份
|
|
* @param {String} size 需要分割多少份
|
|
* @returns {*}
|
|
* @returns {*}
|
|
* */
|
|
* */
|
|
-export function getNeedArr (array: any[], size: number) {
|
|
|
|
|
|
+export function getNeedArr(array: any[], size: number) {
|
|
//获取所需指定长度分割的数组;参数1为用于分割的总数组,参数2为分割数组后每个小数组的长度
|
|
//获取所需指定长度分割的数组;参数1为用于分割的总数组,参数2为分割数组后每个小数组的长度
|
|
const length = array.length;
|
|
const length = array.length;
|
|
//判断不是数组,或者size没有设置,size小于1,就返回空数组
|
|
//判断不是数组,或者size没有设置,size小于1,就返回空数组
|
|
@@ -307,14 +309,110 @@ export function getNeedArr (array: any[], size: number) {
|
|
}
|
|
}
|
|
//输出新数组
|
|
//输出新数组
|
|
return result;
|
|
return result;
|
|
-};
|
|
|
|
|
|
+}
|
|
/**
|
|
/**
|
|
* @description 判断数组是否在传入的范围内
|
|
* @description 判断数组是否在传入的范围内
|
|
- * @param {number | string} num 传入的数字
|
|
|
|
- * @param {number | string} min 最小数
|
|
|
|
- * @param {number | string} max 最大数
|
|
|
|
|
|
+ * @param {number} num 传入的数字
|
|
|
|
+ * @param {number} min 最小数
|
|
|
|
+ * @param {number} max 最大数
|
|
* @returns {*}
|
|
* @returns {*}
|
|
* */
|
|
* */
|
|
-export function isInRange(num: number | string, min: number | string, max: number | string) {
|
|
|
|
|
|
+export function isInRange(num: number, min: number, max: number) {
|
|
return num >= min && num <= max;
|
|
return num >= min && num <= max;
|
|
-}
|
|
|
|
|
|
+}
|
|
|
|
+/**
|
|
|
|
+ * @description 获取页面导出的pdf文件 默认导出A4大小的文件
|
|
|
|
+ * @param fileName 导出文件名
|
|
|
|
+ * @param className 需要导出的dom的className
|
|
|
|
+ */
|
|
|
|
+export function htmlExportPdf(fileName: string, className:string) {
|
|
|
|
+ return new Promise((resolve) => {
|
|
|
|
+ const title = fileName || `导出文件${formatDate(new Date(), 'YYYYmmddHHMMSS')}`; // 导出文件名,默认为“标题”
|
|
|
|
+ const children:any = document.getElementsByClassName(className|| 'pdf-cell');
|
|
|
|
+ let canvas = <EmptyArrayType>[];
|
|
|
|
+ let i = 0;
|
|
|
|
+ const toCanvas = () => {
|
|
|
|
+ if (children.length) {
|
|
|
|
+ html2canvas(<HTMLElement>children[i], {
|
|
|
|
+ scale: 2,
|
|
|
|
+ }).then((res: any) => {
|
|
|
|
+ // 计算每个dom的高度,方便后面计算分页
|
|
|
|
+ res.imgWidth = 190;
|
|
|
|
+ res.imgHeight = (190 / res.width) * res.height;
|
|
|
|
+ canvas.push(res);
|
|
|
|
+ i++;
|
|
|
|
+ if (canvas.length === children.length) {
|
|
|
|
+ paging();
|
|
|
|
+ toPdf();
|
|
|
|
+ } else {
|
|
|
|
+ toCanvas();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ /**
|
|
|
|
+ * [根据dom的高度初步进行分页,会将canvas组装为一个二维数组]
|
|
|
|
+ */
|
|
|
|
+ const paging = () => {
|
|
|
|
+ const imgArr = <EmptyArrayType>[[]];
|
|
|
|
+ let pageH = 0; // 页面的高度
|
|
|
|
+ let allH = 0; // 当前组所有dom的高度和
|
|
|
|
+ let j = 0;
|
|
|
|
+ for (let k = 0; k < canvas.length; k++) {
|
|
|
|
+ // 涉及到k--的操作,使用for循环方便
|
|
|
|
+ pageH += canvas[k].imgHeight;
|
|
|
|
+ if (pageH > 257 && canvas[k].imgHeight < 257) {
|
|
|
|
+ // 当某个页面装不下下一个dom时,则分页
|
|
|
|
+ imgArr[j][0].allH = allH - canvas[k].imgHeight;
|
|
|
|
+ allH = pageH = 0;
|
|
|
|
+ k--;
|
|
|
|
+ j++;
|
|
|
|
+ imgArr.push([]);
|
|
|
|
+ } else {
|
|
|
|
+ if (canvas[k].imgHeight > 257) {
|
|
|
|
+ // 特殊情况:某个dom高度大于了页面高度,特殊处理
|
|
|
|
+ canvas[k].topH = 257 - (pageH - canvas[k].imgHeight); // 该dom顶部距离页面上方的距离
|
|
|
|
+ pageH = (2 * canvas[k].imgHeight - pageH) % 257;
|
|
|
|
+ canvas[k].pageH = pageH; // 该dom底部距离页面上方的距离
|
|
|
|
+ }
|
|
|
|
+ imgArr[j].push(canvas[k]);
|
|
|
|
+ allH += canvas[k].imgHeight;
|
|
|
|
+ }
|
|
|
|
+ if (k === canvas.length - 1) imgArr[j][0].allH = allH;
|
|
|
|
+ }
|
|
|
|
+ canvas = imgArr;
|
|
|
|
+ };
|
|
|
|
+ /**
|
|
|
|
+ * [生成PDF文件]
|
|
|
|
+ */
|
|
|
|
+ const toPdf = () => {
|
|
|
|
+ const PDF = new JSPDF('p', 'mm', 'a4');
|
|
|
|
+ canvas.forEach((page, index) => {
|
|
|
|
+ let allH = page[0].allH;
|
|
|
|
+ let position = 0; // pdf页面偏移
|
|
|
|
+ if (index !== 0 && allH <= 257) PDF.addPage();
|
|
|
|
+ page.forEach((img: any) => {
|
|
|
|
+ if (img.imgHeight < 257) {
|
|
|
|
+ // 当某个dom高度小于页面宽度,直接添加图片
|
|
|
|
+ PDF.addImage(img.toDataURL('image/jpeg', 1.0), 'JPEG', 10, position + 10, img.imgWidth, img.imgHeight);
|
|
|
|
+ position += img.imgHeight;
|
|
|
|
+ allH -= img.imgHeight;
|
|
|
|
+ } else {
|
|
|
|
+ // 当某个dom高度大于页面宽度,则需另行处理
|
|
|
|
+ while (allH > 0) {
|
|
|
|
+ PDF.addImage(img.toDataURL('image/jpeg', 1.0), 'JPEG', 10, position + 10, img.imgWidth, img.imgHeight);
|
|
|
|
+ allH -= img.topH || 257;
|
|
|
|
+ position -= img.topH || 257;
|
|
|
|
+ img.topH = 0;
|
|
|
|
+ if (allH > 0) PDF.addPage();
|
|
|
|
+ }
|
|
|
|
+ position = img.pageH;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ PDF.save(title + '.pdf');
|
|
|
|
+ resolve([]);
|
|
|
|
+ };
|
|
|
|
+ toCanvas();
|
|
|
|
+ });
|
|
|
|
+}
|