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

python使用reportlab生成pdf实例_python

大家好,本篇文章主要讲的是python使用reportlab生成pdf实例,感兴趣的同学赶快来看一看吧,对你有

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 里像查字典一样去找。

预览

在这里插入图片描述

完整代码


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"},
)

总结

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 里像查字典一样去找。

预览

在这里插入图片描述

完整代码


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"},
)

总结


推荐阅读
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
author-avatar
-彼岸花开-hui
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有