linux存储pdf伟岸_python的reportlab库介绍、制作pdf和作图
发布日期:2021-06-24 10:54:20 浏览次数:4 分类:技术文章

本文共 8014 字,大约阅读时间需要 26 分钟。

1 说明

1.1 reportlab模块是用python语言生成pdf文件的模块,也可以作图。

1.2 已经亲测,拿来就可以使用,适合收藏,万一自己需要就可以直接使用。

1.3 环境:python3.8,deepin-linux深度操作系统和微软编辑器vscode。

b43df52e4942e4b15286f07c5e1d9cfb.png

2 安装:

pip install reportlab#pip3.8 install reportlab      #本机安装

3 Helloworld.pdf代码:

from reportlab.graphics.shapes import Drawing, Stringfrom reportlab.graphics import renderPDF#参数:Drawing(width=400, height=200, *nodes, **keywords)#宽和高,是一张pdf的大小,默认是400和200d = 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')
23ef135aeedd0ac47378d99912ae1b3d.png

4 中文设置123.pdf

代码:

#引入所需要的基本包from reportlab.pdfgen import canvasfrom reportlab.pdfbase import pdfmetricsfrom 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()
4f69484b932d132fbff73255eb8011b7.png

5 柱状图bar.py代码

from reportlab.graphics.charts.barcharts import VerticalBarChartfrom reportlab.lib.colors import HexColorfrom reportlab.platypus import SimpleDocTemplatefrom reportlab.graphics.shapes import Drawing, Rectfrom reportlab.graphics.charts.textlabels import Labelfrom reportlab.graphics.charts.piecharts import Pie#定义作图def autoLegender( chart,):    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 ddef 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])
63925a358ae542b66c61c5ae6830d415.png

6 折线图line.py代码

#---导出模块---#导出追踪模块,python的一个知识点import traceback#导出作图的相关模块from reportlab.graphics.shapes import Drawingfrom reportlab.graphics.charts.lineplots import LinePlotfrom reportlab.graphics.charts.textlabels import Labelfrom reportlab.graphics import renderPDFfrom 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 = 250lp.width = 400lp.data = datalp.joinedLines = 1lp.lines.symbol = makeMarker('FilledCircle')#刻度设置lp.xValueAxis.valueMin = 1lp.xValueAxis.valueMax = 5lp.xValueAxis.valueStep = 1#刻度设置lp.yValueAxis.valueMin = 0lp.yValueAxis.valueMax = 500lp.yValueAxis.valueStep = 100drawing.add(lp)#---文字标签设置:# 标题title = Label()title.fontName   = "hwfs"title.fontSize   = 12title_text='折线图'title._text = title_texttitle.x          = 250title.y          = 280title.textAnchor ='middle'drawing.add(title)#标签x的显示Xlabel = Label()Xlabel._text = 'x坐标轴'Xlabel.fontSize   = 12Xlabel.x          = 480Xlabel.y          = 30Xlabel.fontName   = "hwfs"Xlabel.textAnchor ='middle'drawing.add(Xlabel)#标签y的显示Ylabel = Label()Ylabel._text = "y坐标轴"Ylabel.fontSize   = 12Ylabel.x          = 40Ylabel.y          = 295Ylabel.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()
316c3ae252d4a60689c6784bacfb47ce.png

7 饼图pie.py代码

from reportlab.lib import colorsfrom reportlab.platypus import SimpleDocTemplatefrom reportlab.graphics.shapes import Drawing, Rectfrom reportlab.graphics.charts.textlabels import Labelfrom reportlab.graphics.charts.piecharts import Piefrom reportlab.lib.colors import HexColordef autoLegender(chart,):    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 ddef 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])
6390abbb1b54ff99fafb3e17e2b8fe0d.png

8 段落式中英文parahello.py代码

from reportlab.lib.styles import getSampleStyleSheetfrom reportlab.platypus import Paragraph,SimpleDocTemplatefrom 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.redt = Paragraph('Hello,你好,欢迎光临,我是reportlab;Hello,你好,欢迎光临,我是reportlab;Hello,你好,欢迎光临,我是reportlab',bt)pdf=SimpleDocTemplate('/home/xgj/Desktop/reportlab/parahello.pdf')pdf.multiBuild([t])
e4600a9959d877d3572a3ddcae272563.png

自己整理,分享出来,希望喜欢,重点在制作pdf,不在作图,但是如果有文字,有表格,有作图,那么肯定是有优势的。

==========未完待续==========

下次有空介绍高级的。

转载地址:https://blog.csdn.net/weixin_32309879/article/details/112148532 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安徽信息技术初中会考上机考试模拟_2020年中小学寒假、考试时间定下了!
下一篇:emwin edit控制的输入长度小数点怎么处理_DC综合后处理

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月24日 05时24分36秒