零散专题32 生成PDF

生成pdf的方案

(1)JSPDF(前端生成 )

  • 优点:不需要服务端安装无头浏览器,使用CSS方便控制样式,生成的PDF文字可复制
  • 缺点:对中文支持不好

(2)PDFKit( 服务端生成)

  • 优点:服务端直接解决,生成的PDF文字可复制,通过引入字体,可支持中文
  • 缺点:样式控制复杂

(3)node-html-pdf(服务端生成)

  • 优点:服务端通过控制HTML模板生成PDF,支持中文,样式控制方便
  • 缺点:不支持图片,需要安装无头浏览器,性能有隐患

(4)JSPDF + HTMLToCanvas(前端生成)

  • 优点:样式控制方便,支持中文,比较美观
  • 缺点:生成的PDF内容是图片,无法复制

(5) 使用打印(前端生成)

  • 优点:简单,代码量少
  • 缺点:需要引导用户,且不美观

PDFKit

简介

PDFKit使用来在Node服务端生成PDF文件的JS包(也支持在浏览器使用),它可以轻松生成复杂的、多页的、可打印的PDF文档。

它的API是链式语法,与操作Canvas的API有一些类似

安装:

npm install pdfkit -S

创建PDFKit文档很容易:

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

PDFDocument实例是可读的Node流,它不会自动的保存,但是可以使用pipe方法将输出的PDF文档传递给另一个可写的Node流。当PDF文档编写成功后,调用end方法来结束流程。下面的例子来展示如何将生成的文档传递给PDF文件或者HTTP响应:

doc.pipe(fs.createWriteStream('/path/to/file.pdf')); // 写入PDF文件
doc.pipe(res);                                       // 传递给HTTP响应

// 用后面介绍的API来为PDF添加内容

// 结束编辑,关闭流
doc.end();

在浏览器中使用

PDFKit的0.6版本后支持在浏览器中使用,有两种方法在浏览器端使用PDFKit,一种是在浏览器端使用browserify加载Node模块,另一种方法是直接使用PDFKit的预编译版本,可以从Github上下载。

在浏览器端使用PDFKit和Node中使用的唯一区别就是输出结果,在浏览器端输出结果必须是浏览器支持的格式,比如Blob。Blob格式可以允许浏览器在一个iframe中直接展示生成的PDF文档,或者将PDF上传到服务器,或者让用户下载它。

将PDFDcument输出为Blob格式,需要将他传递给blob-stream,这个模块可以将Node的流转换为Blob。下面的例子使用了Browserify来加载PDFKit和blob-stram(如果没有使用Browserify可以直接使用

你可能感兴趣的:(零散专题)