通过前端实现导出生成pdf文件并下载

使用 jspdf.js + html2canvas 插件,实现前端生成pdf 并下载的功能
步骤如下
1、先通过npm 安装插件

npm install jspdf.js
npm install html2canvas

2、单独在utils 文件夹下,新建文件,存放处理代码

/* eslint-disable */
//不使用JQuery版的
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';/*** @param  ele          要生成 pdf 的DOM元素(容器)* @param  padfName     PDF文件生成后的文件名字* */function downloadPDF(ele, pdfName) {let eleW = ele.offsetWidth;// 获得该容器的宽let eleH = ele.offsetHeight;// 获得该容器的高let eleOffsetTop = ele.offsetTop;  // 获得该容器到文档顶部的距离let eleOffsetLeft = ele.offsetLeft; // 获得该容器到文档最左的距离var canvas = document.createElement("canvas");var abs = 0;let win_in = document.documentElement.clientWidth || document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条)let win_out = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)if (win_out > win_in) {// abs = (win_o - win_i)/2;    // 获得滚动条长度的一半abs = (win_out - win_in) / 2;    // 获得滚动条宽度的一半// console.log(a, '新abs');}canvas.width = eleW * 2;    // 将画布宽&&高放大两倍canvas.height = eleH * 2;var context = canvas.getContext("2d");context.scale(2, 2);context.translate(-eleOffsetLeft - abs, -eleOffsetTop);// 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此// translate的时候,要把这个差值去掉// html2canvas(element).then( (canvas)=>{ //报错// html2canvas(element[0]).then( (canvas)=>{html2canvas(ele, {dpi: 300,// dpi: window.devicePixelRatio*4, //将分辨率提高到特定的DPI 提高四倍scale: 2, //按比例增加分辨率// allowTaint: true,  //允许 canvas 污染, allowTaint参数要去掉,否则是无法通过toDataURL导出canvas数据的useCORS: true  //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。}).then((canvas) => {var contentWidth = canvas.width;var contentHeight = canvas.height;//一页pdf显示html页面生成的canvas高度;var pageHeight = contentWidth / 592.28 * 841.89;//未生成pdf的html页面高度var leftHeight = contentHeight;//页面偏移var position = 0;//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高var imgWidth = 595.28 - 40;// a4w = 190, a4h = 277;    //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277//    Math.floor(a4h * canvas.width / a4w),   var imgHeight = 595.28 / contentWidth * contentHeight;var pageData = canvas.toDataURL('image/jpeg', 1.0);var pdf = new JsPDF('p', 'pt', 'a4');//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)//当内容未超过pdf一页显示的范围,无需分页if (leftHeight < pageHeight) {//在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight);// pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);} else {    // 分页while (leftHeight > 0) {pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight);leftHeight -= pageHeight;position -= 841.89;//避免添加空白页if (leftHeight > 0) {pdf.addPage();}}}//可动态生成pdf.save(pdfName);})
}
export default {downloadPDF
}

3、 要导出的页面绘制好页面之后,赋值一个单独的类名,页面引入第二步的方法,并直接调用即可

  htmlToPdf.downloadPDF(document.querySelector("#节点类名"), "下载的文件名称");

缺点:
1、使用插件时,页面内容分页会出现问题,不会自动分页,需要自己进行处理
2、下载的文件页面清晰度也会有问题(因为下载内容清晰度与屏幕分辨率和屏幕尺寸是有关联的),需要自己处理一下(建议,如果可以,可以尝试给绘制页面规定宽度,对清晰度有帮助)

