Reportlab交互式Form之简单表格form和列表框lis
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()