应无所住,而生其心
排名
1
文章
862
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue生成pdf下载。vue把当前页面生成pdf下载。vue根据页面dom id生成pdf下载。vue pdf导出

4929人阅读 2020/7/17 19:20 总访问:5259876 评论:0 收藏:0 手机
分类: 前端


思路: 通过 html2canvas 将 HTML 页面转换成图片,然后再通过 jspdf 将图片的 base64 生成为 pdf 文件。

下载相关依赖

  1. cnpm install html2Canvas;
  2. cnpm install jspdf --save

或者

  1. // 将页面 html 转换成图片的库
  2. npm install html2canvas --save
  3. // 将图片生成 pdf的库
  4. npm install jspdf --save

封装生成pdf的方法并使用

封装成全局方法

创建一个htmlToPdf.js的js文件, 然后在main.js中全局引用一下,编写如下代码:

  1. // htmlToPdf.js
  2. // 导出页面为PDF格式
  3. import html2Canvas from 'html2canvas'
  4. import JsPDF from 'jspdf'
  5. export default {
  6. install(Vue, options) {
  7. Vue.prototype.getPdf = function () {
  8. var title = this.htmlTitle //DPF标题
  9. html2Canvas(document.querySelector('#pdfDom'), {
  10. allowTaint: true,
  11. taintTest: false,
  12. useCORS: true,
  13. y:72, // 对Y轴进行裁切
  14. // width:1200,
  15. // height:5000,
  16. dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
  17. scale: 4 //按比例增加分辨率
  18. }).then(function (canvas) {
  19. let contentWidth = canvas.width
  20. let contentHeight = canvas.height
  21. let pageHeight = contentWidth / 592.28 * 841.89
  22. let leftHeight = contentHeight
  23. let position = 0
  24. let imgWidth = 595.28
  25. let imgHeight = 592.28 / contentWidth * contentHeight
  26. let pageData = canvas.toDataURL('image/jpeg', 1.0)
  27. let PDF = new JsPDF('', 'pt', 'a4')
  28. if (leftHeight < pageHeight) {
  29. PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
  30. } else {
  31. while (leftHeight > 0) {
  32. PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
  33. leftHeight -= pageHeight
  34. position -= 841.89
  35. if (leftHeight > 0) {
  36. PDF.addPage()
  37. }
  38. }
  39. }
  40. PDF.save(title + '.pdf')
  41. })
  42. }
  43. }
  44. }

main.js中引用:

  1. // main.js
  2. import htmlToPdf from '@/util/htmlToPdf'
  3. Vue.use(htmlToPdf)

在vue页面中给需要打印的区域一个div标签,然后给div一个id,id名和htmlToPdf.js中选择的名字一致,代码如下:

  1. <div id="pdfDom">
  2. ... 下载成pdf的内容
  3. </div>

在data节点中声明一个htmlTitle变量,指定为pdf文件的文件名。或者通过其他方式传递也行

  1. data() {
  2. return {
  3. htmlTitle: '下载安装SQL Server 2017'
  4. }
  5. }

在vue页面中添加一个button按钮,事件名和htmlToPdf.js中的方法名保持一致。

  1. <el-button @click="getPdf()">PDF</el-button>

在某个页面定义一个方法直接使用

在需要的页面里边引用需要的依赖

  1. // 导出页面为PDF格式
  2. import html2Canvas from 'html2canvas'
  3. import JsPDF from 'jspdf'

