Python 可轻松生成图文并茂的PDF报告!
生活随笔
收集整理的這篇文章主要介紹了
Python 可轻松生成图文并茂的PDF报告!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家好,reportlab是Python的一個標準庫,可以畫圖、畫表格、編輯文字,最后可以輸出PDF格式。它的邏輯和編輯一個word文檔或者PPT很像。有兩種方法:
1)建立一個空白文檔,然后在上面寫文字、畫圖等;
2)建立一個空白list,以填充表格的形式插入各種文本框、圖片等,最后生成PDF文檔。
因為需要產生一份給用戶看的報告,里面需要插入圖片、表格等,所以采用的是第二種方法。
安裝第三方庫
reportlab輸入Python的第三方庫,使用前需要先安裝:pip install reportlab
模塊導入
提前導入相關內容,并且注冊字體。(注冊字體前需要先準備好字體文件)
from reportlab.pdfbase import pdfmetrics # 注冊字體 from reportlab.pdfbase.ttfonts import TTFont # 字體類 from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image # 報告內容相關類 from reportlab.lib.pagesizes import letter # 頁面的標志尺寸(8.5*inch, 11*inch) from reportlab.lib.styles import getSampleStyleSheet # 文本樣式 from reportlab.lib import colors # 顏色模塊 from reportlab.graphics.charts.barcharts import VerticalBarChart # 圖表類 from reportlab.graphics.charts.legends import Legend # 圖例類 from reportlab.graphics.shapes import Drawing # 繪圖工具 from reportlab.lib.units import cm # 單位:cm# 注冊字體(提前準備好字體文件, 如果同一個文件需要多種字體可以注冊多個) pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))封裝不同內容對應的函數
創建一個Graphs類,通過不同的靜態方法提供不同的報告內容,包括:標題、普通段落、圖片、表格和圖表。函數中的相關數據目前絕大多數都是固定值,可以根據情況自行設置成相關參數。
class Graphs:# 繪制標題@staticmethoddef draw_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# 創建標題對應的段落,并且返回return Paragraph(title, ct)# 繪制小標題@staticmethoddef draw_little_title(title: str):# 獲取所有樣式表style = getSampleStyleSheet()# 拿到標題樣式ct = style['Normal']# 單獨設置樣式相關屬性ct.fontName = 'SimSun' # 字體名ct.fontSize = 15 # 字體大小ct.leading = 30 # 行間距ct.textColor = colors.red # 字體顏色# 創建標題對應的段落,并且返回return Paragraph(title, ct)# 繪制普通段落內容@staticmethoddef draw_text(text: str):# 獲取所有樣式表style = getSampleStyleSheet()# 獲取普通樣式ct = style['Normal']ct.fontName = 'SimSun'ct.fontSize = 12ct.wordWrap = 'CJK' # 設置自動換行ct.alignment = 0 # 左對齊ct.firstLineIndent = 32 # 第一行開頭空格ct.leading = 25return Paragraph(text, ct)# 繪制表格@staticmethoddef draw_table(*args):# 列寬度col_width = 120style = [('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)return table# 創建圖表@staticmethoddef draw_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_databc.strokeColor = colors.black # 頂部和右邊軸線的顏色bc.valueAxis.valueMin = 5000 # 設置y坐標的最小值bc.valueAxis.valueMax = 26000 # 設置y坐標的最大值bc.valueAxis.valueStep = 2000 # 設置y坐標的步長bc.categoryAxis.labels.dx = 2bc.categoryAxis.labels.dy = -8bc.categoryAxis.labels.angle = 20bc.categoryAxis.categoryNames = ax# 圖示leg = Legend()leg.fontName = 'SimSun'leg.alignment = 'right'leg.boxAnchor = 'ne'leg.x = 475 # 圖例的x坐標leg.y = 240leg.dxTextSpace = 10leg.columnMaximum = 3leg.colorNamePairs = itemsdrawing.add(leg)drawing.add(bc)return drawing# 繪制圖片@staticmethoddef draw_img(path):img = Image(path) # 讀取指定路徑下的圖片img.drawWidth = 5*cm # 設置圖片的寬度img.drawHeight = 8*cm # 設置圖片的高度return img生成報告
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)生成報告的結果如下:
?【python學習】
學Python的伙伴,歡迎加入新的交流【君羊】:1020465983
一起探討編程知識,成為大神,群里還有軟件安裝包,實戰案例、學習資料
總結
以上是生活随笔為你收集整理的Python 可轻松生成图文并茂的PDF报告!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Python打开excel异常: X
- 下一篇: python 仪表盘 ppt_Pytho