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

安装:pip install reportlab

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

1.注册中文字体

下载自己需要的.ttf字体,例如STSONG.ttf

from reportlab.pdfbase import pdfmetrics

from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('song', STSONG.ttf))

2.生成文字

from reportlab.lib.styles importgetSampleStyleSheetfrom reportlab.platypus importParagraph,SimpleDocTemplatefrom reportlab.lib importcolors

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=12ct.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  右对齐

3.表格

from reportlab.platypus import  Table

t = Table(data)

from reportlab.platypus importParagraph, SimpleDocTemplate, Table,TableStylefrom reportlab.lib.units importinchfrom reportlab.lib importcolorsdeftable_model(data):

width= 7.2 #总宽度

colWidths = (width / len(data[0])) * inch #每列的宽度

dis_list=[]for x indata:#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)returncomponent_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])

4.添加边框

from reportlab.graphics.shapes import Drawing

d = Drawing()

参数有:

d.width:边框宽度

d.heigth:边框高度

d.background:边框颜色

等等。

边框中可使用add()添加文字,图形等内容

例:

在边框中添加文字

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) #边框颜色

returnd

l= autoLegender('hello')

pdf=SimpleDocTemplate('ppff.pdf')

pdf.multiBuild([l])

# **这种方法可以给边框中的图例添加颜色说明**

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 = 4

leg.strokeColor =None

leg.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

5.饼状图

饼图需要添加在边框中

from reportlab.lib importcolorsfrom reportlab.platypus importSimpleDocTemplatefrom reportlab.graphics.shapes importDrawing, Rectfrom reportlab.graphics.charts.textlabels importLabelfrom reportlab.graphics.charts.piecharts importPiedef 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)returnddef 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 =width

pie.direction= 'clockwise'pie.pointerLabelMode= 'LeftRight'

#for i in range(len(labels)):

#pie.slices[i].fontName = 'song' #设置中文

for i, col inenumerate(use_colors):

pie.slices[i].fillColor=colreturnpie

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])

6.柱状图

柱状图需要添加在边框中

from reportlab.graphics.charts.barcharts importVerticalBarChartfrom reportlab.lib.colors importHexColordef 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 =datafor j inxrange(len(x_list)):

setattr(bc.bars[j],'fillColor', bar_color) #bar_color若含有多种颜色在这里分配bar_color[j]

#调整step

minv = 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

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 inrange(len(x_list)):

tmp= '' if i%5 != 0 elsex_list[i]

x_real_list.append(tmp)else:

x_real_list=x_list

bc.categoryAxis.categoryNames=x_real_listreturnbc

z= autoLegender(draw_bar_chart(100, 300, ['a', 'b', 'c'], [(100, 200, 120)]))

pdf=SimpleDocTemplate('ppff.pdf')

pdf.multiBuild([z])

6.累加柱状图

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 inxrange(len(data)):

setattr(bc.bars[j],'fillColor', bar_color[j]) #bar_color若含有多种颜色在这里分配bar_color[j]

#调整step

#minv = min * 0.5

minv =0

maxv= 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

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 inrange(len(x_list)):

tmp= '' if i%5 != 0 elsex_list[i]

x_real_list.append(tmp)else:

x_real_list=x_list

bc.categoryAxis.categoryNames=x_real_listreturnbc#制柱状图

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])

7.添加页眉

添加页眉需要我们自定义模版

from reportlab.platypus.doctemplate importBaseDocTemplate, Framefrom reportlab.lib.units importcmfrom reportlab.platypus importPageTemplatefrom reportlab.lib.styles importgetSampleStyleSheetimportosdef 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=0

BaseDocTemplate.__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])

python report_python之Reportlab模块相关推荐

  1. Python实战之logging模块使用详解

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...

  2. 【廖雪峰python进阶笔记】模块

    1. 导入模块 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导入 ...

  3. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

  4. Python标准库threading模块Condition原理浅析

    Python标准库threading模块Condition原理浅析 本文环境python3.5.2 threading模块Condition的实现思路 在Python的多线程实现过程中,在Linux平 ...

  5. Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...

  6. python之堆heapq模块

    python之堆heapq模块 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆. ...

  7. python自定义包或模块在Linux服务器导入错误的解决办法

    python自定义包或模块在Linux服务器导入错误的解决办法 在本地机器上跑python代码,自己定义的文件进行导包运行是没有问题,但是放到linux服务器上的时候就会提示 ImportError: ...

  8. python代码使用正则化模块re检查字符串是否只含有要求指定的字符

    python代码使用正则化模块re检查字符串是否只含有要求指定的字符 compile():正则表达式被编译成模式对象,模式对象具有用于各种操作的方法,如搜索模式匹配或执行字符串替换. search() ...

  9. Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤

    前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...

  10. Python图像处理,cv2模块,OpenCV实现目标跟踪

    前言 利用Python实现OpenCV目标跟踪.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装 ...

最新文章

  1. 激辩:机器究竟能否理解常识?
  2. Llinux课程计划安排
  3. UseCase事件描述叙事流规范
  4. C++如何实现DNS域名解析转
  5. requestWindowFeature()的应用
  6. Android华容道之一步一步实现-2-图片分割
  7. ASP+AJAX制作无刷新新闻评论系统01
  8. dj电商-数据库的远程连接
  9. AI前沿 | Gartner曲线5大趋势:传感和移动、超能人类、自动机器人、高级人工智能…...
  10. 云栖科技评论第57期:技术拓展科学边界 科学激发技术创新
  11. shell脚本实例-命令记录
  12. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
  13. volatile工作原理学习总结
  14. cad批量打印_CAD插件——批量打印软件安装包+安装教程
  15. linux 查找文件及根据条件搜索文件内容
  16. 计算机英语专业摘要,推荐:计算机毕业论文英文摘要的写作方法
  17. 素数判断和大合数分解_素数合数分解公式与原理 质数秘密已解开
  18. java-nio网络编程
  19. 内网实现电视盒子访问PC
  20. 2018/02/12

热门文章

  1. React全栈项目——京东商城
  2. S3 api 断点下载
  3. 区位码、国标码、机内码的区别和内在机制
  4. 阿里播放器使用Aliplayer
  5. 混淆矩阵 (Confusion Matrix)
  6. 数据结构实验1 集合的交、并、差
  7. 订购国际机票的常用指令
  8. 自定义微信小程序弹框
  9. 如何按行政区划下载谷歌卫星地图并裁剪
  10. 【企业微信点餐系统】