python生成带有表格的图片

发布时间:2019-09-12 07:54:07编辑:auto阅读(1788)

    因为工作中需要,需要生成一个带表格的图片

    例如:

    直接在html中写一个table标签,然后单独把表格部分保存成图片

    或者是直接将excel中的内容保存成一个图片

    刚开始的思路,是直接生成一个带有table标签的html文件,然后将这个文件转成图片,经过查找资料发现需要安装webkit2png,而这个库又依赖其他的东西,遂放弃。

    当初的目标是直接生成一个图片,并且是只需要安装python依赖库就行,而不需要在系统层面安装相应的依赖包

    后来考虑使用Python的图片处理库Pillow,和生成表格式的库prattytable,下面的图片是最终生成的图片效果

    这里写图片描述

    总体来说是分为两个步骤:

    • 使用prattytable将要展示的数据生成一个表格字符串
    • 使用pillow,将生成的表格字符串写入到图片中

    下面是具体实现:

    from prettytable import PrettyTable
    from PIL import Image, ImageDraw, ImageFont
    tab = PrettyTable()
    # 设置表头
    tab.field_names = ["Name", "Age","Country","City"]
    # 表格内容插入
    tab.add_row(['chal','23','中国','Shanghai'])
    tab.add_row(['charle','29','China','Xuzhou'])
    tab.add_row(['jack','32','United States','Washington'])
    tab_info = str(tab)
    space = 5
    
    # PIL模块中,确定写入到图片中的文本字体
    font = ImageFont.truetype('/home/doge/YaHeiConsolas.ttf', 15, encoding='utf-8')
    # Image模块创建一个图片对象
    im = Image.new('RGB',(10, 10),(0,0,0,0))
    # ImageDraw向图片中进行操作,写入文字或者插入线条都可以
    draw = ImageDraw.Draw(im, "RGB")
    # 根据插入图片中的文字内容和字体信息,来确定图片的最终大小
    img_size = draw.multiline_textsize(tab_info, font=font)
    # 图片初始化的大小为10-10,现在根据图片内容要重新设置图片的大小
    im_new = im.resize((img_size[0]+space*2, img_size[1]+space*2))
    del draw
    del im
    draw = ImageDraw.Draw(im_new, 'RGB')
    # 批量写入到图片中,这里的multiline_text会自动识别换行符
    # python2
    draw.multiline_text((space,space), unicode(tab_info, 'utf-8'), fill=(255,255,255), font=font)
    # python3
    # draw.multiline_text((space,space), tab_info, fill=(255,255,255), font=font)
    
    im_new.save('12345.PNG', "PNG")
    del draw

    至此就生成了上面的图片。但是还有一点问题,在使用中文时,表格会又一些错列,应该是使用字体的事,因为我没有找到合适的字体,所以这个问题暂时没有解决。

关键字