博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jsPDF使用技巧
阅读量:6221 次
发布时间:2019-06-21

本文共 10125 字,大约阅读时间需要 33 分钟。

正常用法

引入jspdf.min.js

var doc = new jsPDF()doc.text('Hello world!', 10, 10)doc.save('a4.pdf')

api可查看官方说明

根据不同需求,使用中并没有想象中那么容易。

问题1:输入中文时,生成的pdf内容变成乱码

解决方法:

引入jspdf.customfonts.min.js 和 default_vfs.js

var doc = new jsPDF();doc.addFont('NotoSansCJKjp-Regular.ttf', 'NotoSansCJKjp', 'normal');doc.setFont('NotoSansCJKjp');doc.text(15, 30, 'こんにちは。はじめまして。');//multi-lines Testvar paragraph = '相次いで廃止された寝台列車に代わり、いまや夜間の移動手段として主力になりつつある夜行バス。「安い」「寝ながら移動できる」などのメリットを生かすため、運行ダイヤはどのように組まれているのでしょうか。夜遅く出て、朝早く着くというメリット夜行バスを使うメリットといえば、各種アンケートでもいちばん多い回答の「安い」以外に、';var lines = doc.splitTextToSize(paragraph, 150);doc.text(15, 60, lines);doc.save('custom_fonts.pdf');

参考

问题2:如何给文字添加超链接

解决方法:

pdf.textWithLink('下载', 30, 40, { url: 'https://www.google.com/' });

问题3:导出后的pdf黑黑的一片

解决方法:

由于html内容过长,图片较多较长的时候。jsPDF无法导出,可以对页面进行分步截取,然后进行拼接,还可以进行更好的分页

pdf.addPage();

问题4:分步导出后的pdf还是黑黑的一片

解决方法:

导出PDF时,先只显示第一步需要导出的内容,导出完毕后,隐藏导出的页面内容,显示下一步需要导出的页面内容。

以下为部分函数源码,可作为参考

