TableOfContents

Include(ZPyUGnav)

用 python-reportlab 将 rst 转换为中文 PDF

Jiahua Huang <[email protected]>
reply-to        [email protected]
to      [email protected]
date    Sat, Aug 9, 2008 at 01:22

subject [CPyUG:61848] [:MiscItems/2008-08-08:Re: 简单使用 Reportlab 生成中文 PDF 文档]

{{{#rst


用 python-reportlab 将 rst 转换为中文 PDF


:Author: Jiahua Huang <[email protected]> :Keywords: RST, PDF :License: LGPL :Requires: docutils, reportlab

python 里用 Reportlab 应该比用 tex、docbook、fop 合适, 不过 python-reportlab 默认没中文字体,也没中文换行,

分析


实际上新的 python-reportlab 已经有能力处理中文字体,也有了一个基本的 **CJK Warp** (breakLinesCJK),只是通常使用 python-reportlab 的程序都没有去注意。

现有 reportlab 程序主要问题就是::

  1. 使用默认英文字体,而没考虑中文字
  2. 使用默认英文折行,而没考虑中文长行

解决 ====

那么,针对现有问题,可以考虑如下方向解决:

+


+


+ | **问题** | **解决** | +====================+========================================+ | 没有中文字体 | 注册中文字体文泉驿正黑 | +


+


+ | 默认不是中文字体 | 覆盖选字处理,一律用文泉驿正黑 | +


+


+ | 默认不是 CJK 换行 | 覆盖折行处理,一律尝试 breakLinesCJK | +


+


+

动手吧


拿把斧头直接砍 python-reportlab 当然省事, 不过系统的库修改了以后维护还真是麻烦,能不能不修改库本身呢?

既然 Python 是动态语言,可以运行中动态修改几乎一切东西, 那么运行时修改 reportlab 的类吧,只要在最终调用 reportlab 生成 PDF 前动态修改到自己要的就行

注册字体 ========

因为主要是自己用,就硬编码使用自己喜欢的文泉驿正黑字体吧,

用 reportlab.pdfbase.pdfmetrics.registerFont 注册文泉驿::

改默认字体 ==========

先好歹让中文能显示吧,不如暂时让所有字体都用 文泉驿 (刚才把文泉驿注册为"song", 所以这里用 "song" 字体)

修改 reportlab.lib.fonts.ps2tt 和 reportlab.lib.fonts.tt2ps::

中文换行 ========

为了省事,就不考虑哪些要 CJK 折行哪些不要了,直接 try: CJK 换行, except 再英文换行

修改 reportlab.platypus.Paragraph.wrap::

完整的一段 ==========

就是将上边 3 个合起来::

使用


具体的说了那么多,那实际怎么做呢?

前面说了, Python 是动态语言, 你可以将上边的代码随便插入到你的任何程序或模块里,只要在实际调用 reportlab 生成 PDF 前就可以了

1. 直接点,在你的程序 import reportlab 前插入上边的代码 2. 如果想让你原先的文件不要插入这突兀的语句,那可以将上边的代码写入到如 cjkreportlab.py, 在你需要用 reportlab 做中文 pdf 的代码里加个 import cjkreportlab

例子


这里给个修改的 rst2pdf.py::

唔,您可以拿本 RST 文件来测试 rst2pdf 中文,注意编码得是 utf8

命令::

其他问题


现存问题::

  1. 硬编码的 文泉驿正黑字体 路径不能灵活适应不同系统
  2. 文泉驿正黑中文没有粗体和斜体
  3. 由于没有选字,而是一律文泉驿字体,使得英文也没有了粗斜体

您说,本文做的 pdf 没书签没目录?

唔,这是这个 rst2pdf 程序原先的问题,本文只解决 python-reportlab 中文显示和换行。

还有其他问题么? 请洽 python-cn 的老大 Zoomq 大妈 (Zoom. Quiet <[email protected]>) ~ 奥运进行时,请尽情搔扰~ }}}


反馈

创建 by -- ZoomQuiet [DateTime(2008-08-10T00:41:31Z)]

PageComment2

[:/PageCommentData:PageCommentData]