1 说明

1.1 reportlab高级制作多格式PDF:即包含文字、表格、柱状图。

1.2 复习python的class和装饰器的高级基础知识。

1.3 列表转换字符串、读取txt文件等python基础知识。

1.4 经典,通俗易懂,适合收藏和转发。

2 reportlab高级制作多格式PDF

2.1 代码

#---导入模块---有点多,且繁琐,可以优化---from reportlab.platypus import Table, SimpleDocTemplate, Paragraphfrom reportlab.lib.pagesizes import letterfrom reportlab.lib.styles import getSampleStyleSheetfrom reportlab.lib import colorsfrom reportlab.graphics.charts.barcharts import VerticalBarChartfrom reportlab.graphics.charts.legends import Legendfrom reportlab.graphics.shapes import Drawing#---导入中文字体模块和注册---from reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFont#hwfs是hwfs字体,自己下载,放在根目录下pdfmetrics.registerFont(TTFont('hwfs', 'hwfs.ttf'))#---定义类---class Graphs:    def __init__(self):        pass    # 装饰器:绘制标题    @staticmethod    def draw_title():        style = getSampleStyleSheet()        #格式        ct = style['Normal']        #字体名,上面已经注册过的        ct.fontName = 'hwfs'        #字体大小        ct.fontSize = 18        # 设置行距        ct.leading = 50        # 颜色        ct.textColor = colors.green        # 居中        ct.alignment = 1        # 添加标题并居        title = Paragraph('reportlab高级制作PDF', ct)        return title    # 绘制内容    @staticmethod    def draw_text():        style = getSampleStyleSheet()        # 常规字体(非粗体或斜体)        ct = style['Normal']        # 使用的字体s        ct.fontName = 'hwfs'        ct.fontSize = 14        # 设置自动换行        ct.wordWrap = 'CJK'        # 居左对齐        ct.alignment = 0        # 第一行开头空格        ct.firstLineIndent = 32        # 设置行距        ct.leading = 30        #格式:Paragraph(text, style, bulletText=None, frags=None, caseSensitive=1, encoding='utf8')        #注意文件目录和文件内容,调用外部txt文件内容        with open('/home/xgj/Desktop/reportlab/2.txt','r') as f:            #读取全部,返回一个列表            text2 = f.readlines()            #列表转换为字符串,返回是一大串字符串,如果文字较多而且有分段落的,可能就不适合。            text1 = ''.join(text2)            #print(text1)        text=Paragraph(text1,ct)        return text    # 绘制表格    @staticmethod    def draw_table(*args):        #宽度        col_width = 60        #表格样式设置        style = [            ('FONTNAME', (0, 0), (-1, -1), 'hwfs'),# 字体            ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'),# 设置第一行背景颜色            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),# 对齐            ('VALIGN', (-1, 0), (-2, 0), 'MIDDLE'),# 对齐            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),# 设置表格框线为grey色,线宽为0.5            ]        table = Table(args, colWidths=col_width, style=style)        return table    # 创建图表    @staticmethod    def draw_bar(bar_data=[], ax=[], items=[]):        #画布大小        drawing = Drawing(500, 250)        bc = VerticalBarChart()        bc.x = 35        bc.y = 100        bc.height = 120        bc.width = 350        bc.data = bar_data        bc.strokeColor = colors.black        bc.valueAxis.valueMin = 0        bc.valueAxis.valueMax = 100        bc.valueAxis.valueStep = 10        bc.categoryAxis.labels.dx = 8        bc.categoryAxis.labels.dy = -10        bc.categoryAxis.labels.angle = 20        bc.categoryAxis.categoryNames = ax        # 图示        leg = Legend()        leg.fontName = 'hwfs'        leg.alignment = 'right'        leg.boxAnchor = 'ne'        leg.x = 465        leg.y = 220        leg.dxTextSpace = 10        leg.columnMaximum = 3        leg.colorNamePairs = items        drawing.add(leg)        drawing.add(bc)        return drawingif __name__ == "__main__":    #生成的pdf的内容    #content = list()    content=[]    # 第一:文章的标题    content.append(Graphs.draw_title())    # 第二:添加文章的文字段落    content.append(Graphs.draw_text())    # 第三:表格:    # 表格数据    data = [    ('项目', '2019-11', '2019-12', '2020-1', '2020-2', '2020-3', '2020-4'),    ('python', 50, 80, 60, 35, 40, 45),    ('JavaScript', 25, 60, 55, 45, 60, 80),    ('c++', 30, 90, 75, 80, 50, 46)]    #添加表格    content.append(Graphs.draw_table(*data))    # 第四:图表    #图标的数据    b_data = [        (50, 80, 60, 35, 40, 45),         (25, 60, 55, 45, 60, 80),         (30, 90, 75, 80, 50, 46)        ]    ax_data = ['2019-11', '2019-12', '2020-1', '2020-2', '2020-3', '2020-4']    leg_items = [(colors.red, 'python'), (colors.green, 'JavaScript'), (colors.blue, 'c++')]    # 附加:添加文章的文字段落    #content.append(Graphs.draw_text())    #添加图标柱状图    content.append(Graphs.draw_bar(b_data, ax_data, leg_items))    # 生成pdf文件    newpdf = SimpleDocTemplate('/home/xgj/Desktop/reportlab/report.pdf', pagesize=letter)    newpdf.build(content)

2.2 图

3 python的class类:

3.1 python的面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用。

类是一个模板,模板中包装了多个“函数”供使用。

对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数。

面向对象三大特性:封装、继承和多态。

3.2 Python 3.x中取消了经典类,默认都是新式类。

