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