reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。它的逻辑和编辑一个word文档或者PPT很像。有两种方法:
1)建立一个空白文档,然后在上面写文字、画图等;
2)建立一个空白list,以填充表格的形式插入各种文本框、图片等,最后生成PDF文档。
因为需要产生一份给用户看的报告,里面需要插入图片、表格等,所以采用的是第二种方法。
安装第三方库
reportlab输入Python的第三方库,使用前需要先安装:pip install reportlab
模块导入
提前导入相关内容,并且注册字体。(注册字体前需要先准备好字体文件)
fromreportlab.pdfbaseimportpdfmetrics#注册字体 fromreportlab.pdfbase.ttfontsimportTTFont#字体类 fromreportlab.platypusimportTable,SimpleDocTemplate,Paragraph,Image#报告内容相关类 fromreportlab.lib.pagesizesimportletter#页面的标志尺寸(8.5*inch,11*inch) fromreportlab.lib.stylesimportgetSampleStyleSheet#文本样式 fromreportlab.libimportcolors#颜色模块 fromreportlab.graphics.charts.barchartsimportVerticalBarChart#图表类 fromreportlab.graphics.charts.legendsimportLegend#图例类 fromreportlab.graphics.shapesimportDrawing#绘图工具 fromreportlab.lib.unitsimportcm#单位: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)
生成报告的结果如下:

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
函数
+关注
关注
3文章
4421浏览量
67822 -
PDF
+关注
关注
1文章
177浏览量
36394 -
python
+关注
关注
58文章
4883浏览量
90295
原文标题:Python生成图文并茂的PDF报告
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
倾斜仪是否支持接入第三方自动化采集系统?
倾斜仪作为工程监测的重要设备,其系统集成能力直接影响实际使用效果。针对是否支持第三方自动化采集系统的问题,答案是肯定的。YS系列倾斜仪在设计阶段即考虑了系统的开放性和兼容性,能够与市面上主流的自动化
为什么MES企业要跟第三方机构合作设备数据采集?
综上考虑,多数MES企业都不直接承接设备数据采集业务,而是选择和第三方机构合作。毕竟第三方机构长期耕耘这一领域,拥有成熟的产品体系、完善的技术路线以及专业的现场施工团队,能够快速应对各类现场难题,将
DEKRA德凯获得沃尔沃汽车第三方实验室认可资质
近日,DEKRA德凯上海实验室成功通过沃尔沃汽车材料工程中心的严格评审,被正式列入其认可的第三方实验室名单。
第三方电商数据 API 数据来源深度解析:合规与稳定背后的核心逻辑
本文揭秘第三方电商数据API的底层逻辑:通过官方授权、生态共享与合规采集三重来源,结合严格清洗校验,确保数据稳定、合规、高质。企业选型应关注来源合法性与场景匹配度,避开数据陷阱,实现真正数据驱动增长
SEGGER Ozone调试器支持第三方调试工具
SEGGER强大的Ozone调试器和性能分析器,长期以来一直深受J-Link和J-Trace用户的信任,现在可以支持第三方调试工具了。
电子测试行业中的第三方检测机构如何解决平台灵活度低,维护困难等痛点问题?
在竞争激烈的市场环境中,第三方检测机构面临着诸多挑战,尤其是在来料测试环节。某权威第三方检测机构就曾深陷困境,他们一方面要应对产品不确定性高与系统固化严重的矛盾,另一方面还需解决已有系
如何集成第三方支付API到电商网站
在电商网站中,集成第三方支付API是确保交易安全、提升用户体验的关键步骤。本文将逐步指导您完成整个流程,从选择支付提供商到上线后的监控。文章结构清晰,包含代码示例和实用建议,帮助您高效实现支付
天合跟踪获得DNV第三方风洞测试审查报告
近日, 天合跟踪获得DNV颁发的中国支架行业首张风洞实验第三方审查报告。该风洞报告由天合跟踪与同济大学合作,针对开拓者1P跟踪支架进行了全新的刚性模型测压试验和先进动力学分析研究,并由DNV进行独立
使用 Claroty SRA 优化第三方 OT 远程访问
第三方,如原始设备制造商 (OEM) 技术员和维护承包商,是确保 OT 环境可用性、完整性和安全性的关键。负责服务 OT 资产的第三方经常远程工作。这意味着,他们会通过无数广泛使用的解决方案远程连接
钛和集团荣获零跑汽车第三方实验室资质认可
近期,钛和集团顺利通过了浙江零跑科技股份有限公司(以下简称“零跑汽车”)对第三方实验室的能力验证及资质审核,助力零跑汽车实现“成为值得尊敬的世界级智能电动车企”的品牌愿景。
钛和集团荣获吉利汽车第三方实验室资质认可
近期,钛和集团汽车事业部顺利通过了浙江吉利控股集团有限公司(以下简称“吉利汽车”)对外部实验室的能力验证及资质审核,并获得了第三方实验室认可证书,助力吉利汽车实现“让世界充满吉利”的品牌愿景。
SGS荣获比亚迪乘用车第三方实验室资质认可证书
近日,国际公认的测试、检验和认证机构SGS(以下简称:SGS)位于重庆的标瑞新能源实验室(以下简称:SGS-CEC)荣获比亚迪乘用车实验室认可委员会(以下简称:比亚迪)颁发的“乘用车第三方实验室资质认可证书”。
reportlab如何输入Python的第三方库
评论