无障碍 关怀版

Python生成图文并茂的PDF报告

来源:综合自网络

来源:综合自网络

reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法:

1)建立一个空白文档,然后在上面写文字、画图等;

2)建立一个空白list,以填充表格的形式插入各种文本框、图片等,最后生成PDF文档。

因为需要产生一份给用户看的报告,里面需要插入图片、表格等,所以采用的是第二种方法。

安装第三方库

reportlab输入Python的第三方库,使用前需要先安装:pip install reportlab

模块导入

提前导入相关内容,并且注册字体。(注册字体前需要先准备好字体文件)

fromreportlab.pdfbase importpdfmetrics # 注册字体

fromreportlab.pdfbase.ttfonts importTTFont # 字体类

fromreportlab.platypus importTable, SimpleDocTemplate, Paragraph, Image # 报告内容相关类

fromreportlab.lib.pagesizes importletter # 页面的标志尺寸(8.5*inch, 11*inch)

fromreportlab.lib.styles importgetSampleStyleSheet # 文本样式

fromreportlab.lib importcolors # 颜色模块

fromreportlab.graphics.charts.barcharts importVerticalBarChart # 图表类

fromreportlab.graphics.charts.legends importLegend # 图例类

fromreportlab.graphics.shapes importDrawing # 绘图工具

fromreportlab.lib.units importcm # 单位:cm

# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个)

pdfmetrics.registerFont(TTFont( 'SimSun', 'SimSun.ttf'))

封装不同内容对应的函数

创建一个Graphs类,通过不同的静态方法提供不同的报告内容,包括:标题、普通段落、图片、表格和图表。函数中的相关数据目前绝大多数都是固定值,可以根据情况自行设置成相关参数。

classGraphs:

# 绘制标题

@staticmethod

defdraw_title(title: str):

# 获取所有样式表

style = getSampleStyleSheet

# 拿到标题样式

ct = style[ 'Heading1']

# 单独设置样式相关属性

ct.fontName = 'SimSun'# 字体名

ct.fontSize = 18# 字体大小

ct.leading = 50# 行间距

ct.textColor = colors.green # 字体颜色

ct.alignment = 1# 居中

ct.bold = True

# 创建标题对应的段落,并且返回

returnParagraph(title, ct)

# 绘制小标题

@staticmethod

defdraw_little_title(title: str):

# 获取所有样式表

style = getSampleStyleSheet

# 拿到标题样式

ct = style[ 'Normal']

# 单独设置样式相关属性

ct.fontName = 'SimSun'# 字体名

ct.fontSize = 15# 字体大小

ct.leading = 30# 行间距

ct.textColor = colors.red # 字体颜色

# 创建标题对应的段落,并且返回

returnParagraph(title, ct)

# 绘制普通段落内容

@staticmethod

defdraw_text(text: str):

# 获取所有样式表

style = getSampleStyleSheet

# 获取普通样式

ct = style[ 'Normal']

ct.fontName = 'SimSun'

ct.fontSize = 12

ct.wordWrap = 'CJK'# 设置自动换行

ct.alignment = 0# 左对齐

ct.firstLineIndent = 32# 第一行开头空格

ct.leading = 25

returnParagraph(text, ct)

# 绘制表格

@staticmethod

defdraw_table(*args):

# 列宽度

col_width = 120

style = [

( 'FONTNAME', ( 0, 0), ( -1, -1), 'SimSun'), # 字体

( 'FONTSIZE', ( 0, 0), ( -1, 0), 12), # 第一行的字体大小

( 'FONTSIZE', ( 0, 1), ( -1, -1), 10), # 第二行到最后一行的字体大小

( 'BACKGROUND', ( 0, 0), ( -1, 0), '#d5dae6'), # 设置第一行背景颜色

( 'ALIGN', ( 0, 0), ( -1, -1), 'CENTER'), # 第一行水平居中

( 'ALIGN', ( 0, 1), ( -1, -1), 'LEFT'), # 第二行到最后一行左右左对齐

( 'VALIGN', ( 0, 0), ( -1, -1), 'MIDDLE'), # 所有表格上下居中对齐

( 'TEXTCOLOR', ( 0, 0), ( -1, -1), colors.darkslategray), # 设置表格内文字颜色

( 'GRID', ( 0, 0), ( -1, -1), 0.5, colors.grey), # 设置表格框线为grey色,线宽为0.5

# ('SPAN', (0, 1), (0, 2)), # 合并第一列二三行

# ('SPAN', (0, 3), (0, 4)), # 合并第一列三四行

# ('SPAN', (0, 5), (0, 6)), # 合并第一列五六行

# ('SPAN', (0, 7), (0, 8)), # 合并第一列五六行

]