新式类的语法 -> class 类名(object): pass

3.3 通过例子来讲解新式类的语法

代码:

#方法一#定义person这个类#class person(object):  #与下面相同作用,也就是object这个对象就是下面的内容class person():     #定义speak函数    def speak(self):  #person对象调用了speak函数的这个方法,self就是那个对象;可以把self理解为一个形参        print("%s 说:我今年%s岁" % (self.name, self.age)) #类person 实例化一个对象chaxunchaxun = person()# 给对象查询chaxun添加属性,用‘点’chaxun.name = "李白"chaxun.age = 1000# 调用类中的 speak()方法chaxun.speak()
#方法二#class person(object): #与下面相同class person():      # 定义构造方法    #__init__() 是类的初始化方法;它在类的实例化操作后 会自动调用,不需要手动调用    def __init__(self, n, a):          # 设置属性        self.name = n        self.age = a    # 定义普通方法    def speak(self):        print("%s 说:我今年%s岁" % (self.name, self.age)) #类person 实例化一个对象chaxunchaxun = person("李白",1000) # 调用类中的 speak()方法chaxun.speak()

# 在python中使用__开头 并以__结尾的方法,称之为魔法方法;

# __init__(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法。

# __init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。

# 常用到的魔法方法还有:__str__(self) 、 __del__(self)等。

============

4 python3的装饰器:

4.1 理解装饰器的前提:

4.1.1 所有东西都是对象(函数可以当做对象传递)

4.1.2.闭包

4.2 闭包的概念:

1)函数嵌套

2)内部函数使用外部函数的变量

3)外部函数的返回值为内部函数

4.3 使用装饰器的缺点:

4.3.1.位置错误的代码->不要在装饰器之外添加逻辑功能

4.3.2.不能装饰@staticmethod (第一个代码中使用)或者 @classmethod已经装饰过的方法

4.3.3.装饰器会对原函数的元信息进行更改,比如函数的docstring,__name__,参数列表。

装饰器需要实例讲解更清楚,暂时到这里,喜欢的收藏和转发,自己整理,分享出来。

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

itext生成pdf paragraph 自动换行_reportlab高级制作多格式PDF和python的class和装饰器复习相关推荐

  1. python基础教程:装饰器的高级应用

    装饰器和装饰器模式 装饰器模式是面向对象的一种设计模式,支持将行为动态增加到已经存在的对象上.当装饰一个对象的时候,就表示独立与其他类实例对象,为该对象扩展了新的功能. python的装饰器不是装饰器 ...

  2. python生成词云_词云制作没那么难,Python 10 行代码就实现了!

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信"学习资料"可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 写在前面 想必大家有一个问 ...

  3. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...

    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...

  4. Python装饰器高级版—Python类内定义装饰器并传递self参数

    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...

  5. Python|装饰器|执行时间|递归|动态属性|静态方法和类|继承和多态|isinstance类型判断|溢出|“魔法”方法|语言基础50课:学习记录(6)-函数的高级应用、面向对象编程、进阶及应用

    文章目录 系列目录 原项目地址: 第16课:函数的高级应用 装饰器(记录执行时间的例子) 递归调用 简单的总结 第17课:面向对象编程入门 类和对象 定义类 创建和使用对象 初始化方法 打印对象 面向 ...

  6. 电脑上怎么做pdf文件_怎么编辑pdf文件内容?什么工具可以编辑pdf?

    怎么编辑pdf文件内容?临近毕业时候,我有了报考教师资格证的想法,打算之后当老师.期间,我在网上找了很多报考教资的参考资料,不过它们大多是以pdf格式文件形式存在.有时候要往里加入.修改些内容,但我不 ...

  7. itext生成pdf间距_使用itext生成pdf

    在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过 在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到 ...

  8. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

最新文章

  1. 2015 SegmentFault 黑客马拉松记录
  2. linuxdeployqt打包
  3. 基于 OpenYurt EdgeX Foundry 的云边端一体化解决方案
  4. git clone的速度慢到难以忍受问题的解决方法~
  5. win7登录密码破解工具
  6. oracle服务器文件路径,ORACLE 数据库如何通过修改数据文件路径进行数据迁移
  7. java httpclient 重定向_httpclient 中post请求重定向
  8. 一个按照行来截取显示文章摘要的函数
  9. red-hat Linux6-5的安装
  10. java book_java_book java 图书管理系统 GUI - 下载 - 搜珍网
  11. Python 这么简单还用学吗?
  12. 【FFmpeg】srs引入ffmpeg转码
  13. USB 协议分析(含基本协议和 USB 请求和设备枚举)
  14. 硬件基础知识-二极管基础
  15. mysql常用语句五:DQL中的查询操作
  16. wordcloud OSError: cannot open resource
  17. mysql操作语句类型DQL\DML\DDL\DCL
  18. 第六章 商品详情进阶 + redis分布式锁 + redis问题解决 + redisson + 布隆过滤器
  19. 人机交互系统(1.2) ——深度神经网络(孪生网络)
  20. 根号分治练手题 西比拉先知系统 题解

热门文章

  1. Mac使用OpenCV项目步骤
  2. Mac安装apktool/dex2jar/jd-gui逆向工具
  3. Android唤醒屏幕
  4. 深度学习自学(三十二):半监督焦点人物检测
  5. 解决/usr/bin/pip: No such file or directory
  6. 电源-主动式PFC介绍
  7. tuned-adm性能优化工具详解
  8. Apache Log4j2 远程代码执行高危漏洞 解决方案
  9. 解决Android的adb命令行报错Permission denied
  10. geitee仓库项目拉到(克隆到)本地