javascript文档_基于NodeJS和浏览器客户端的JavaScript的PDF文档引擎——PDFKit

介绍

PDFKit是一个用于Node和浏览器的PDF文档生成库,可以轻松创建复杂的多页面可打印文档。API包含可链接性,包括低级功能以及更高级功能的抽象。PDFKit API设计简单,因此生成复杂文档通常与一些函数调用一样简单。最直接的好处就是节省了服务器端的资源,让生成工作在本地完成!


2b932ec0a7be9cae8f4c8ed19cd38af3.png

如何获取?

由于最近限制颇多,不便于直接放链接,截图都不行,大家可以直接到Github搜索


c30951c66c542050eb0b9bf7c0d1ef81.png

安装使用

  • 使用npm包管理

npm install pdfkit

  • 创建文档

创建PDFKit文档非常简单。只需要引用pdfkit的JavaScript源文件中的模块并创建PDFDocument该类的实例


const PDFDocument = require('pdfkit');const doc = new PDFDocument;

PDFDocument实例是可读的节点流。它们不会自动保存在任何地方,但您可以调用管道方法将PDF文档的输出发送到正在写入的另一个可写节点流。完成文档后,请调用end方法以完成它。下面是一个示例,说明如何管道传输文件或HTTP响应。


doc.pipe(fs.createWriteStream('/path/to/file.pdf')); // 写pdfdoc.pipe(res); // HTTP响应// 添加内容doc.end();

  • 浏览器使用

在浏览器中使用PDFKit与在Node中使用它完全相同,除非你想要将输出通过管道传输到浏览器中支持的目标,例如Blob。Blob可用于生成URL以允许通过iframe直接在浏览器中显示生成的PDF,或者它们可用于将PDF上传到服务器,或在用户的浏览器中触发下载。


// 引入依赖const PDFDocument = require('pdfkit');const blobStream = require('blob-stream');// 同样的创建方式const doc = new PDFDocument;//传输文档到Blobconst stream = doc.pipe(blobStream());//像以往一样将内容添加到文档// 最终得到Blobdoc.end();stream.on('finish', function() { // 得到一个可以随心所欲的Blob const blob = stream.toBlob('application/pdf'); //或获取blob URL以在浏览器中显示 const url = stream.toBlobURL('application/pdf'); iframe.src = url;});

  • 添加页

这个地方除非你设置autoFirstPage: false,不然PDFkit会自动给你添加第一页,后续页面你需要自己添加


doc.addPage()//事件监听doc.on('pageAdded', () => doc.text("Page Title"));

还可以为页面设置一些选项,例如其大小和方向以及边距等


// 所有页面添加50边距doc.addPage({ margin: 50});// 在每一侧添加不同的边距doc.addPage({ margins: { top: 50, bottom: 50, left: 72, right: 72 }});

  • 切换到之前的页面

bufferPages: true// 配置//调用doc.switchToPage(pageNumber)

// 创建一个文档,bufferPages设置为truelet i;let end;const doc = new PDFDocument({ bufferPages: true});// 添加一些内容doc.addPage();// ...doc.addPage();//查看缓冲页面的范围const range = doc.bufferedPageRange(); // => { start: 0, count: 2 }for (i = range.start, end = range.start + range.count, range.start <= end; i < end; i++;) { doc.switchToPage(i); doc.text(`Page ${i + 1} of ${range.count}`);}// 手动刷新已缓冲的页面doc.flushPages();doc.end();

  • 设置文档元数据

PDF文档可以具有与其相关联的各种元数据,例如标题或文档的作者。可以通过将该信息添加到doc.info对象中,或者通过在创建时将info对象传递到文档中来添加该信息。

以下是可以添加到文档元数据的所有属性的列表。根据PDF规范,每个属性必须首字母大写。


  • Title - 文件的标题
  • Author - 作者的姓名
  • Subject - 文件的主题
  • Keywords - 与文档关联的关键字
  • CreationDate - 文档创建的日期(由PDFKit自动添加)
  • ModDate - 上次修改文档的日期

  • 加密和访问权限

PDF规范允许你在打开文件时加密PDF文件且需要密码,以及设置用户可以对PDF文件执行的操作的权限。要启用加密,在创建时提供用户密码PDFDocumentoptions对象。提供用户密码时将对PDF文件进行加密,并在打开文件时提示用户输入密码以解密文件。


  • userPassword - 用户密码(字符串值)

要设置PDF文件的访问权限,您需要option在创建时在对象中提供所有者密码和权限设置PDFDocument。默认情况下,不允许所有操作。您需要明确允许某些操作。

  • ownerPassword - 所有者密码(字符串值)
  • permissions - 指定PDF文件权限的对象

permissions对象中允许以下设置:

  • printing - 是否允许打印。指定"lowResolution"允许降级打印,或"highResolution"允许以高分辨率打印
  • modifying - 是否允许修改文件。指定true允许修改文档内容
  • copying - 是否允许复制文本或图形。指定true允许复制
  • annotating - 是否允许注释,填写表格。指定true允许注释和表单填写
  • fillingForms - 是否允许填写表格和签字。指定true允许填写表单字段和签名
  • contentAccessibility - 是否允许复制文本以便访问。指定true允许复制可访问性
  • documentAssembly - 是否允许装配文件。指定true允许文档组装

可以指定用户密码,所有者密码或两个密码。行为因提供的密码而异:

  • 仅提供用户密码时,具有用户密码的用户可以解密文件并具有对文档的完全访问权限。
  • 当仅提供所有者密码时,用户能够在不提供任何密码的情况下解密和打开文档,但访问仅限于明确允许的操作。拥有所有者密码的用户可以完全访问该文档。
  • 提供两个密码时,具有用户密码的用户可以解密文件,但只能根据权限设置对文件进行有限的访问。拥有所有者密码的用户可以完全访问该文档。

以上介绍的都是基本使用方法,核心用法包括矢量图创建和绘制、文本内容、图片以及注释等文档实在太过详细,因此就不在详细介绍,看文档更有用,由于是英文文档,可以借助浏览器自带的翻译插件查看


698d3899df2c4c2321413452d4bd885e.png

在线预览查看


57750b09a01dd858d6ba803aafb91279.gif

总结一下

目前pdf文档的预览非常容易实现,但是生成,这里说的是客户端生成相对来说要复杂一些,但是借助PDFKit就可以使用简单的API来实现非常复杂的功能,可以说很贴心了,有需求的小伙伴赶紧去看看吧!


4f87592d43ccd62fa4837a34701eb517.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值