python的reportlab库介绍制作pdf和作图
1 说明
1.1 reportlab模块是用python语言生成pdf文件的模块,也可以作图。
1.2 已经亲测,拿来就可以使用,适合收藏,万一自己需要就可以直接使用。
1.3 环境:python3.8,deepin-linux深度操作系统和微软编辑器vscode。
2 安装:pip install reportlab #pip3.8 install reportlab #本机安装
3 Helloworld.pdf代码:from reportlab.graphics.shapes import Drawing, String from reportlab.graphics import renderPDF #参数:Drawing(width=400, height=200, *nodes, **keywords) #宽和高,是一张pdf的大小,默认是400和200 d = Drawing(100, 100) #参数:String(x, y, text, **kw) #注意textAnchor="middle"时x值不能等于0,否则只能显示world了。 #s = String(50, 90, "Hello, world!", textAnchor="middle") #注意特色,左下角坐标是0,0,采用默认字体和大小 s = String(0, 90, "Hello, world!") d.add(s) #生成pdf的路径和文件名 renderPDF.drawToFile(d, "/home/xgj/Desktop/reportlab/helloworld.pdf")
4 中文设置123.pdf
代码:#引入所需要的基本包 from reportlab.pdfgen import canvas from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont #自己下载字体放在指定目录,hwfs=华文仿宋 pdfmetrics.registerFont(TTFont("hwfs", "/home/xgj/Desktop/reportlab/hwfs.ttf")) #生成123的pdf文件和指定目录 c=canvas.Canvas("/home/xgj/Desktop/reportlab/123.pdf") #导入字体和大小色孩子 c.setFont("hwfs", 20) message= "Hello,你好,欢迎学习reportlab制作pdf!" #注意下面坐标x和y,当(0,0)是代表左下角 #一张pdf的高800,所以第一行800,再大就出 c.drawString(50,800,message) c.showPage() c.save()
5 柱状图bar.py代码from reportlab.graphics.charts.barcharts import VerticalBarChart from reportlab.lib.colors import HexColor 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 = 448 height = 230 d = Drawing(width,height) lab = Label() lab.x = 220 #x和y是文字的位置坐标 lab.y = 210 lab.setText(title) lab.fontSize = 20 d.add(lab) d.background = Rect(0,0,width,height,strokeWidth=1,strokeColor="#868686",fillColor=None) #边框颜色 d.add(chart) return d def draw_bar_chart(min, max, x_list, data=[()], x_label_angle=0, bar_color=HexColor("#7BB8E7"), height=125, width=280): bc = VerticalBarChart() bc.x = 50 # x和y是柱状图在框中的坐标 bc.y = 50 bc.height = height # 柱状图的高度 bc.width = width # 柱状图的宽度 bc.data = data for j in range(len(x_list)): setattr(bc.bars[j], "fillColor", bar_color) # 调整step minv = min * 0.5 maxv = max * 1.5 maxAxis = 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 = minStep if bc.valueAxis.valueStep == 0: bc.valueAxis.valueStep = 1 bc.categoryAxis.labels.boxAnchor = "ne" # x轴下方标签坐标的开口方向 bc.categoryAxis.labels.dx = -5 # x和y是x轴下方的标签距离x轴远近的坐标 bc.categoryAxis.labels.dy = -5 bc.categoryAxis.labels.angle = x_label_angle # x轴上描述文字的倾斜角度 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_list bc.categoryAxis.categoryNames = x_real_list return bc #画图 z = autoLegender(draw_bar_chart(100, 300, ["a", "b", "c"], [(100, 200, 120)])) #保存路径和文件 pdf=SimpleDocTemplate("/home/xgj/Desktop/reportlab/bar.pdf") #构建 pdf.multiBuild([z])
6 折线图line.py代码#---导出模块--- #导出追踪模块,python的一个知识点 import traceback #导出作图的相关模块 from reportlab.graphics.shapes import Drawing from reportlab.graphics.charts.lineplots import LinePlot from reportlab.graphics.charts.textlabels import Label from reportlab.graphics import renderPDF from reportlab.graphics.widgets.markers import makeMarker #---附加:导出字体设置模块,如果是英文,就不需要 from reportlab.pdfbase import pdfmetrics, ttfonts #若需要显示中文,需要先注册一个中文字体,hwfs自己下载,这个是根目录下,也可以指定位置 pdfmetrics.registerFont(ttfonts.TTFont("hwfs", "hwfs.ttf")) #---注意data的类型 #每一个数据点是一个元组 #一条曲线对应一个存储数据点元组的元组 #一个图形可以包含多条曲线,用列表存储曲线元组 data=[((1,100),(2,200),(3,300),(4,400),(5,500)), ((1,50),(2,80),(3,400),(4,40),(5,70))] #定义画布大小 drawing = Drawing(500, 300) #划线设置 lp = LinePlot() lp.x = 50 #坐标轴中心坐标 lp.y = 30 #这个作图的大小与画布大小稍微小一点 lp.height = 250 lp.width = 400 lp.data = data lp.joinedLines = 1 lp.lines.symbol = makeMarker("FilledCircle") #刻度设置 lp.xValueAxis.valueMin = 1 lp.xValueAxis.valueMax = 5 lp.xValueAxis.valueStep = 1 #刻度设置 lp.yValueAxis.valueMin = 0 lp.yValueAxis.valueMax = 500 lp.yValueAxis.valueStep = 100 drawing.add(lp) #---文字标签设置: # 标题 title = Label() title.fontName = "hwfs" title.fontSize = 12 title_text="折线图" title._text = title_text title.x = 250 title.y = 280 title.textAnchor ="middle" drawing.add(title) #标签x的显示 Xlabel = Label() Xlabel._text = "x坐标轴" Xlabel.fontSize = 12 Xlabel.x = 480 Xlabel.y = 30 Xlabel.fontName = "hwfs" Xlabel.textAnchor ="middle" drawing.add(Xlabel) #标签y的显示 Ylabel = Label() Ylabel._text = "y坐标轴" Ylabel.fontSize = 12 Ylabel.x = 40 Ylabel.y = 295 Ylabel.fontName = "hwfs" Ylabel.textAnchor ="middle" drawing.add(Ylabel) try: #保存格式gif,文件名:abc;路径当前目录,这个归功于import traceback,所以outdir的设置就是当前位置 drawing.save(formats=["gif"],outDir=".",fnRoot="abc") except: traceback.print_exc()
7 饼图pie.py代码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 from reportlab.lib.colors import HexColor def autoLegender(chart,title=""): width = 448 height = 230 d = Drawing(width,height) lab = Label() lab.x = 220 #x和y是文字的位置坐标 lab.y = 210 lab.setText(title) lab.fontSize = 20 d.add(lab) #边框颜色和填充颜色 d.background = Rect(0,0,width,height,strokeWidth=1,strokeColor="#45b97c",fillColor="#78cdd1") d.add(chart) return d def draw_pie(data=[], labels=[], use_colors=[], width=360,): pie = Pie() pie.x = 60 # x,y饼图在框中的坐标 pie.y = 20 pie.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, col in enumerate(use_colors): pie.slices[i].fillColor = col return pie #数据和颜色定义,对应关系 data = [10,9,8,7,6,5,4,3,2,1] labs = ["dog","pig","cat","bird","mouse", "fish","cow","sheep","horse","fly"] color = [HexColor("#f47920"),HexColor("#ef5b9c"),HexColor("#b2d235"), HexColor("#181d4b"),HexColor("#f58220"),HexColor("#7fb80e"), HexColor("#585eaa"),HexColor("#1d953f"),HexColor("#ef4136"), HexColor("#483D8B") ] z = autoLegender(draw_pie(data,labs,color)) pdf=SimpleDocTemplate("/home/xgj/Desktop/reportlab/pie.pdf") pdf.multiBuild([z])
8 段落式中英文parahello.py代码from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import Paragraph,SimpleDocTemplate from reportlab.lib import colors #导入中文字体设置模块 from reportlab.pdfbase import pdfmetrics, ttfonts #若需要显示中文,需要先注册一个中文字体 pdfmetrics.registerFont(ttfonts.TTFont("hwfs", "/home/xgj/Desktop/reportlab/hwfs.ttf")) Style=getSampleStyleSheet() bt = Style["Normal"] #字体的样式 bt.fontName="hwfs" #使用的字体 bt.fontSize=14 #字号大小设置 bt.wordWrap = "CJK" #该属性支持自动换行,"CJK"是中文模式换行,用于英文中会截断单词造成阅读困难,可改为"Normal" bt.firstLineIndent = 1 #该属性支持第一行开头空格,注意如果设置bt.alignment=1 #居中,那么这个设置就是多余 bt.leading = 20 #该属性是设置行距,注意与字体大小的关系,一般偏大一点,否则挤在一行 #bt.alignment=1 #居中 bt.textColor = colors.red t = Paragraph("Hello,你好,欢迎光临,我是reportlab;Hello,你好,欢迎光临,我是reportlab;Hello,你好,欢迎光临,我是reportlab",bt) pdf=SimpleDocTemplate("/home/xgj/Desktop/reportlab/parahello.pdf") pdf.multiBuild([t])
自己整理,分享出来,希望喜欢,重点在制作pdf,不在作图,但是如果有文字,有表格,有作图,那么肯定是有优势的。
==========未完待续==========
下次有空介绍高级的。