| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import html2canvas from 'html2canvas';
- import jsPDF from 'jspdf';
- import axios from 'axios'
- import Cookies from 'js-cookie'
- // export const exportPDF = async (elementId, fileName = 'document.pdf') => {
- export const exportPDF = async (element, fileName = 'document.pdf') => {
- // 获取要转换的DOM元素
- // const element = document.getElementById(elementId);
- if (!element) throw new Error('找不到目标元素');
-
- // 获取元素原始尺寸
- const originalWidth = element.scrollWidth;
- console.log(originalWidth,'originalWidth')
- const originalHeight = element.scrollHeight;
- console.log(originalHeight,'originalHeight')
-
- // 设置PDF参数
- const PDF_WIDTH = 210; // A4纸宽(单位:mm)
- const PDF_HEIGHT = 297; // A4纸高
- const PDF_PADDING = 10; // 页面内边距
-
- const pdf = new jsPDF('p', 'mm', 'a4');
-
- // 计算缩放比例
- const scale = PDF_WIDTH / originalWidth;
- console.log(scale,'scale')
- const canvasWidth = originalWidth;
- const canvasHeight = PDF_HEIGHT / scale;
- console.log(canvasHeight,'canvasHeight')
-
- // 计算总页数
- const pageCount = Math.ceil(originalHeight / canvasHeight);
- console.log(pageCount,'pageCount')
-
- // 循环渲染每一页
- for (let i = 0; i < pageCount; i++) {
- if (i > 0) pdf.addPage();
-
- // 计算当前页面的裁剪位置
- const canvas = await html2canvas(element, {
- scale: 2, // 提高分辨率
- scrollY: -window.scrollY,
- useCORS: true, // 开启跨域支持
- allowTaint: true, // 允许加载外部资源
- windowHeight: canvasHeight,
- y: canvasHeight * i,
- height: canvasHeight,
- width: originalWidth
- });
- if (i % 3 === 0) await new Promise(r => setTimeout(r, 200));
-
- // 将Canvas转换为图片
- const imgData = canvas.toDataURL('image/jpeg', 0.95);
-
- // 添加页面
- pdf.addImage(
- imgData,
- 'JPEG',
- PDF_PADDING,
- PDF_PADDING,
- PDF_WIDTH - PDF_PADDING * 2,
- (canvas.height * PDF_WIDTH) / canvas.width - PDF_PADDING * 2
- );
- }
- const pdfBlob = pdf.output('blob');
- const formData = new FormData();
- formData.append('file', pdfBlob, fileName);
- const response = await axios.post(
- `${window.SITE_CONFIG["apiURL"]}/sys/oss/uploadFile`,
- formData,
- {
- headers: {
- 'Content-Type': 'multipart/form-data',
- 'token': Cookies.get('token') || ''
- }
- }
- );
- return response
- // 保存PDF
- // pdf.save(fileName);
- };
|