var exporting = false;    var progressLen = $('.cut-box').length;    var resultBoxLength = $('.result-box').length;    $('.export-pdf').click(function(){        if(exporting){            return false;        }        exporting = true;        console.log('export-pdf')        // 保存时先显示所有测试图片,隐藏按钮        var imglen = $('img.lazy').length;        for(var i=0;i
' }); pdf.textWithLink('导导导导', 500, 40, { url: '
' }); $('.export-pdf').css('display','inline-block'); setProgress(progressIndex); newHtmlCanvas(pdf,resultBoxIndex,progressIndex); }, //背景设为白色(默认为黑色) background: "#fff", useCORS:true }) }) //pdf 要输入的pdf,boxLength循环长度,h当前截取的位置 function newHtmlCanvas(pdf,resultBoxIndex,progressIndex){ console.log('resultBoxIndex:'+resultBoxIndex); console.log($('.result-box:eq('+resultBoxIndex+') .cut-box:eq(0)').offset().top) var cutBoxLen = $('.result-box:eq('+resultBoxIndex+') .cut-box').length; var cutBoxIndex = 1; if(resultBoxIndex!=0){ pdf.addPage(); } var firstSub = 0; if(resultBoxIndex==0){ firstSub = 120; } html2canvas( $('.result-box:eq('+resultBoxIndex+')'), { dpi: 172,//导出pdf清晰度 height:$('.result-box:eq('+resultBoxIndex+') .cut-box:eq(0)').offset().top+$('.result-box:eq('+resultBoxIndex+') .cut-box:eq(0)').innerHeight()-firstSub, onrendered: function (canvas) { var contentWidth = canvas.width; var contentHeight = canvas.height; //一页pdf显示html页面生成的canvas高度; var pageHeight = contentWidth / 592.28 * 841.89; // if(pageHeight>2000){ // pageHeight = 2000 // } //未生成pdf的html页面高度 var leftHeight = contentHeight; //pdf页面偏移 var position = 20; //html页面生成的canvas在pdf中图片的宽高(a4纸的尺寸[595.28,841.89]) var imgWidth = 555.28; var imgHeight = 555.28 / contentWidth * contentHeight; var pageData = canvas.toDataURL('image/jpeg', 1.0); //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89) //当内容未超过pdf一页显示的范围,无需分页 if(resultBoxIndex==0){ position=80; // pageHeight = pageHeight -position; } if (leftHeight < pageHeight) { pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight); } else { while (leftHeight > 0) { pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight) leftHeight -= pageHeight; position -= 841.89; //避免添加空白页 if (leftHeight > 0) { pdf.addPage(); } } } if(cutBoxLen>cutBoxIndex){ console.log('有1个以上的子cut-box'); $('.result-box:eq('+resultBoxIndex+') .cut-box:eq('+(cutBoxIndex-1)+')').css('display','none'); $('.result-box:eq('+resultBoxIndex+') .cut-box:eq('+(cutBoxIndex)+')').css('display','inline-block'); pdf.addPage(); progressIndex++; setProgress(progressIndex); connectHtmlCanvas(pdf,resultBoxIndex,cutBoxLen,cutBoxIndex,progressIndex); }else{ console.log('只有1个子cut-box'); if(resultBoxIndex==resultBoxLength-1){ console.log('当前为最后一个resultbox'); console.log('endPage') pdf.save('content.pdf'); $("#pdfContent").removeClass('exporting'); $('.containte_edit .export-pdf span').html('生成PDF'); $('.result-box').show(); $('.result-box .cut-box').show(); $('body').css({'height':'auto','overflow':'auto'}); exporting = false; setProgress(0); }else{ console.log('addPage'); console.log('当前不是最后一个resultbox'); pdf.addPage(); $('.result-box:eq('+(resultBoxIndex+1)+')').show().siblings('.result-box').hide(); resultBoxIndex++; progressIndex++; setProgress(progressIndex); newHtmlCanvas(pdf,resultBoxIndex,progressIndex); } } }, //背景设为白色(默认为黑色) background: "#fff", useCORS:true } ) } function connectHtmlCanvas(pdf,resultBoxIndex,cutBoxLen,cutBoxIndex,progressIndex){ console.log('cutBoxLen:'+cutBoxLen+'cutBoxIndex:'+cutBoxIndex); html2canvas( $('.result-box:eq('+resultBoxIndex+') .cut-box:eq('+cutBoxIndex+')'), { dpi: 172,//导出pdf清晰度 onrendered: function (canvas) { var contentWidth = canvas.width; var contentHeight = canvas.height; //一页pdf显示html页面生成的canvas高度; var pageHeight = contentWidth / 592.28 * 841.89; // if(pageHeight>2000){ // pageHeight = 2000 // } //未生成pdf的html页面高度 var leftHeight = contentHeight; //pdf页面偏移 var position = 20; //html页面生成的canvas在pdf中图片的宽高(a4纸的尺寸[595.28,841.89]) var imgWidth = 555.28; var imgHeight = 555.28 / contentWidth * contentHeight; var pageData = canvas.toDataURL('image/jpeg', 1.0); //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89) //当内容未超过pdf一页显示的范围,无需分页 if (leftHeight < pageHeight) { pdf.addImage(pageData, 'JPEG', 20, 30, imgWidth, imgHeight); } else { while (leftHeight > 0) { pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight) leftHeight -= pageHeight; position -= 841.89; //避免添加空白页 if (leftHeight > 0) { pdf.addPage(); } } } if(cutBoxIndex==cutBoxLen-1){ console.log('当前为父div里最后一个cut-box'); if(resultBoxIndex==resultBoxLength-1){ console.log('当前为最后一个result-box'); pdf.save('content.pdf'); $("#pdfContent").removeClass('exporting'); $('.containte_edit .export-pdf span').html('生成PDF'); $('body').css({'height':'auto','overflow':'auto'}); $('.result-box').show(); $('.result-box .cut-box').show(); exporting = false; setProgress(0); }else{ console.log('当前不是最后一个result-box'); $('.result-box:eq('+(resultBoxIndex+1)+')').show().siblings('.result-box').hide(); resultBoxIndex++; progressIndex++; setProgress(progressIndex); newHtmlCanvas(pdf,resultBoxIndex,progressIndex); } }else{ console.log('当前不是父div里最后一个cut-box'); $('.result-box:eq('+resultBoxIndex+') .cut-box:eq('+cutBoxIndex+')').css('display','none'); $('.result-box:eq('+resultBoxIndex+') .cut-box:eq('+(cutBoxIndex+1)+')').css('display','inline-block'); cutBoxIndex++; pdf.addPage(); progressIndex++; setProgress(progressIndex); connectHtmlCanvas(pdf,resultBoxIndex,cutBoxLen,cutBoxIndex,progressIndex) } }, //背景设为白色(默认为黑色) background: "#fff", useCORS:true } ) } // 设置进度条 function setProgress(progressIndex){ var progress = Math.round((progressIndex/progressLen)*100) +'%'; $('.containte_edit .export-pdf i').css('width',progress); }

转载地址:http://tgrja.baihongyu.com/

你可能感兴趣的文章
Js学习第十天----函数
查看>>
Python sql注入 过滤字符串的非法字符
查看>>
Spring学习笔记——Spring依赖注入原理分析
查看>>
平衡小车项目解读日志
查看>>
[1]朝花夕拾-JAVA类的执行顺序
查看>>
常用shell命令
查看>>
[js高手之路] vue系列教程 - vue的基本用法与常见指令(1)
查看>>
glGetString(GL_VERSION) returns “OpenGL ES-CM 1.1” but my phone supports OpenGL 2
查看>>
RDA PQ工具使用 (屏参调整)
查看>>
Servlet学习笔记(三):HTTP请求与响应
查看>>
HttpClient request payload post请求
查看>>
MySQL慢查询
查看>>
Bootstrap树控件(Tree控件组件)使用经验分享
查看>>
Linux搭建JavaEE开发环境与Tomcat——(十)
查看>>
JFinal 学习笔记之Handler包分析
查看>>
Redis总结(六)Redis配置文件全解
查看>>
“四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
查看>>
iOS开发如何在一个透明视图上添加不透明的子控件
查看>>
加解密
查看>>
Cortex-A9 UART
查看>>