60 lines
2.0 KiB
JavaScript
60 lines
2.0 KiB
JavaScript
|
|
import html2canvas from 'html2canvas';
|
|||
|
|
import jsPDF from 'jspdf';
|
|||
|
|
import caseApi from "@/api/lawenforcement/Case.js";
|
|||
|
|
import {ElMessage} from "element-plus";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 用Vue组件设计HTML模板
|
|||
|
|
* 将HTML转换为Canvas
|
|||
|
|
* 将Canvas插入PDF并下载
|
|||
|
|
* @param pdfTemplate 导出区域div ref
|
|||
|
|
* @param fileName 导出的pdf文件名
|
|||
|
|
* @returns {Promise<void>}
|
|||
|
|
*/
|
|||
|
|
const exportPDF = async (pdfTemplate,fileName) => {
|
|||
|
|
try {
|
|||
|
|
const element = pdfTemplate.value;
|
|||
|
|
const canvas = await html2canvas(element, { scale: 2, onclone: (clonedDoc) => {
|
|||
|
|
clonedDoc.querySelectorAll('*').forEach(el => {
|
|||
|
|
el.style.transform = 'translateZ(0)'; // 强制 GPU 渲染
|
|||
|
|
});
|
|||
|
|
} }); // 提高分辨率
|
|||
|
|
const imgData = canvas.toDataURL('image/jpeg', 0.8);
|
|||
|
|
|
|||
|
|
const pdf = new jsPDF('p', 'mm', 'a4');
|
|||
|
|
const pageWidth = pdf.internal.pageSize.getWidth();
|
|||
|
|
const pageHeight = pdf.internal.pageSize.getHeight();
|
|||
|
|
const imgRatio = canvas.width / canvas.height;
|
|||
|
|
const imgHeight = pageWidth / imgRatio;
|
|||
|
|
|
|||
|
|
// 添加图片到PDF(自动分页)
|
|||
|
|
let heightLeft = imgHeight;
|
|||
|
|
let position = 0;
|
|||
|
|
|
|||
|
|
pdf.addImage(imgData, 'JPEG', 0, position, pageWidth, imgHeight);
|
|||
|
|
heightLeft -= pageHeight;
|
|||
|
|
|
|||
|
|
while (heightLeft >= 0) {
|
|||
|
|
position = heightLeft - imgHeight;
|
|||
|
|
pdf.addPage();
|
|||
|
|
pdf.addImage(imgData, 'JPEG', 0, position, pageWidth, imgHeight);
|
|||
|
|
heightLeft -= pageHeight;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 返回 Promise 包装的导出结果
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
try {
|
|||
|
|
pdf.save(fileName);
|
|||
|
|
// 假设浏览器在 500ms 内触发下载(根据实际情况调整时间)
|
|||
|
|
setTimeout(() => {
|
|||
|
|
resolve({ success: true, message: 'PDF导出成功!' });
|
|||
|
|
}, 500);
|
|||
|
|
} catch (error) {
|
|||
|
|
reject({ success: false, message: '导出失败:' + error.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
return Promise.reject({ success: false, message: '生成PDF出错:' + error.message });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
export { exportPDF }
|