参考链接:
pyhton之Reportlab模块
https://www.cnblogs.com/hujq1029/p/7767980.html

reportlab模块是用python语言生成pdf文件的模块

一、安装

#安装命令
pip install -U reportlab

首先需要在cmd窗口安装reportlab模块,成功安装的结果如下:

二、注册中文字体

reportlab模块默认不支持中文,如果使用中文需要注册。

#下载自己需要的.ttf字体,例如STSONG.ttf
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('song', STSONG.ttf))
#生成文字
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph,SimpleDocTemplate
from reportlab.lib import  colors
Style=getSampleStyleSheet()
bt = Style['Normal']     #字体的样式
# bt.fontName='song'    #使用的字体
bt.fontSize=14            #字号
bt.wordWrap = 'CJK'    #该属性支持自动换行,'CJK'是中文模式换行,用于英文中会截断单词造成阅读困难,可改为'Normal'
bt.firstLineIndent = 32  #该属性支持第一行开头空格
bt.leading = 20             #该属性是设置行距
ct=Style['Normal']
# ct.fontName='song'
ct.fontSize=12
ct.alignment=1             #居中
ct.textColor = colors.red
t = Paragraph('hello',bt)
pdf=SimpleDocTemplate('ppff.pdf')
pdf.multiBuild([t])

一份pdf文件可以定义多种字体样式,如bt和ct。字体有多种属性,这里只列举一些常用的属性,

其中,wordWrap自动换行属性的参数’CJK’是按照中文方式换行(可以在字符之间换行),英文方式为’Normal’(在空格出换行)
alignment:0 左对齐、1 居中、2 右对齐

三、表格

#格式
from reportlab.platypus import  Table
t = Table(data)#Example
from reportlab.platypus import Paragraph, SimpleDocTemplate, Table,TableStyle
from reportlab.lib.units import inch
from reportlab.lib import colors
def table_model(data):width = 7.2  # 总宽度colWidths = (width / len(data[0])) * inch   # 每列的宽度dis_list = []for x in data:# dis_list.append(map(lambda i: Paragraph('%s' % i, cn), x))dis_list.append(x)style = [# ('FONTNAME', (0, 0), (-1, -1), 'song'),  # 字体('FONTSIZE', (0, 0), (-1, 0), 15),  # 字体大小('BACKGROUND', (0, 0), (-1, 0), HexColor('#d5dae6')),  # 设置第一行背景颜色('BACKGROUND', (0, 1), (-1, 1), HexColor('#d5dae6')),  # 设置第二行背景颜色# 合并 ('SPAN',(第一个方格的左上角坐标),(第二个方格的左上角坐标)),合并后的值为靠上一行的值,按照长方形合并('SPAN',(0,0),(0,1)),('SPAN',(1,0),(2,0)),('SPAN',(3,0),(4,0)),('SPAN',(5,0),(7,0)),('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 对齐('VALIGN', (-1, 0), (-2, 0), 'MIDDLE'),  # 对齐('LINEBEFORE', (0, 0), (0, -1), 0.1, colors.grey),  # 设置表格左边线颜色为灰色,线宽为0.1('TEXTCOLOR', (0, 0), (-1, 0), colors.royalblue),  # 设置表格内文字颜色('TEXTCOLOR', (0, -1), (-1, -1), colors.red),  # 设置表格内文字颜色('GRID', (0, 0), (-1, -1), 0.5, colors.grey),  # 设置表格框线为grey色,线宽为0.5]component_table = Table(dis_list, colWidths=colWidths,style=style)return component_table
Style=getSampleStyleSheet()
n = Style['Normal']
data = [[0,1,2,3,4,5,6,7],[00,11,22,33,44,55,66,77],[000,111,222,333,444,555,666,777],[0000,1111, 2222, 3333, 4444, 5555, 6666, 7777],]
z = table_model(data)
pdf = MyDocTemplate('ppff.pdf')
pdf.multiBuild([Paragraph('Title',n),z])

结果:

四、添加边框

