pdfmake.js使用及其源码分析
公司项目在需要将页面的文本导出成DPF,和支持打印时,一直没有做过这样的功能,花了一点时间将其做了出来,并且本着开源的思想和技术分享的目的,将自己的编码经验分享给大家,希望对大家有用。
现在是有一个文本在我的div的代码块中。
1 <h3 id="tatemplatecode"> </h3>
3 <div class="publishinfo">
4 <span id="publisher"></span><span id="publishtime"></span>
5 </div>
6 <div id="templatecontent">
7 </div>
我需要将id为tatemplatecode的东西和id为publisher和id=templatecontent的内容获得并导出pdf中。所有了所有的js插件,我选择使用了pdfmake.js。具体他的优先我就不说了,大家可以去看他的github地址,查看他的源码和简介。github
这里我是将自己的开发经验结合源码分析写下来。
导出pdf的解决代码:
$("#export").click(function(){
var tatemplatecode = $("#tatemplatecode").html();
var publishtime = $("#publishtime").html();
var templatecontent =$("#templatecontent").html().replace(/ /g," ").replace(/<p>/g,"").replace(/<\/p>/g,"").split("<br>");
var dd = {
content: [
tatemplatecode,
publishtime,
templatecontent
],
defaultStyle: {
font: '微软雅黑'
}
};
pdfMake.createPdf(dd).download("三方协议");
});
这里我们只使用了build中的pdfmake.js和vfs_fronts.js,pdfmake.js是我们的主要js插件,vfs_fronts.js里面使我们需要支持的字体,如果你需要支持什么字体比如‘微软雅黑’,就从网上下一个,打包到vfs_fronts.js中。
支持打印的解决代码:
$("#print").click(function(){
debugger;
var tatemplatecode = $("#tatemplatecode").html();
var publishtime = $("#publishtime").html();
var templatecontent =$("#templatecontent").html().replace(/ /g," ").replace(/<p>/g,"").replace(/<\/p>/g,"").split("<br>");
var dd = {
content: [
tatemplatecode,
publishtime,
templatecontent
],
defaultStyle: {
font: '微软雅黑'
}
};
pdfMake.createPdf(dd).print();
});
我们现在已经解决掉导出和打印的功能,但是为了我们进一步了解pdfmake,我们就这二个功能简单分析一下源码。
pdfmake的createPdf函数
module.exports = {
createPdf: function (docDefinition) {
if (!canCreatePdf()) {
throw 'Your browser does not provide the level of support needed';
}
return new Document(docDefinition, global.pdfMake.tableLayouts, global.pdfMake.fonts, global.pdfMake.vfs);
}
};
查看pdfmake.js的download函数。
Document.prototype.download = function (defaultFileName, cb, options) {
if (typeof defaultFileName === 'function') {
cb = defaultFileName;
defaultFileName = null;
}
defaultFileName = defaultFileName || 'file.pdf';
this.getBlob(function (result) {
saveAs(result, defaultFileName);
if (typeof cb === 'function') {
cb();
}
}, options);
};
Document是pdfmake.js的函数。现在就是通过prototype给document的原型加上一个属性函数,定义一个download的函数。因为js是弱关系语言所有你发现这个函数有三个参数但是你却可以无餐直接使用它。因为他不知道你是如何调用他的所以的函数非常巧妙,值得我们学习。
typeof 来检测defaultFileName参数的形式,因为根据顺序来指定参数第一个应该是默认文件名称,第二个成功返回时触发的函数,第三个是设置导出pdf的设置属性。前面几行都是在判断和设置参数,下面就开始真正运行函数。
Document.prototype.getBlob = function (cb, options) {
if (!cb) {
throw 'getBlob is an async method and needs a callback argument';
}
var that = this;
this.getBuffer(function (result) {
var blob = that._bufferToBlob(result);
cb(blob);
}, options);
};
这是讲dd的内容根据原函数的设置变成blob,saveAs讲blob变成filename的pdf。