通过前端实现导出生成pdf文件并下载相关推荐

  1. 前端实现生成pdf文件并下载

    前端实现生成pdf文件并下载 思路 下载依赖 使用方式 备注 参考 思路 通过 html2canvas 将 HTML 页面转换成图片,然后再通过 jspdf 将图片的 base64 生成为 pdf 文 ...

  2. freemarker 模板生成pdf文件并下载

    利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...

  3. html2Canvas+JsPDF生成pdf文件并下载

    采用html2Canvas+JsPDF实现web页面/dom元素转pdf文件并下载 1.安装html2Canvas: npm install html2canvas 2.安装JsPDF: npm in ...

  4. html前端使用js生成pdf文件并保存到本地

    安装jspdf和html2canvas依赖,其中jspdf是文件保存操作,html2canvas是为了将内容转换为canvas图片 npm install jspdf html2canvas --sa ...

  5. 前端vue项目,把某个div盒子或当前页面生成pdf文件并下载。

    安装依赖 1. npm install --save html2canvas // 作用是html转图片 2. npm install jspdf --save // 再将图片转为pdf 目录标题 安 ...

  6. PHP版田字格带笔顺临摹描红练习字帖在线生成小工具,可直接打印三色的田字格米字格回宫格空格灰格字帖,生成速度快可直接打印或导出成PDF文件等下载地址在最后

    上面是首页的截图,下面是生成字帖的截图和程序源码 这是个在线生成字帖的PHP小程序,用来给小朋友或大朋友们练字用的,从安装到最后调试我忙了整整一天,不过打印效果非常棒,最初拿到的源码用不了报错,后来改 ...

  7. C# 生成pdf文件客户端下载

    itextsharp.dll 下载: http://sourceforge.net/projects/itextsharp/ 程序需引用:itextsharp.dll,itextsharp.pdfa. ...

  8. 安装texlive并用latex编写一段中文,最后生成pdf文件

    安装texlive并用latex编写一段中文,最后生成pdf文件 **#一.下载安装(**链接https://tug.org/texlive/) ##1.第一步 ##2.第二步 ##3.第三步 ##4 ...

  9. 【前端html页面数据导出为pdf文件】

    [前端html页面数据导出为pdf文件] 文前白话 在网页端导出 Excel 数据表格保存本地 前端html页面数据导出为pdf文件 文前白话 项目需要,将网页端查询的数据结果与数据分析结果导出文件, ...

最新文章

  1. Excel+bat批量更改文件名
  2. 万豪酒店数据库遭入侵 5亿顾客信息或泄露
  3. 【数字信号处理】线性时不变系统 LTI ( 判断某个系统是否是 “ 非时变 “ 系统 | 案例二 )
  4. MySQL 导出数据
  5. C# 获得当前运行程序所在的目录的代码
  6. linux下升级php5.4到php5.6
  7. 月薪过万的岗位名单,大家久等了!
  8. 2020年下半年系统集成项目管理工程师上午试题解析(三)
  9. 来兄弟连了,你还在用面向过程唱高音歌曲的你就OUT了
  10. 原生小程序用画布制作海报,等比例缩放,和uniapp差不多就是写法有点不同
  11. WIN7 鼠标右键反应慢如何处理
  12. cdh cm 大数据系统hadoop快速安装
  13. mac 重启php-fpm
  14. python复数的实部和虚部都是整数嘛_数字类型
  15. [sudo rm -rf /bin/] Linux误删除/bin目录恢复
  16. QCharts随时间流逝
  17. 自己的微信竟然延迟接收消息了,这是什么情况?
  18. 用Linux开发板制作智能音箱,【工程师实战】只要几步,普通音箱秒变小度智能音箱...
  19. 【vue】二、vue2仿去哪儿网app——首页开发
  20. 51单片机播放音乐(一):蜂鸣器

热门文章

  1. 用vscode创建vue项目
  2. 求两个字符串的LCS(最长公共子串)后缀数组
  3. Electron 设置镜像
  4. 基于openstack安装部署私有云详细
  5. BOOTPROTO=[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
  6. 动物class类图 php,UML系列——类图class
  7. WorkFlowy beta for Mac(跨平台同步笔记工具)
  8. mysql 排它锁_Mysql共享锁、排他锁、悲观锁、乐观锁
  9. 在线获取浏览器指纹查看工具
  10. 针对Altium Designer安装时需要登录的问题的讨论