直接在页面里边的methods中定义一个下载pdf的方法即可

  1. getPdf (idInp,pdfTitleInp) {
  2. // 当下载pdf时,若不在页面顶部会造成PDF样式不对,所以先回到页面顶部再下载
  3. let top = document.getElementById(idInp);
  4. if (top != null) {
  5. top.scrollIntoView();
  6. top = null;
  7. }
  8. //let title = this.exportPDFtitle;
  9. //pdf名称
  10. let title = pdfTitleInp
  11. html2Canvas(document.querySelector('#'+idInp), {
  12. allowTaint: true
  13. }).then(function (canvas) {
  14. // 获取canvas画布的宽高
  15. let contentWidth = canvas.width;
  16. let contentHeight = canvas.height;
  17. // 一页pdf显示html页面生成的canvas高度;
  18. let pageHeight = contentWidth / 841.89 * 592.28;
  19. // 未生成pdf的html页面高度
  20. let leftHeight = contentHeight;
  21. // 页面偏移
  22. let position = 0;
  23. // html页面生成的canvas在pdf中图片的宽高(本例为:横向a4纸[841.89,592.28],纵向需调换尺寸)
  24. let imgWidth = 841.89;
  25. let imgHeight = 841.89 / contentWidth * contentHeight;
  26. let pageData = canvas.toDataURL('image/jpeg', 1.0);
  27. let PDF = new JsPDF('l', 'pt', 'a4');
  28. // 两个高度需要区分: 一个是html页面的实际高度,和生成pdf的页面高度
  29. // 当内容未超过pdf一页显示的范围,无需分页
  30. if (leftHeight < pageHeight) {
  31. PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
  32. } else {
  33. while (leftHeight > 0) {
  34. PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
  35. leftHeight -= pageHeight;
  36. position -= 592.28;
  37. // 避免添加空白页
  38. if (leftHeight > 0) {
  39. PDF.addPage();
  40. }
  41. }
  42. }
  43. PDF.save(title + '.pdf')
  44. })
  45. }
  46. }

调用。在需要调用的地方触发即可,两个参数一个是需要下载pdf页面dom节点的id,这两个是pdf的名称

  1. <div class="downLoadOfflinePackage" @click="getPdf('pdfDom',labOpton.title)" style="color:#FF3923">下载离线包</div>

效果如下:

错误解决:VUE-ElementUI DOMException: Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.

这种情况下一般是图片不能跨域引起的。

比如引入了其他网站的图片,或者自己网站的图片也有可能遇到这种情况
只要是不允许跨域的话。

如果是引入了其他网站的图片
换成自己本地的图片或者引入自己的图片在尝试

如果引用的都是自己网站的图片,那么设置一下让图片跨域即可
你可能在vue前端需要这样的设置:

  1. img.setAttribute("crossOrigin",'Anonymous')

你也可能可以尝试以下在net core后端设置静态文件允许跨域访问(自己根据自己开发的后端去针对性设置)

  1. //app.UseStaticFiles();
  2. app.UseStaticFiles(new StaticFileOptions
  3. {
  4. OnPrepareResponse = (c) =>
  5. {
  6. c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
  7. }
  8. });

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

vue.js常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.js常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...

干货!div滚动到一定位置就固定他。vue中实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

vue.js常用指令,事件绑定等,vue过滤器解析状态过滤器多个参数。vue表格状态解析。vue解析类型,element ui解析类型,状态,el-tag

按照html的编码显示:v-html&lt;div class=&quot;font_info&quot; v-html=&quot;item.Content&quot;&gt;{{item.Content}}&l...

vue.js if用法

vue.js if可以做一些判断例如我们要把下面这个输出varvm=newVue({ el:&quot;#content&quot;, data:{ titles:[&quot;小明...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第五章-v-if和v-for指令的使用方式

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第四章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

vue.js学习日记第七章-搭建脚手架

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第六章: http://www.tnblog.net/18323015640/article/details/2...

vue实现好友选中效果

逛过vue官网肯定会发现一个有趣的指令“v-for”,相比与以前拼接html代码确实要上档次一点,而且减少了工作量,先看一波效...

js时间格式化vue.js时间格式化,带T 时间格式化

也可以借助moment库, 参考:https://www.tnblog.net/aojiancc2/article/details/8079moment库有点大,推荐可以使用day.js...