惊喜红包等你拿
pdfmake.js使用及其源码分析的更多相关文章
- hadoop之hdfs------------------FileSystem及其源码分析
FileSystem及其源码分析 FileSystem这个抽象类提供了丰富的方法用于对文件系统的操作,包括上传.下载.删除.创建等.这里多说的文件系统通常指的是HDFS(DistributedFile ...
- Qt QComboBox之setEditable和currentTextChanged及其源码分析
目录 Qt QComboBox之setEditable和currentTextChanged以及其源码分析 前言 问题的出现 问题分析 currentTextChanged信号触发 源码分析 Qt Q ...
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- 8.深入k8s:资源控制Qos和eviction及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com,源码版本是1.19 又是一个周末,可以愉快的坐下来静静的品味一段源码,这一篇涉及到资源的 ...
- 9.深入k8s:调度器及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这次讲解的是k8s的调度器部分的代码,相对来说比较复杂,慢慢的梳理清 ...
- Golang的Context介绍及其源码分析
简介 在Go服务中,对于每个请求,都会起一个协程去处理.在处理协程中,也会起很多协程去访问资源,比如数据库,比如RPC,这些协程还需要访问请求维度的一些信息比如说请求方的身份,授权信息等等.当一个请求 ...
- 13.深入k8s:Pod 水平自动扩缩HPA及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 Pod 水平自动扩缩 Pod 水平自动扩缩工作原理 Pod 水平自动 ...
- 14.深入k8s:kube-proxy ipvs及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的 ...
- 15.深入k8s:Event事件处理及其源码分析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 概述 k8s的Event事件是一种资源对象,用于展示集群内发生的情况 ...
随机推荐
- Python实用笔记——错误处理
让我们用一个例子来看看try的机制: try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivisionError as e ...
- 接口&&多态&&构造函数&&关键字
day06 抽象类的局限性(与接口的区别) 抽象类可以定义非抽象方法,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;jdk1.8之后接口可以包含默认方法. 一个类只能继承一个直接父类 ...
- 洛谷 P1194 【买礼物】
这道题其实就是转化一个模型就可以了. 买了一个另外一个又优惠,其实就相当于在优惠的时候连一条边,因为不可能多买,所以就是建一棵最小生成树.最后因为肯定买了一件物品,要加上最初的单价. 代码: #inc ...
- 带你认识网站图片img懒加载和预加载的区别
懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...
- 免费馅饼——移动dp
免费馅饼 题目描述 SERKOI最新推出了一种叫做"免费馅饼"的游戏: 游戏在一个舞台上进行.舞台的宽度为 \(W\) 格,天幕的高度为 \(H\) 格,游戏者占一格. 开始时游戏 ...
- LoadLibraryA与GetProcAddress介绍
0x00 函数原型 HMODULE LoadLibraryA( LPCTSTR lpLibFileName//模块的的的名字 ) FARPROC GetProcAddress( HMODULE ...
- day11 文件操作(上)
目录 一.什么是文件 二.为何要用文件 三.如何使用文件 3.1文件操作的基本流程 3.2资源回收with上下文管理 3.3指定操作文本的字符编码 四.文件的操作模式 4.1控制文件读写操作的模式(t ...
- 题解:2018级算法第五次上机 C5-图2
题目描述: 样例: 实现解释: 所有结点对最短路径的板子题 知识点: 寻找所有结点对最短路径,动态规划 坑点: 无坑,注意建边即可 使用的算法为floyd算法 按照程序顺序解释如下: 首先建图,以邻接 ...
- 读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)
要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费.两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始. 核心 ...
- 数据可视化之powerBI基础(十)快速度量值,帮你更快的进行数据分析
https://zhuanlan.zhihu.com/p/64414831 刚开始学习PowerBI,最头疼的可能就是度量值了,毕竟用了Excel这么多年,只相信自己眼睛看到的,对于这个"虚 ...