Reportlab生成PDF文件

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)。

http://pythonabc.org/images/pABCArticles/reportlab/5-1.png

图二 填了内容的表格

图二是填了内容的表格。跟下拉选项一样,表格内容的中文字体无法控制,尽管有fontName=参数,却只接受自带的14种字体。

http://pythonabc.org/images/pABCArticles/reportlab/5-1.png

图三 鼠标悬停表格选项的提示

http://pythonabc.org/images/pABCArticles/reportlab/5-1.png

图四 列表框

图四是列表框,列表框更糟糕,列表内选项直接无法显示中文,只支持英文。

代码如下:

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()