table = Table(args, colWidths=col_width, style=style)

returntable

# 创建图表

@staticmethod

defdraw_bar(bar_data: list, ax: list, items: list):

drawing = Drawing( 500, 250)

bc = VerticalBarChart

bc.x = 45# 整个图表的x坐标

bc.y = 45# 整个图表的y坐标

bc.height = 200# 图表的高度

bc.width = 350# 图表的宽度

bc.data = bar_data

bc.strokeColor = colors.black # 顶部和右边轴线的颜色

bc.valueAxis.valueMin = 5000# 设置y坐标的最小值

bc.valueAxis.valueMax = 26000# 设置y坐标的最大值

bc.valueAxis.valueStep = 2000# 设置y坐标的步长

bc.categoryAxis.labels.dx = 2

bc.categoryAxis.labels.dy = -8

bc.categoryAxis.labels.angle = 20

bc.categoryAxis.categoryNames = ax

# 图示

leg = Legend

leg.fontName = 'SimSun'

leg.alignment = 'right'

leg.boxAnchor = 'ne'

leg.x = 475# 图例的x坐标

leg.y = 240

leg.dxTextSpace = 10

leg.columnMaximum = 3

leg.colorNamePairs = items

drawing.add(leg)

drawing.add(bc)

returndrawing

# 绘制图片

@staticmethod

defdraw_img(path):

img = Image(path) # 读取指定路径下的图片

img.drawWidth = 5*cm # 设置图片的宽度

img.drawHeight = 8*cm # 设置图片的高度

returnimg

生成报告if__name__ == '__main__':

# 创建内容对应的空列表

content = list

# 添加标题

content.append(Graphs.draw_title( '数据分析就业薪资'))

# 添加图片

content.append(Graphs.draw_img( '抗疫必胜.png'))

# 添加段落文字

content.append(Graphs.draw_text( '众所周知,大数据分析师岗位是香饽饽,近几年数据分析热席卷了整个互联网行业,与数据分析的相关的岗位招聘、培训数不胜数。很多人前赴后继,想要参与到这波红利当中。那么数据分析师就业前景到底怎么样呢?'))

# 添加小标题

content.append(Graphs.draw_title( ''))

content.append(Graphs.draw_little_title( '不同级别的平均薪资'))

# 添加表格

data = [

( '职位名称', '平均薪资', '较上年增长率'),

( '数据分析师', '18.5K', '25%'),

( '高级数据分析师', '25.5K', '14%'),

( '资深数据分析师', '29.3K', '10%')

]

content.append(Graphs.draw_table(*data))

# 生成图表

content.append(Graphs.draw_title( ''))

content.append(Graphs.draw_little_title( '热门城市的就业情况'))

b_data = [( 25400, 12900, 20100, 20300, 20300, 17400), ( 15800, 9700, 12982, 9283, 13900, 7623)]

ax_data = [ 'BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']

leg_items = [(colors.red, '平均薪资'), (colors.green, '招聘量')]

content.append(Graphs.draw_bar(b_data, ax_data, leg_items))

# 生成pdf文件

doc = SimpleDocTemplate( 'report.pdf', pagesize=letter)

doc.build(content)

生成报告的结果如下:

--- EOF ---

推荐↓↓↓ 返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()

玻璃钢生产厂家保山市玻璃钢雕塑设计哪里买苏州玻璃钢花盆供应哈尔滨玻璃钢雕塑设计麋鹿玻璃钢雕塑图片安徽创意玻璃钢雕塑设计资阳玻璃钢商场美陈赤峰玻璃钢座椅雕塑广东中庭商场美陈供货商重庆番禺玻璃钢卡通雕塑浙江玻璃钢雕塑推荐盘锦口碑好的玻璃钢雕塑多少钱天津户外玻璃钢雕塑南通小提琴玻璃钢花盆石家庄玻璃钢彩绘雕塑厂通化景区玻璃钢雕塑安装红河玻璃钢花盆泰州玻璃钢雕塑公司湖南玻璃钢佛像雕塑厂玻璃钢大猩猩雕塑亳州小品系列玻璃钢雕塑厂家贵阳商场美陈报价四川主题商场美陈价格阳江玻璃钢仿铜雕塑太原学校玻璃钢雕塑制作仿玉玻璃钢雕塑造型东莞玻璃钢骑士人物雕塑代理玻璃钢动物马雕塑价格嘉峪关仿真人物玻璃钢雕塑公司玻璃钢动物马雕塑内蒙古玻璃钢人物雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化