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文章
4417瀏覽量
67502 -
PDF
+關注
關注
1文章
177瀏覽量
36134 -
python
+關注
關注
57文章
4876瀏覽量
90025
原文標題:Python生成圖文并茂的PDF報告
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
遠傳水電表對接第三方集中器采集器+遠程抄表系統解決方案
針對這一痛點,我們隆重推出 “遠傳水電表對接第三方集中器采集器+遠程抄表系統”一體化解決方案,致力于打破技術壁壘,連通數據斷點,讓您的抄表項目輕松升級,一步到位。
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)榮獲比亞迪乘用車實驗室認可委員會(以下簡稱:比亞迪)頒發的“乘用車第三方實驗室資質認可證書”。
技術分享 | RK3568編譯第三方驅動
這里就以我司IAC-RK3568-Kit開發板為例,分享如何在當前內核下編譯第三方驅動模塊。我們需要向模塊供應商拿到一份適配Linux的驅動源碼,這里主要是要向供應
reportlab如何輸入Python的第三方庫
評論