用 python/reportlab 生成 PDF

达达这学期关于加减法运算的一个要求是速度——8分钟以内做120道题为及格,5分钟做完是100分.

为了平时训练,偶周末就写了个脚本产生一组题目,并生成 PDF 以供打印。

网上的入门教程多是 reportlab 的 pdfgen.canvas 的例子,不过我这里是要打印 120 道题出来,就得用 platypus.Table 来排版了.

表格的数据用一个 list 来表示;其每一个元素仍然是一个 list,就是每行(row);这个 list 里的每个元素是字符串,是 cell 的数据了。

准备好 table 后,用 platypus.SimpleDocTemplate 来生成 pdf。它最后处理一个 list,把这个 list 里的对象挨个渲染出来,这个有点像浏览器依次画出 block 级别的 div。

示例如下:

from reportlab import platypus
from reportlab.lib.units import inch

def genTable():
    data = []
    items = genList()  #随机生成120道题目
    for i in range(0, len(items), 5):
        #生成一个有 5 列的表格数据
        data.append(items[i:i+5])
    table = platypus.Table(data, 1.5*inch, 0.4*inch, [('FONT', (0,0), (-1,-1), 'Courier')])
    # 每个cell 1.5' 宽,0.4' 高,差不多 120 题排满一张 A4
    # Courier 是等宽字体,为了俺的算式看起来整齐
    # (0,0)/(-1,-1)说的是font style运用范围,从左上到右下
    return table

doc = platypus.SimpleDocTemplate(fname, topMargin=0.9*inch, bottomMargin=0.9*inch, title='DaDa Math', author='qyb')
# 目标是一个叫 fname 的 PDF 文件,缺省上下留白有点多,修改为0.9'

elements = []
for i in range(n):
    elements.append(genTable())
    elements.append(platypus.flowables.PageBreak())
    # 生成 n 页的数据,每个表格后面跟着一个换页

doc.build(elements)

Getting Started With ReportLab 这篇文档给我很大帮助,推荐阅读。

最后要说的是,Linux 下配置佳能 LBP 3018 非常麻烦,我尝试了10分钟后没有搞定就放弃努力回到 XP 下打印了。CUPS 发展这么多年,佳能也是大厂,没想到 Linux 桌面上用打印机还是如此困难!

The gentleman is ended,

The gentleman is ended, QinFang also but is their being a traveler is just, coach outlet perhaps numerous many years after however take into consideration coach outlet of the type of a past, but apparently is coach outlet unlikely just before what contact.

这事儿要我做的话,估计先生成latex源文件再编译了。

这事儿要我做的话,估计先生成latex源文件再编译了。

如果对 latex 熟悉倒也是可以,不失为一个通用的法子.

如果对 latex 熟悉倒也是可以,不失为一个通用的法子.

看来还是得用HP了.

看来还是得用HP了.

http://thaitruongvan.blogspot

http://thaitruongvan.blogspot.com/2009/08/install-canon-laser-printer-in-fedora.html

回头有空了再试试....

让我恼火之处之一是 canon 自己还要启动某服务,而不是让 cups 完成一切

另外就是卡在 SELinux 上.

10分钟就放弃了。 一般Google调研一番再实践几下怎么

10分钟就放弃了。
一般Google调研一番再实践几下怎么也要半个小时以上。

我10分钟后大概就知道半个小时也搞不定...

我10分钟后大概就知道半个小时也搞不定...