js实现生成PDF文件的方案

摘要:
前段时间,我在做vue管理端的项目,我满足了前端应该生成PDF文件的要求。搜索相关信息后,有几种解决方案:1.通过窗口print()方法打印当前窗口的内容。Npminstalljspdfhtml2canvas—保存并将其封装在项目的工具库中以供以后使用。有类似需求的兄弟可以参考~

  前段时间做vue管理端的项目,遇到这样的需求:需要前端来生成PDF文件。查找了相关的资料大致有这样的几种方案:

1.通过window.print()方法,打印当前窗口的内容。

2.通过两个插件实现,jspdf + html2canvas,本文着重说一下第二种用法。

  工欲善其事必先利其器,首先我们在项目安装一下这两个插件。

  

npm install jspdf  html2canvas --save

  然后在项目的工具库封装一下,以便后续使用。

 1 // 导出页面为PDF格式
 2 import html2Canvas from 'html2canvas'
 3 import JsPDF from 'jspdf'
 4 export default {
 5   install(Vue, options) {
 6     Vue.prototype.getPdf = function(title, domClass) {
 7         var element = document.querySelector(domClass); // 这个dom元素是要导出pdf的div容器
 8       html2Canvas(element).then(function(canvas) {
 9         var contentWidth = canvas.width;
10         var contentHeight = canvas.height;
11 
12         //一页pdf显示html页面生成的canvas高度;
13         var pageHeight = contentWidth / 592.28 * 841.89;
14         //未生成pdf的html页面高度
15         var leftHeight = contentHeight;
16         //页面偏移
17         let position = 0;
18         //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
19         var imgWidth = 555.28;
20         var imgHeight = 592.28 / contentWidth * contentHeight;
21 
22         var pageData = canvas.toDataURL('image/jpeg', 1.0);
23 
24 //        var pdf = new JsPDF('', 'pt', 'a4');
25         var pdf = new JsPDF('', 'pt', [contentWidth, contentHeight]); //不分页
26         pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight);
27 
28         //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
29         //当内容未超过pdf一页显示的范围,无需分页
30 //        if (leftHeight < pageHeight) {
31 //          pdf.addImage(pageData, 'JPEG', 20, 0, imgWidth, imgHeight);
32 //        } else {
33 //          while (leftHeight > 0) {
34 //            pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
35 //            leftHeight -= pageHeight;
36 //            position -= 841.89;
37 //            //避免添加空白页
38 //            if (leftHeight > 0) {
39 //              pdf.addPage();
40 //            }
41 //          }
42 //        }
43         pdf.save(title + '.pdf');
44       });
45     }
46   }
47 }  

  调用这个方法的时候最好是在$nextTick回调里使用,避免页面报奇怪的错误。有类似的需求的兄弟可以参考一下~

免责声明:文章转载自《js实现生成PDF文件的方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS平台Cordova插件的开发方法ARM---搭建开发板的开发环境(x210v3s)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用Unity模仿CSGO里的火焰效果

  CSGO里的火焰效果和真实的情况比较像,能沿着遮挡物前进,如下是模仿效果。      思路比较简单,开始想的是一圈一圈发出去,但是前圈与后圈的联系不好做,换种思路,每个方向发射一条线,这样根据上一个位置的方位先向前进,如果前面有遮挡,则计算好新的位置与方向,反之前面没有遮挡,选择合适的位置,并从这个方向的上面向下检测,检测这个方向的垂直位置有没遮挡,如...

Java 处理PDF图章(印章)——图片图章、动态图章

图章(印章)是一种在合同、票据、公文等文件中表明法律效应、部门机关权威的重要指示物,常见于各种格式的文件、文档中。对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现。本篇文档分享通过Java代码在PDF文档中添加图章的方法。内容将分两部分介绍: 1. 添加图片图章。即通过加载现有的图章(以图片形式),添加到PDF指定页面位置 2. 添加动...

利用书签栏作插入时失败告终

想用添加书签的方式,修改书签中的地址栏来修改在IE中当前页面的代码.结果还是不行. 在修改IE设置后(不禁用IE运行javascript脚本),已可以让书签alter("ABC")了,但还是没有修改到页中的表格... 看来javascript还是写不够 下面是一些失败的代码 javascript:( function f_IsEnable(r, c,sta...

js 获取地址第1个斜杠后的内容或地址前一部分

var value = "https://www.baidu.com/20210922/95b22ab5034b2d0f.jpg";const str = value.split("https://"); //https://进行分割, const index = str[1].indexOf("/")+1; //indexOf 获取第一个斜杠的索引,co...

js获取mac地址(续)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><...

用html2canvas转html为图片遇到的那些问题

1.图片跨域问题 在html转化为canvas在转化成图片地址的 时候 canvas.toDataURL("image/png") 遇到报错: Access to image at 'png' from origin 'null' has been blocked by CORS policy: Cross origin requests are only...