热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python教程分享python使用reportlab生成pdf实例

目录intro功能点预览完整代码使用场景1:生成文件使用场景2:web(flask)总结intro项目中遇到需要导出统计报表等业务时,通常需要pdf格式。python中比较有名的就
目录
  • intro
  • 功能点
  • 预览
  • 完整代码
  • 使用场景1:生成文件
  • 使用场景2:web(flask)
  • 总结

intro

项目中遇到需要 导出统计报表 等业务时,通常需要 pdf 格式。python 中比较有名的就是 reportlab
这边通过几个小 demo 快速演示常用 api。所有功能点 源码 都在 使用场景

一句话了解:跟 css 差不多,就是不断地对每样东西设置 style,然后把 style 和内容绑定。

功能点

生成
文件: 先 simpledoctemplate(‘xxx.pdf’),然后 build
流文件:先 io.bytesio() 生成句柄,然后同理
曲线图 lineplot
饼图 pie
文字 paragraph
fontsize 字体大小 推荐 14
加粗 xxx 使用的是 html 的方式,字体自动实现
firstlineindent 首行缩进 推荐 2 * fontsize
leading 行间距 推荐 1.5 * fontsize
fontname 默认中文会变成 ■
下载 .ttf 文件 至少2个 【常规】【加粗】
注册字体 pdfmetrics.registerfont 【常规】请用原名,方便加粗的实现
注册字体库 registerfontfamily(“hansans”, normal=“hansans”, bold=“hansans-bold”)

其他 api 自行摸索,但基本离不开 css 那种理念。官网并没有常规文档的那种 md 模式,而是完全写在了 pdf 里,玩家需要自己去 pdf 里像查字典一样去找。

预览

python使用reportlab生成pdf实例

完整代码

import os    from reportlab.graphics.charts.lineplots import lineplot  from reportlab.graphics.charts.piecharts import pie  from reportlab.graphics.shapes import drawing  from reportlab.lib import colors  from reportlab.lib.styles import paragraphstyle  from reportlab.pdfbase import pdfmetrics  from reportlab.pdfbase.pdfmetrics import registerfontfamily  from reportlab.pdfbase.ttfonts import ttfont  from reportlab.platypus import paragraph    home = os.path.expanduser("~")    try:      pdfmetrics.registerfont(ttfont("hansans", f"{home}/.fonts/sourcehansanscn-normal.ttf"))      pdfmetrics.registerfont(ttfont("hansans-bold", f"{home}/.fonts/sourcehansanscn-bold.ttf"))      registerfontfamily("hansans", normal="hansans", bold="hansans-bold")      font_name = "hansans"  except:      font_name = "helvetica"      class mycss:      h3 = paragraphstyle(name="h3", fOntname=font_name, fOntsize=14, leading=21, alignment=1)      p = paragraphstyle(name="p", fOntname=font_name, fOntsize=12, leading=18, firstlineindent=24)      class piipdf:      @classmethod      def doh3(cls, text: str):          return paragraph(text, mycss.h3)        @classmethod      def dop(cls, text: str):          return paragraph(text, mycss.p)        @classmethod      def doline(cls):          drawing = drawing(500, 220)          line = lineplot()          line.x = 50          line.y = 50          line.height = 125          line.width = 300          line.lines[0].strokecolor = colors.blue          line.lines[1].strokecolor = colors.red          line.lines[2].strokecolor = colors.green          line.data = [((0, 50), (100, 100), (200, 200), (250, 210), (300, 300), (400, 800))]            drawing.add(line)          return drawing        @classmethod      def dochart(cls, data):          drawing = drawing(abcdefg"]          pie.data = data  # list(range(15, 105, 15))          pie.slices.strokewidth = 0.5            drawing.add(pie)          return drawing  

使用场景1:生成文件

doc = simpledoctemplate("hello.pdf")    p = piipdf()  doc.build([      p.doh3("水泵能源消耗简报"),      p.doh3("2021.12.1 ~ 2021.12.31"),      p.dop("该月接入能耗管理系统水泵系统 xx 套,水泵 x 台。"),      p.dop("本月最大总功率 xx kw,环比上月增加 xx %,平均功率 xx kw;环比上月增加 xx %。"),      p.dop("功率消耗趋势图:"),      p.doline(),      p.dop("本月总能耗 xxx kwh,环比上月增加 xx %。"),      p.dop("分水泵能耗统计:"),      p.dochart(list(range(15, 105, 20))),      p.dop("其中能耗最高的水泵为:xxx, 环比上月增加 xxx kwh,xx %。"),  ])  

使用场景2:web(flask)

@controller.get("/api/pdf")  def api_hub_energy_pdf():      buffer = io.bytesio()										# 重点 起一个 io      doc = simpledoctemplate(buffer)        p = piipdf()      doc.build([          p.doh3("2021.12.1 ~ 2021.12.31"),      ])        buffer.seek(0)      return response(											# io 形式返回          buffer,          mimetype="application/pdf",          headers={"content-disposition": "inline; filename=test.pdf"},      )  

总结

到此这篇关于python使用reportlab生成pdf实例的文章就介绍到这了,更多相关python reportlab生成pdf内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!

需要了解更多python教程分享python使用reportlab生成pdf实例,都可以关注python教程分享栏目&#8212;编程笔记


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
author-avatar
Matherslll_493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有