当前位置: 首页 > news >正文

vue项目使用html2canvas和jspdf将页面导出成PDF文件

一、需求:

页面上某一部分内容需要生成pdf并下载

二、技术方案:

使用html2canvas和jsPDF插件
 

三、js代码

// 页面导出为pdf格式
import html2Canvas from "html2canvas";
import jsPDF from "jspdf";
import { uploadImg } from '@/api/public';const htmlToPdf = {getPdf(title, id) {html2Canvas(document.querySelector(id), {allowTaint: false,taintTest: false,logging: false,useCORS: true,dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍scale: 4, //按比例增加分辨率}).then((canvas) => {var pdf = new jsPDF("p", "mm", "a4"); //A4纸,纵向var ctx = canvas.getContext("2d"),a4w = 190,a4h = 272, //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度renderedHeight = 0;while (renderedHeight < canvas.height) {var page = document.createElement("canvas");page.width = canvas.width;page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页//用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext("2d").putImageData(ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight, canvas.height - renderedHeight)),0,0);pdf.addImage(page.toDataURL("image/jpeg", 1.0),"JPEG",10,10,a4w,Math.min(a4h, (a4w * page.height) / page.width)); //添加图像到页面,保留10mm边距renderedHeight += imgHeight;if (renderedHeight < canvas.height) {pdf.addPage(); //如果后面还有内容,添加一个空页}// delete page;}console.log(pdf)// pdf.save(title + ".pdf"); // PDF.save() 此方法可以将pdf直接保存本地let pdfData = pdf.output('datauristring') // 获取base64Pdflet files = dataURLtoFile(pdfData, '封面.pdf') // 将base64文件转化为流,上传ossuploadFiles(files)});},
};function dataURLtoFile(dataurl, filename) {let arr = dataurl.split(',')let mime = arr[0].match(/:(.*?);/)[1]let bstr = atob(arr[1])let n = bstr.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new File([u8arr], filename, { type: mime })
}function uploadFiles(files) {let data = new FormData()data.append('file', files)uploadImg(data).then(res => {console.log(res)if (res.data.code == 0) {// formData.value.qrcode = res.data.data.res.url}})
}export default htmlToPdf;

四、使用步骤:

1. 使用之前需要先按照2个npm包

npm install html2canvas -S --registry=https://registry.npmmirror.com/
npm install jspdf -S --registry=https://registry.npmmirror.com/

2. 在页面引用

import htmlToPdf from "@/utils/htmlToPDF";

3. 调用方法

const printReport = () => {
    htmlToPdf.getPdf('测试pdf',"#db-test-report");
}

4. 记得给指定容器加id

五:注意事项:

1. 如果要打印的内容是iframe里面的,因为无法直接拿到dom元素,需要跟iframe通讯,拿到dom元素,放到当前页面;如果样式没带过来,特殊处理一下

const iframe = document.getElementById("myIframe");
// 向iframe发送消息
iframe.contentWindow.postMessage("getElement", tooltipUrl.value);// 收到iframe的回复才能生成pdf
window.addEventListener("message", function (e) {console.log("iframe回复的消息");console.log(e);if (e.origin === iframeOrigin.value && e.data.type === "element") {// 处理获取到的元素var container = document.getElementById("pdf-iframe");container.innerHTML = e.data.html;hasIframePdf = truegetPdf("xxx下载", "#pdf-xxx-xxx");}
});


http://www.mrgr.cn/news/98249.html

相关文章:

  • Restful风格接口开发
  • C语言斐波那契数列的多样实现
  • OpenHarmony5.0.2 USB摄像头适配
  • Java面向对象核心:多态、抽象类与接口实战解析
  • 基于51单片机的正负5V数字电压表( proteus仿真+程序+设计报告+讲解视频)
  • c语言 open函数
  • C语言中冒泡排序和快速排序的区别
  • 02核心-EffectSpec,EffectContext
  • Excel表格文件分组归并——通过sql
  • Sklearn入门之datasets的基本用法
  • Android Studio 在 Windows 上的完整安装与使用指南
  • 八大定位UI
  • 从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发(含Open-TeleVision源码解析)
  • 【HD-RK3576-PI】系统更新与恢复
  • CSI-PVController-claimWorker
  • Linux上位机开发实践(OpenCV算法硬件加速)
  • 【redis进阶三】分布式系统之主从复制结构(1)
  • 【复旦微FM33 MCU 底层开发指南】高级定时器ATIM
  • NoSQL入门指南:Redis与MongoDB的Java实战
  • 2025蓝桥杯python A组题解