#格式
from reportlab.graphics.shapes import Drawing
d = Drawing()
#参数有:d.width:边框宽度,d.heigth:边框高度,d.background:边框颜色等等。边框中可使用add()添加文字,图形等内容#Example
#例1:在边框中添加文字
from reportlab.graphics.shapes import Drawing, Rect
from reportlab.graphics.charts.textlabels import Label
def autoLegender( title=''):width = 448height = 230d = Drawing(width,height)lab = Label()lab.x = 220  #x和y是文字的位置坐标lab.y = 210lab.setText(title)# lab.fontName = 'song' #增加对中文字体的支持lab.fontSize = 20d.add(lab)d.background = Rect(0,0,width,height,strokeWidth=1,strokeColor="#868686",fillColor=None) #边框颜色return d
l = autoLegender('hello')
pdf=SimpleDocTemplate('ppff.pdf')
pdf.multiBuild([l])#例2:# **这种方法可以给边框中的图例添加颜色说明**
def autoLegender(chart, categories=[], use_colors=[], title=''):width = 448height = 230d = Drawing(width,height)lab = Label()lab.x = 220  #x和y是title文字的位置坐标lab.y = 210lab.setText(title)# lab.fontName = 'song' #增加对中文字体的支持lab.fontSize = 20d.add(lab)d.background = Rect(0,0,width,height,strokeWidth=1,strokeColor="#868686",fillColor=None) #边框颜色d.add(chart)#颜色图例说明等leg = Legend()leg.x = 500   # 说明的x轴坐标 leg.y = 0     # 说明的y轴坐标leg.boxAnchor = 'se'# leg.strokeWidth = 4leg.strokeColor = Noneleg.subCols[1].align = 'right'leg.columnMaximum = 10  # 图例说明一列最多显示的个数
# leg.fontName = 'song' leg.alignment = 'right' leg.colorNamePairs = zip(use_colors, tuple(categories)) #增加颜色说明 d.add(leg) return d

结果:

五、饼状图

#饼图需要添加在边框中
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate
from reportlab.graphics.shapes import Drawing, Rect
from reportlab.graphics.charts.textlabels import Label
from reportlab.graphics.charts.piecharts import Pie
def autoLegender( chart,title=''):width = 448height = 230d = Drawing(width,height)lab = Label()lab.x = 220  #x和y是文字的位置坐标lab.y = 210lab.setText(title)# lab.fontName = 'song' #增加对中文字体的支持lab.fontSize = 20d.add(lab)d.background = Rect(0,0,width,height,strokeWidth=1,strokeColor="#868686",fillColor=None) #边框颜色d.add(chart)return d
def draw_pie(data=[], labels=[], use_colors=[], width=360,):'''更多属性请查询reportlab.graphics.charts.piecharts.WedgeProperties'''pie = Pie()pie.x = 60 # x,y饼图在框中的坐标pie.y = 20pie.slices.label_boxStrokeColor = colors.white  #标签边框的颜色pie.data = data      # 饼图上的数据pie.labels = labels  # 数据的标签pie.simpleLabels = 0 # 0 标签在标注线的右侧;1 在线上边pie.sameRadii = 1    # 0 饼图是椭圆;1 饼图是圆形pie.slices.strokeColor = colors.red       # 圆饼的边界颜色pie.strokeWidth=1                         # 圆饼周围空白区域的宽度pie.strokeColor= colors.white             # 整体饼图边界的颜色pie.slices.label_pointer_piePad = 10       # 圆饼和标签的距离pie.slices.label_pointer_edgePad = 25    # 标签和外边框的距离pie.width = widthpie.direction = 'clockwise'pie.pointerLabelMode  = 'LeftRight'# for i in range(len(labels)):#     pie.slices[i].fontName = 'song' #设置中文for i, col in enumerate(use_colors):pie.slices[i].fillColor  = colreturn pie
data = [10,9,8,7,6,5,4,3,2,1]
labs = ['0000000','1111111','2222222','3333333','4444444','5555555','6666666','7777777','8888888','9999999']
color = [HexColor("#696969"),HexColor("#A9A9A9"),HexColor("#D8BFD8"),HexColor("#DCDCDC"),HexColor('#E6E6FA'),HexColor("#B0C4DE"),HexColor("#778899"),HexColor('#B0C4DE'),HexColor("#6495ED"),HexColor("#483D8B")]
z = autoLegender(draw_pie(data,labs,color),labs,color)
pdf=SimpleDocTemplate('ppff.pdf')
pdf.multiBuild([z])

结果:

六、柱状图

