中文pdf生成

本文共411字。
版权声明: 署名-非商业性使用-相同方式共享 | CC BY-NC-SA 2.5 CN
展开

rst -> pdf

很久之前,我用Restructured文件生成PDF,还做了一个笔记 , 基本思路很简单:

rst2pdf rst rst latex latex rst->latex rst2xetex pdf pdf latex->pdf xelatex

其实,把latex作为中间文档是很正常的想法,因为latex输出到pdf会足够的给力。

pandoc

今年暑假给老大生成小学三年级数学计算练习题,就用了一个很好用的文档转换工具pandoc,可以这样:

md2pdf markdown markdown pdf pdf markdown->pdf pandoc html html markdown->html pandoc

画布生成

但有时候,就想很简单的像画布一样使用API,最后输出pdf,发现开源的工具挺多,但中文支持好的并不多。我昨天做一个调查,最后选择了Javascript语言的pdfkit,这里记录一下。关键问题在于中文字体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const PDFDocument = require('pdfkit');
const fs = require('fs');

// Create a document
const doc = new PDFDocument();

// Pipe its output somewhere, like to a file or HTTP response
// See below for browser usage
doc.pipe(fs.createWriteStream('output.pdf'));

// NotoSansCJKsc-Regular是postscriptName
doc
.font('/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc', 'NotoSansCJKsc-Regular');

在ttc文件中包含多个字体,每个字体有一个postscriptName和familyName: 上面代码得用postscriptName。fc-list不会列出postscriptName, 怎么知道有哪些postscriptName呢? 看看下面代码就知道了:

1
2
3
4
5
6

const fontkit = require('fontkit')
const f = fontkit.openSync('/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')
// f.fonts 包含所有字体
// f.fonts[2].postscriptName == 'NotoSansCJKsc-Regular
// f.fonts[2].familyName == 'Noto Sans CJK SC'

如此,画布方法生成pdf就简单了。

我记得以前还用过Python的 matplotlib,方法类似,但没写博客,也忘了怎么折腾中文了。