Flask后端实践 连载十八 Flask输出PDF报表

tips:

  • 简单实现Flask输出PDF报表
  • 本文基于python3编写
  • 代码仓库

项目场景

由于项目是工程上的使用,不仅需要对采集的数据进行分析,也需要输出报表,使用程序输出报表极大的简化了报表制作流程。

Python处理PDF的包

  1. reportlab

    ReportLab标记语言(RML)是最强大的代码到PDF工具包,非常简单,是自动化专业发布的最佳选择。 清晰的,类似HTML的语法允许开发人员像网页一样布局数据驱动的文档。文档地址,用户手册。

  2. xhtml2pdf

    xhtml2pdf是一个使用ReportLab Toolkit,HTML5lib和pyPdf的html2pdf转换器。它支持HTML 5和CSS 2.1(以及一些CSS 3)。它完全用纯Python编写,因此它与平台无关。具有Web技能(如HTML和CSS)的用户能够非常快速地生成PDF模板而无需学习新技术。文档地址

  3. PyPDF2

    PyPDF2可以提取文档信息(标题,作者,…)、按页拆分文档、逐页合并文档、裁剪页面、合并多个页面到一个页、对pdf文档进行加密解密等等。文档地址

ReportLab简单使用

由于项目上需要绘制PDF,经过比较选择reportlab作为开发。reportlab可以利用模板来生成PDF,也可以手动生成PDF。

  1. 安装pip install reportlab
  2. 简单使用,更多详细内容请看用户手册。
    from reportlab.lib.colors import HexColor
    from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
    from reportlab.platypus import SimpleDocTemplate, Table, Image, PageBreak, Paragraph
    from reportlab.lib.units import inch
    from reportlab.lib import colors
    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont# 增加的字体,支持中文显示,需要自行下载支持中文的字体
    pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))
    styles = getSampleStyleSheet()
    styles.add(ParagraphStyle(fontName='SimSun', name='SimSun', leading=20, fontSize=12))def table_model():"""添加表格:return:"""new_img = Image('test.jpg', width=300, height=300)base = [[new_img, ""],["大类", "小类"],["WebFramework", "django"],["", "flask"],["", "web.py"],["", "tornado"],["Office", "xlsxwriter"],["", "openpyxl"],["", "xlrd"],["", "xlwt"],["", "python-docx"],["", "docxtpl"],]style = [# 设置字体('FONTNAME', (0, 0), (-1, -1), 'SimSun'),# 合并单元格 (列,行)('SPAN', (0, 0), (1, 0)),('SPAN', (0, 2), (0, 5)),('SPAN', (0, 6), (0, 11)),# 单元格背景('BACKGROUND', (0, 1), (1, 1), HexColor('#548DD4')),  # 字体颜色('TEXTCOLOR', (0, 1), (1, 1), colors.white),  # 对齐设置('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),  ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 单元格框线('GRID', (0, 0), (-1, -1), 0.5, colors.grey),('BOX', (0, 0), (-1, -1), 0.5, colors.black),]component_table = Table(base, style=style)return component_tabledef paragraph_model(msg):"""添加一段文字:param msg::return:"""# 设置文字样式style = ParagraphStyle(name='Normal',fontName='SimSun',fontSize=50,)return Paragraph(msg, style=style)def image_model():"""添加图片:return:"""new_img = Image('test.jpg', width=300, height=300)return new_img# 更多样式参考用户手册 https://www.reportlab.com/docs/reportlab-userguide.pdf
    data = list()
    # 添加一段文字
    paragraph = paragraph_model("测试添加一段文字")
    data.append(paragraph)
    data.append(PageBreak())  # 分页标识
    # 添加table和图片
    table = table_model()
    data.append(table)
    data.append(PageBreak())  # 分页标识
    img = image_model()
    data.append(img)# 设置生成pdf的名字和编剧
    pdf = SimpleDocTemplate("test.pdf", rightMargin=0, leftMargin=0, topMargin=40, bottomMargin=0, )
    # 设置pdf每页的大小
    pdf.pagesize = (9 * inch, 10 * inch)pdf.multiBuild(data)

Flask结合reportlab使用

  • 测试代码

    from flask import Flask
    from reportlab.lib.colors import HexColor
    from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
    from reportlab.platypus import SimpleDocTemplate, Table, Image, PageBreak, Paragraph
    from reportlab.lib.units import inch
    from reportlab.lib import colors
    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont# 增加的字体,支持中文显示,需要自行下载支持中文的字体
    pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))
    styles = getSampleStyleSheet()
    styles.add(ParagraphStyle(fontName='SimSun', name='SimSun', leading=20, fontSize=12))def table_model():"""添加表格:return:"""new_img = Image('test.jpg', width=300, height=300)base = [[new_img, ""],["大类", "小类"],["WebFramework", "django"],["", "flask"],["", "web.py"],["", "tornado"],["Office", "xlsxwriter"],["", "openpyxl"],["", "xlrd"],["", "xlwt"],["", "python-docx"],["", "docxtpl"],]style = [# 设置字体('FONTNAME', (0, 0), (-1, -1), 'SimSun'),# 合并单元格 (列,行)('SPAN', (0, 0), (1, 0)),('SPAN', (0, 2), (0, 5)),('SPAN', (0, 6), (0, 11)),# 单元格背景('BACKGROUND', (0, 1), (1, 1), HexColor('#548DD4')),# 字体颜色('TEXTCOLOR', (0, 1), (1, 1), colors.white),# 对齐设置('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),('ALIGN', (0, 0), (-1, -1), 'CENTER'),# 单元格框线('GRID', (0, 0), (-1, -1), 0.5, colors.grey),('BOX', (0, 0), (-1, -1), 0.5, colors.black),]component_table = Table(base, style=style)return component_tabledef paragraph_model(msg):"""添加一段文字:param msg::return:"""# 设置文字样式style = ParagraphStyle(name='Normal',fontName='SimSun',fontSize=50,)return Paragraph(msg, style=style)def image_model():"""添加图片:return:"""new_img = Image('test.jpg', width=300, height=300)return new_imgdef generate_pdf():"""生成pdf:return:"""path = "test.pdf"data = list()# 添加一段文字paragraph = paragraph_model("测试添加一段文字")data.append(paragraph)data.append(PageBreak())  # 分页标识# 添加table和图片table = table_model()data.append(table)data.append(PageBreak())  # 分页标识img = image_model()data.append(img)# 设置生成pdf的名字和编剧pdf = SimpleDocTemplate(path, rightMargin=0, leftMargin=0, topMargin=40, bottomMargin=0, )# 设置pdf每页的大小pdf.pagesize = (9 * inch, 10 * inch)pdf.multiBuild(data)return pathapp = Flask(__name__)@app.route('/testPDF', methods=["GET"])
    def test_pdf():"""测试输出pdf:return:"""path = generate_pdf()return pathif __name__ == '__main__':app.run()
  • 启动app,访问http://127.0.0.1:5000/testPDF 返回生成路径test.pdf。然后配合nginx转发即可下载文件

总结

  • 本篇文章简单介绍了reportlab的使用,具体的使用场景应该与项目需求相结合。

Flask后端实践 连载十八 Flask输出PDF报表相关推荐

  1. Flask后端实践 连载十四 Flask输出Word报表

    Flask后端实践 连载十四 Flask输出Word报表 tips: 简单实现Flask输出Word报表 本文基于python3编写 代码仓库 项目场景 由于项目是工程上的使用,不仅需要对采集的数据进 ...

  2. Flask后端实践 连载十六 Flask实现微信Web端及APP端登录注册

    Flask后端实践 连载十六 Flask实现微信Web端及APP端登录注册 tips: 本文将实现微信Web端和APP端登陆注册 本文基于python3编写 代码仓库 项目场景 某天,项目经理说,项目 ...

  3. Flask后端实践 连载十三 Flask输出Excel报表

    Flask后端实践 连载十三 Flask输出Excel报表 tips: 简单实现Flask输出Excel报表 本文基于python3编写 代码仓库 项目场景 由于项目是工程上的使用,不仅需要对采集的数 ...

  4. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...

  5. 单反相机的传奇—佳能单反50年辉煌之路(连载十八)

    连载十八:天壤--单反的困局(上) <单反相机的传奇> 作者:木木 引言:1960年,日本第一届照相机展览会举行,当年就有多达19种单反相机登场亮相,1950年代末期,日本单反相机市场可谓 ...

  6. Flask后端开发(二) - Flask的练习(入门)

    建议食用官方文档:Welcome to Flask - Flask Documentation (2.1.x)https://flask.palletsprojects.com/ 前言:避免文章篇幅过 ...

  7. Xamarin.Android开发实践(十八)

    Xamarin.Android之SlidingMenu 一.前言 有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也 ...

  8. 抖音赚钱记,新手如何玩转抖音,每天赚300起(连载十八)

    你要求的是完美,就得先有一种狂热的爱好!--古龙 1,要求完美是一种病,你得要去治.无论是你对别人要求完美也好,对自己要求完美也好,当你对他没有一种狂热的爱,你这样的要求是不对的. 就拿做抖音短视频的 ...

  9. 自学Python第十九天-flask框架

    自学Python第十九天-flask框架 安装和引用 使用 创建和运行应用 设置应用 处理函数及路由 另一种路由注册 唯一URL和重定向行为 反向解析 响应 get 和 post 请求 ,以及其他类型 ...

最新文章

  1. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
  2. SQL重复记录查询的几种方法
  3. UnitTest in .NET(Part 5)
  4. spring rmi_Spring集成–使用RMI通道适配器
  5. 前端学习(622):变量的命名规范
  6. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
  7. 从氨基酸到大分子(蛋白质、核酸)
  8. Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 2 1.1. 总图 2 1.2. ui原型图与html 2 1.3. 业务逻辑 伪代码 各种uml图 2 1.4. 总体
  9. OpenCV-图像处理(31、图像矩(Image Moments))
  10. 【POJ 1113】Wall【凸包+一点思维】
  11. VOSviewer软件研究热点分析
  12. HDFS常用命令与命令大全及其用法
  13. java进度条_「java进度条」Java JProgressBar类(进度条) - seo实验室
  14. java 打印堆栈_Java打印完整的堆栈信息
  15. 积分大比拼,哪家银行信用卡积分最值钱?
  16. 多彩的书写工具,画图写字更好看,米家液晶小黑板多彩版上手
  17. 利用全球定位改进导航
  18. Windows Media Encode 9简介及SDK
  19. 教程篇(6.0) 06. 证书操作 ❀ FortiGate 安全 ❀ Fortinet 网络安全专家 NSE 4
  20. matlab参数化翼型,机翼翼型Matlab编程.doc

热门文章

  1. 宝捷信注塑机PS系列采集方案
  2. Excel柱状图一个系列中各个值如何单独设置误差线
  3. 计算机考研机试指南(八)——数学问题
  4. 【ceph】CEPH源码解析:读写流程
  5. [学习笔记] 全角字符与半角字符的区别
  6. Spirng Cloud Netfilx
  7. zemax---GEO Radius and RMS Radius
  8. 【MindManager软件常用快捷键】Mindjet MindManager快捷键教程
  9. 面试官:如何快速定位慢SQL
  10. 视频转GIF工具哪个好用