#柱状图需要添加在边框中
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.lib.colors import HexColor
def draw_bar_chart(min, max, x_list, data=[()], x_label_angle=0, bar_color=HexColor("#7BB8E7"), height=125, width=280):''':param min: 设置y轴的最小值:param max: 设置y轴的最大值:param x_list: x轴上的标签:param data: y轴对应标签的值:param x_label_angle: x轴上标签的倾斜角度:param bar_color: 柱的颜色  可以是含有多种颜色的列表:param height: 柱状图的高度:param width: 柱状图的宽度:return: '''bc = VerticalBarChart()bc.x = 50            # x和y是柱状图在框中的坐标bc.y = 50bc.height = height  # 柱状图的高度bc.width = width    # 柱状图的宽度bc.data = data      for j in xrange(len(x_list)):setattr(bc.bars[j], 'fillColor', bar_color)  # bar_color若含有多种颜色在这里分配bar_color[j]# 调整stepminv = min * 0.5maxv = max * 1.5maxAxis = int(height/10)# 向上取整minStep = int((maxv-minv+maxAxis-1)/maxAxis)bc.valueAxis.valueMin = min * 0.5      #设置y轴的最小值bc.valueAxis.valueMax = max * 1.5      #设置y轴的最大值bc.valueAxis.valueStep = (max-min)/4   #设置y轴的最小度量单位if bc.valueAxis.valueStep < minStep:bc.valueAxis.valueStep = minStepif bc.valueAxis.valueStep == 0:bc.valueAxis.valueStep = 1bc.categoryAxis.labels.boxAnchor = 'ne'   # x轴下方标签坐标的开口方向bc.categoryAxis.labels.dx = -5           # x和y是x轴下方的标签距离x轴远近的坐标bc.categoryAxis.labels.dy = -5bc.categoryAxis.labels.angle = x_label_angle   # x轴上描述文字的倾斜角度# bc.categoryAxis.labels.fontName = 'song'x_real_list = []if len(x_list) > 10:for i in range(len(x_list)):tmp = '' if i%5 != 0 else x_list[i]x_real_list.append(tmp)else:x_real_list = x_listbc.categoryAxis.categoryNames = x_real_listreturn bc
z = autoLegender(draw_bar_chart(100, 300, ['a', 'b', 'c'], [(100, 200, 120)]))
pdf=SimpleDocTemplate('ppff.pdf')
pdf.multiBuild([z])

结果:

七、累加柱状图

def draw_2bar_chart(min, max, x_list, data=[()],array=[()], x_label_angle=0,bar_color=[],height=125, width=280):''':param min: 设置y轴的最小值:param max: 设置y轴的最大值:param x_list: x轴上的标签:param data: y轴对应标签的值:param x_label_angle: x轴上标签的倾斜角度:param bar_color: 柱的颜色  可以是含有多种颜色的列表:param height: 柱状图的高度:param width: 柱状图的宽度:return: '''bc = VerticalBarChart()bc.x = 50            # x和y是柱状图在框中的坐标bc.y = 50bc.height = height  # 柱状图的高度bc.width = width    # 柱状图的宽度bc.data = data# 图形柱上标注文字bc.barLabels.nudge = -5  # 文字在图形柱的上下位置bc.barLabelArray = array  # 要添加的文字bc.barLabelFormat = 'values'for j in xrange(len(data)):setattr(bc.bars[j], 'fillColor', bar_color[j])  # bar_color若含有多种颜色在这里分配bar_color[j]# 调整step# minv = min * 0.5minv = 0maxv = max * 1.5maxAxis = int(height/10)# 向上取整minStep = int((maxv-minv+maxAxis-1)/maxAxis)bc.valueAxis.valueMin =0      #设置y轴的最小值bc.valueAxis.valueMax = max * 1.5      #设置y轴的最大值bc.valueAxis.valueStep = (max-min)/4   #设置y轴的最小度量单位if bc.valueAxis.valueStep < minStep:bc.valueAxis.valueStep = minStepif bc.valueAxis.valueStep == 0:bc.valueAxis.valueStep = 1bc.categoryAxis.labels.boxAnchor = 'ne'   # x轴下方标签坐标的开口方向bc.categoryAxis.labels.dx = -5           # x和y是x轴下方的标签距离x轴远近的坐标bc.categoryAxis.labels.dy = -5bc.categoryAxis.labels.angle = x_label_angle   # x轴上描述文字的倾斜角度# bc.categoryAxis.labels.fontName = 'song'bc.categoryAxis.style = 'stacked'x_real_list = []if len(x_list) > 10:for i in range(len(x_list)):tmp = '' if i%5 != 0 else x_list[i]x_real_list.append(tmp)else:x_real_list = x_listbc.categoryAxis.categoryNames = x_real_listreturn bc
#绘制柱状图
Style=getSampleStyleSheet()
n = Style['Normal']
my_color = [HexColor('#E13C3C'),HexColor('#BE0000')]
z = autoLegender(draw_2bar_chart(100, 300, ['a', 'b', 'c'],[(100, 200, 120),(150, 50, 130)],bar_color=my_color,array=[['100','200','120'],['150','50','130']] ),categories=['first','last'],use_colors=my_color)
pdf = MyDocTemplate('ppff.pdf')
pdf.multiBuild([Paragraph('Title',n),z])

