Reportlab生成PDF文件

Reportlab的互动式form官方技术说明(interactive form)语焉不详,只简单的列了参数。网上能找到的资料也有限,这篇博客:http://www.blog.pythonlibrary.org/2018/05/29/creating-interactive-pdf-forms-in-reportlab-with-python/满满的干货,很有启发,我们在其基础上做些修改和本地化,尝试着把交互式form的用法理清楚,先来看多选项checkbox。

因为要使用中文且使用自己喜欢的中文字体来生成pdf文件,所以在主函数先把要用的字体注册进来,然后调用create_simple_checkboxes()生成多选项放进pdf文件。主函数如下:

if __name__ == '__main__':
    # 生成画布对象
    from reportlab.pdfgen import canvas
    c = canvas.Canvas('speCap.pdf')
    
    from reportlab.pdfbase.ttfonts import TTFont
    from reportlab.pdfbase import pdfmetrics
    # 注册要使用的中文字体文件,并给这个中文字体起名字zoomla
    pdfmetrics.registerFont(TTFont('zoomla', 
                '/Library/Fonts/Chinese/MoMoXiuLiTi-2.ttf'))
   
    # 调用函数往画布上加多选项
    create_simple_checkboxes(c)
    c.showPage()  # 标识一页的结束
    c.save()      # 将画布内容保存成pdf文件

在看create_simple_checkboxes()代码前,先来看代码生成的多选项按钮长什么模样?

图一

既然是多选项,这些选项就可以同时被选中:

图二

对照运行结果读代码比较容易,来看函数create_simple_checkboxes()的内容:

def create_simple_checkboxes(c):
    c.setFont("zoomla", 24)    # 设置字体和字体大小
    c.drawCentredString(120, 700, '奈何天')  # 写标题
    c.setFont("zoomla", 16)    # 设置接下来的字体和大小
    form = c.acroForm          # 将c.acroForm简写成form

    c.drawString(50, 650, '贾宝玉:')  # 写字
    form.checkbox(name='cb1', tooltip='冤孽偿清好散场',
                  x=150, y=645, buttonStyle='check',
                  borderColor=magenta, fillColor=pink,
                  textColor=blue, forceBorder=True)
    # name=每个按钮起不同的名字
    # tooltip=是鼠标悬停在多选项按钮上时显示的文字说明,见图三
    # x= y=指定按钮的位置坐标
    # buttonStyle='check'指明选中用对勾,见图二第一个按钮被选中的样子
    # borderColor=, fillColor=不是设置按钮的边框和填充颜色
    # 而是设置鼠标悬停在按钮之上时边框颜色为洋红色,填充色为粉色
    # 然而有时候由于颜色迭代,可能会不那么准确,见图三第一个按钮的
    # 颜色,实际上有鼠标悬在上面,截屏看不到鼠标
    # textColor=按钮内文字的颜色,这里就是对勾的颜色
    # forceBorder=True显示按钮的边框
    
    c.drawString(50, 600, '林黛玉:')
    form.checkbox(name='cb2', tooltip='玉带林中挂',
                  x=150, y=595, buttonStyle='cross',
                  borderWidth=2, forceBorder=True)
    # borderWidth=按钮边界的宽度,几个图都可以看出这个按钮边界线更粗          
    # buttonStyle='cross'选中时画叉,见图二第二个按钮的样子
    
    c.drawString(50, 550, '薛宝钗:')
    form.checkbox(name='cb3', tooltip='金簪雪里埋',
                  x=150, y=545, buttonStyle='star',
                  borderWidth=1, forceBorder=True)
    # buttonStyle='star'选中时画星,见图二第三个按钮的样子

    c.drawString(50, 500, '王熙凤:')
    form.checkbox(name='cb4', tooltip='凡鸟偏从末世来',
                  x=150, y=495, buttonStyle='circle',
                  borderWidth=1, forceBorder=True)
    # buttonStyle='circle'选中时画圈,见图二第四个按钮的样子

    c.drawString(50, 450, '秦可卿:')
    form.checkbox(name='cb5', tooltip='情既相逢必主淫',
                  x=150, y=445, buttonStyle='diamond',
                  borderWidth=None,
                  checked=True,
                  forceBorder=True)
     # buttonStyle='diamond'选中时画菱形,见图二第五个按钮的样子
     # checked=True最初这个按钮被选中,默认是False   

http://pythonabc.org/images/pABCArticles/reportlab/2-2.png

图三

可以设的参数当然不止一些,因为很多都是共通的,我们留到其它按钮慢慢讲。带交互式form的pdf允许用户做选择和填写资料,关闭时会询问要不要保护交互结果,以后我们会介绍怎么在另外模块的帮助下自动完成选择和填写。下一个帖子介绍单选项,我感觉看懂后用到时,直接把互动式form的代码拷贝进来,修修补补可以用就行了。