Reportlab的互动式form官方技术说明(interactive form)语焉不详,只简单的列了参数。网上能找到的资料也有限,这篇博客:http://www.blog.pythonlibrary.org/2018/05/29/creating-interactive-pdf-forms-in-reportlab-with-python/满满的干货,很有启发,我们在其基础上做些修改和本地化,尝试着把交互式form的用法理清楚。
这个帖子我们来看简单表格form和列表框listbox,主函数部分跟前面帖子互动form的主函数基本相同:都是设置字体和调用画互动form的函数,只不过画的是简单表格和列表项。调用的就是create_simple_form()和create_simple_listboxes()。
先来看效果:
图一 简单表格form
图一是create_simple_form()画的表格,表格项边缘各不相同是为了演示参数borderStyle=的效果(姓名框inset、住址框dashed、电子邮件框solid、微信号框默认、手机框bevelled、原籍框underlined)。
图二 填了内容的表格
图二是填了内容的表格。跟下拉选项一样,表格内容的中文字体无法控制,尽管有fontName=参数,却只接受自带的14种字体。
图三 鼠标悬停表格选项的提示
图四 列表框
图四是列表框,列表框更糟糕,列表内选项直接无法显示中文,只支持英文。
代码如下:
def create_simple_form(c):
c.setFont("zoomla", 24)
c.drawCentredString(300, 700, '个人信息form')
c.setFont("zoomla", 18)
form = c.acroForm
c.drawString(20, 650, '姓名:')
# 虽然有fontName=的参数,却不能设置自己注册的字体,否则会出现错误:
# ValueError: form font name, 'zoomla', is not one of the standard 14 fonts
# 提示自己注册的字体zoomla不是自带的14种字体
form.textfield(name='name', tooltip='你叫啥?',
# tooltip=设置鼠标悬停姓名框的显示,见图三
x=110, y=635, borderStyle='inset',
# borderStyle='inset'效果见图一姓名框的边界
width=300,textColor=blue)
# textColor=填写进表格文字的颜色
c.drawString(20, 600, '住址')
form.textfield(name='address', tooltip='住哪里?',
x=110, y=585, borderStyle='dashed',
# borderStyle='dashed'效果见图一地址框的边界
width=300, textColor=blue)
c.drawString(20, 550, '电子邮件:')
form.textfield(name='email', tooltip='伊妹儿',
x=110, y=535, borderStyle='solid', width=400)
# borderStyle='solid'效果见图一电子邮件框的边界
c.drawString(20, 500, '手机:')
form.textfield(name='contact', tooltip='紧急情况联络用',
x=110, y=485, borderStyle='bevelled')
# borderStyle='bevelled'效果见图一手机框的边界
c.drawString(280, 500, '微信号:')
form.textfield(name='wechat', tooltip='我们的群是123',
x=350, y=485, borderStyle='inset')
c.drawString(20, 450, '原籍:')
form.textfield(name='hometown', tooltip='你来自哪里?',
x=110, y=435, borderStyle='underlined')
# borderStyle='bevelled'效果见图一手机框的边界
def create_simple_listboxes(c):
c.setFont("zoomla", 30)
c.drawCentredString(300, 700, '千红一窟')
c.setFont("zoomla", 18)
form = c.acroForm
c.drawString(10, 650, '万艳同杯哪一艳::')
options = ['cat','dog','python','squirrel','giraffe','pig','horse','cow']
# 选项不支持中文,本来options我想设成:
# ['香菱','晴雯','鸳鸯','紫娟','平儿','袭人','麝月','芳官']
# 然而中文会显示乱码,所以只好放弃,改成英文才可正常显示
# 尝试设置fontName=亦失败,错误提示也是只支持自带的14种字体
form.listbox(name='listbox1', value='python', # 默认值一定要设
x=165, y=590, width=200, height=72,
textColor=blue, forceBorder=True,
options=options, fieldFlags='multiSelect')
# fieldFlags=指明可以多选
if __name__ == '__main__':
c = canvas.Canvas('speCap.pdf')
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
pdfmetrics.registerFont(TTFont('zoomla', '/Library/Fonts/Chinese/MoMoXiuLiTi-2.ttf'))
create_simple_form(c)
# create_simple_listboxes(c)
c.showPage()
c.save()