结果:

八、添加页眉

#添加页眉需要我们自定义模版
from reportlab.platypus.doctemplate import BaseDocTemplate, Frame
from reportlab.lib.units import cm
from reportlab.platypus import PageTemplate
from reportlab.lib.styles import getSampleStyleSheet
import os
def myMainPageFrame(canvas, doc):  # 全局应用"The page frame used for all PDF documents."canvas.saveState()canvas.setFont('Times-Roman', 12)pageNumber = canvas.getPageNumber()if pageNumber > 0:pic_yemei = os.path.join(os.path.dirname(__file__),'yemei01.jpg')   # 页眉图片pic_line_file = os.path.join(os.path.dirname(__file__),'line.jpg')  # 页眉线canvas.drawImage(pic_yemei, 75, 795, width=100,height=25)canvas.drawImage(pic_line_file, 75, 780, width=450, height=15)canvas.drawString(10*cm, cm, str(pageNumber))canvas.restoreState()
class MyDocTemplate(BaseDocTemplate):  # 自定义模版类"The document template used for all PDF documents."_invalidInitArgs = ('pageTemplates',)def __init__(self, filename, **kw):frame1 = Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')self.allowSplitting = 0BaseDocTemplate.__init__(self, filename, **kw)template = PageTemplate('normal', [frame1], myMainPageFrame)self.addPageTemplates(template)   # 绑定全局应用
Style=getSampleStyleSheet()
n = Style['Normal']
z = autoLegender(draw_bar_chart(100, 300, ['a', 'b', 'c'], [(100, 200, 120)]))
pdf = MyDocTemplate('ppff.pdf')
pdf.multiBuild([Paragraph('Title',n),z])

结果:

九、太阳黑子例子

#sunspot_new.py
#太阳黑子(sunspot)
#文件读写import模块
import os
#使用shapes可以画出复杂的形状
from reportlab.graphics.shapes import *
#chars包里包含许多常用的图形
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.textlabels import Label
#用于渲染PDF文件
from reportlab.graphics import renderPDF
URL = 'Predict.txt'#txt文件所在位置,与本py文件放在同一文件下
COMMENT_CHAR = '#:'#开头为#/:的行不会读入列表之中
drawing = Drawing(400, 200)#添加边框,其中width为边框宽度,heigth为边框高度,background为边框颜色
data = []#数据列表定义,此时data为空
for line in open(URL).readlines():#逐行读取txt文件里的内容#isspace检测字符串是否只由空格组成#line[0] not in COMMENT_CHAR判断开头符号或字母是否为#/:if not line.isspace() and line[0] not in COMMENT_CHAR:#将txt文件内容的数据按空格分隔,转化为float类型追加到data列表data.append([float(n) for n in line.split()])#作出10.7 cm Radio Flux三线图,本质是提取用于画图的数据
pred = [row[5] for row in data]#读取10.7 cm Radio Flux的PREDICTED列数据
high = [row[6] for row in data]#读取10.7 cm Radio Flux的HIGH列数据
low = [row[7] for row in data]#读取10.7 cm Radio Flux的LOW列数据
times = [row[0] + row[1]/12.0 for row in data]#得到日期数据lp = LinePlot()#创建ReportLab画图
lp.x = 50#坐标轴中心坐标
lp.y = 50#坐标轴中心坐标
lp.height = 125#坐标轴高度
lp.width = 300#坐标轴宽度
#zip函数将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
#list函数用于将元组转换为列表
lp.data = [list(zip(times,pred)),list(zip(times,high)), list(zip(times, low))]
lp.lines[0].strokeColor = colors.blue#线条颜色为蓝色
lp.lines[1].strokeColor = colors.red#线条颜色为红色
lp.lines[2].strokeColor = colors.green#线条颜色为绿色
#将LinePlot类添加到Drawing
drawing.add(lp)
#确定图形中'Sunspots'的样式,字体14,填充颜色为绿色,最终添加一个String对象到Drawing中
drawing.add(String(250, 150, 'Sunspots', fontSize = 14, fillColor = colors.green))
#RenderPDF.drawToFile是把内容保存到pdf文件中
renderPDF.drawToFile(drawing, 'report.pdf', 'Sunspot')

