reportLab渲染pdf

继续之前的工作。因为kindle支持的格式有限,所以剩下的只有mobi,pdf两个选择了。找了半天没找到合适的制作mobi文件的模块,所以选用了一个不错的制作pdf的模块——reportlab。

昨天折腾了半天,发现reportlab-userguide的第二章中最简单的helloworld例程输出的pdf文件在电脑中看还正常,在kindle的竖屏模式中看就没有字了,不过横屏模式倒是可以看到字。

我以一个什么都不知道的普通用户的心态猜测了下,可能是kindle为了尽可能将pdf表现的和txt文件差不多,采用了比较奇葩的解析方式,这样竖屏看的时候字比较大。

于是又把后面几张大概看了看,最后还是成功的输出了可以在kindle上阅读的pdf文件。

# 首先import需要用到的模块
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

其中后两条是为了使用自定义的字体。因为不太清楚kindle支持的中文字体有哪些,所以使用了华文宋体。

# 准备要用到的一些东西
STSong = r"/home/juiceyang/jianshuDownloader/STSong.TTF"
# 将华文中宋字体的注册名为"STSong"的字体,当然也可以取别的名字
pdfmetrics.registerFont(TTFont("STSong", STSong))
# 要生成的pdf的尺寸,对应的是kpw2的6寸屏,单位是postpoints
kpw2_size = (331.2, 476.2)
# 使用华文中宋的style模板,style的属性之类的可以看reportlab-userguide的5.6一节
styles = getSampleStyleSheet()
style = styles["Normal"]
style.fontName = "STSong"

STSong.TTF是从网上下载的字体文件,也许应该换成开源字体,不过为了做样例,就不再细改了。

# 新建一个文档
doc = SimpleDocTemplate("你好世界.pdf", pagesize=kpw2_size)
# 开头先插一个大空白
Story = [Spacer(1, 20)]
# 插入简体中文
chs = "我能吞下玻璃而不伤身体。"
p = Paragraph(chs, style)
Story.append(p)
Story.append(Spacer(1, 10))
# 插入繁体中文
cht = "我克藝吃玻璃,我不毀受傷。"
p = Paragraph(cht, style)
Story.append(p)
Story.append(Spacer(1, 10))
# 插入日文
jap = "私は硝子を食べられます。私を傷付けません。"
p = Paragraph(jap, style)
Story.append(p)
# 韩文不太常见就不测试了,输出文档
doc.build(Story)

最后输出的pdf的效果和在kindle上看得效果分别如下:

pdf

可以看出,kindle中竖屏模式浏览的效果和电脑上看的效果还是有些差别的,明显字大了很多。