python reportlab模块相关推荐

  1. Python Re 模块超全解读!详细

    内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...

  2. python argparse模块_Python argparse模块应用实例解析

    这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...

  3. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

  4. python高级-模块(14)

    一.python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入math.h这个头文件,否则是无法正常进行调用的. ...

  5. 转载: Python os 模块的功能以及子函数介绍

    原文链接: python之os模块 - 程序生(Codey) - 博客园 https://www.cnblogs.com/cxscode/p/8085326.html 一.Python OS模块介绍 ...

  6. 简单介绍python process模块

    在python中大部分情况需要使用多进程,python提供了multiprocessing模块.multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,提供了Pr ...

  7. python io模块_python中的StringIO模块

    原博文 2015-10-23 15:21 − # python中的StringIO模块 标签:python StringIO --- > 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的, ...

  8. python正则表达式需要模块_使用Python正则表达式模块,让操作更加简单

    处理文本数据的一个主要任务就是创建许多以文本为基础的特性. 人们可能想要在文本中找出特定格式的内容,比如找出存在于文本中的电子邮件,或者大型文本中的电话号码. 虽然想要实现上述功能听起来很繁琐,但是如 ...

  9. python导入模块有同名_Python:导入与函数同名的模块

    背景:第一次在SE上提问.我在 Python方面还很陌生,而且在编程方面也不是很有经验.我已经四处寻找,但我没有找到这个问题的答案,我非常感谢你的帮助. 我的问题是:如何导入与函数同名的模块? 具体来 ...

  10. python第三方模块—psutil模块

    系统基础信息采集模块作为监控模块的重要组成部分,能够帮助运维人员了解当前系统的健康程度,同时也是衡量业务的服务质量的依据,比如系统资源吃紧,会直接影响业务的服务质量及用户体验,另外获取设备的流量信息, ...

最新文章

  1. Numpy中的meshgrid()函数
  2. RDA PQ工具使用 (Adi Analysis)
  3. c++注释快捷键_Java编程之常用快捷键
  4. 2020中国男士美妆市场洞察报告
  5. Ubuntu16.04 UltraEdit 安装破解使用
  6. Linux内核:Gigantic巨页与CMA的结合的PATCH补丁提交
  7. vSphere 7 With K8s系列07:客户端工具使用
  8. php中GD库的简单使用
  9. C++学习笔记(达内视频版)
  10. 基于android的超级记事本,超级记事本基于设计论文
  11. 机房收费系统---概要设计说明书
  12. 4月上旬国内域名商净增量Top10:联动天下跻身第10
  13. winows+Eclipse下Mahout配置
  14. Altium Designer之泪点和常规铺铜操作笔记
  15. 大学计算机高海波目录,《大学计算机基础》TOC课程教学大纲(定稿3ok).doc
  16. Excel 防止一列重复输入
  17. Gherkin语法详解之DataTable(三)
  18. LeetCode 链表 队列 栈的问题
  19. 小白鼠与毒药解题过程分析
  20. 正则表达式验证手机号、身份证号

热门文章

  1. linux进程调度时间片算法,进程调度算法–时间片轮转调度算法
  2. 掌握QCC推行方法,为企业创造经济效益
  3. DIY_实现光敏电阻传感器简单控制LED
  4. HTML5生日快乐代码 (烟花蛋糕+3D相册) HTML+CSS+JavaScript
  5. 网络工程专业大学生,需要考HICE吗?
  6. Swift 圆形进度条
  7. 数据结构 实验1——一元多项式的表示与相加
  8. 先进的分销管理系统(ADMS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. Java设计模式实战 ~ 总目录
  10. RHCSA8考试-root密码破解