美文网首页
python使用ReportLab 自动生成PDF

python使用ReportLab 自动生成PDF

作者: 我就是鱼鱼鱼 | 来源:发表于2022-04-12 19:40 被阅读0次

1、一些比较常见的问题

1.1、正文中中文字体问题

一般是中文字体在报告中没有办法显示,这个时候需要在生成报告时候对字体进行设置

pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))

以上的字体以SimSun为例如果想要使用其他的字体可以直接下载安装,下载后需要按照到reportlab安装包下面的font文件夹中。

1.2、图表中中文字体问题

plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong'] #汉字字体,优先使用楷体,如果找不到楷体则使用黑体
plt.rcParams['font.size'] = 12  # 字体大小
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

2、生成PDF

2.1、导入相关包

import pandas #数据处理
from reportlab.lib import colors #生成PDF颜色相关的包
from reportlab.platypus import Table,TableStyle,Spacer,SimpleDocTemplate,Image#用于PDF中的表格、图片生成
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.units import inch
from matplotlib import pyplot as plt #画图的包

2.2、标题与描述

style = getSampleStyleSheet()
title = """<para> 标题内容</para>""" #填写标题内容
description = """
                                <para>
                                <font face='SimSun'>
                                该部分是正文内容
                                </font>
                                </para>
                        """ #填写正文内容
D.append(Paragraph(description, style['BodyText']))#将正文内容添加到PDF中
D.append(Paragraph(title, style['Title']))#将标题添加到PDF中

2.3、表格

D = [] #创建一个空列表用于存放内容
data= [['00', '01', '02', '03', '04'],
 ['10', '11', '12', '13', '14'],
 ['20', '21', '22', '23', '24'],
 ['30', '31', '32', '33', '34']]
#表格样式设置,这个样式是按照我的数据设置的,效果可见图片
table_styles = [
    ('GRID',(0,0),(-1,-1),1,colors.black),
    ('SPAN',(0,0),(0,1)),#合并单元格
    ('SPAN',(1,0),(2,0)),#合并单元格
    ('SPAN',(3,0),(4,0)),
    ('SPAN',(5,0),(6,0)),
    ('SPAN',(7,0),(8,0)),
    ('SPAN',(9,0),(10,0)),
    ('BACKGROUND', (0, 0), (10, 1), colors.red),#背景颜色
    ('TEXTCOLOR',(0, 0), (10, 1),colors.white),#设置字体颜色
    ('FONTSIZE',(0,0),(-1,-1),12),
    ('ALIGN',(0,0),(-1,-1),'CENTER'),
    ('FONT',(0,0),(-1,-1),'SimSun')
]
#将表格的内容添加到空列表中用于生成PDF
mytable = Table(table_data_time,rowHeights=30) #表格数据
mytab_style = TableStyle(table_styles) #表格样式
mytable.setStyle(mytab_style)
D.append(mytable)
D.append(Spacer(1,0.4*inch))

注意数据的格式,一般可以使用data = data.to_numpy().tolist() 对数据格式进行转换,使用该方法转换数据的时候需要主要这个转换的数据类型需要是serries或者Dataframe

表格样式.png

2.4、图表

如果图表中有中文字体,可在创建图表前增加上面的常见图表问题处理

data = [5, 20, 15, 25, 30]
plt.bar(range(len(data)), data)
plt.title('图表')
plt.tight_layout()
plt.savefig('plot.png')#将图表转化成图片
img = Image('plot.png') #转化程成replotlib中图表格式
D.append(img) # 将图片添加到PDF元素中

2.5、构建PDF元素,生成PDF

doc = SimpleDocTemplate(
    "hhh.pdf", #PDF名称
    pagesize=(841.89, 585.27),#PDF大小,这个设置有点想PPT中的大小
    topMargin=30, #上边距
    bottomMargin=30 #下边距
)
doc.build(D)

相关文章

网友评论

      本文标题:python使用ReportLab 自动生成PDF

      本文链接:https://www.haomeiwen.com/subject/swhrsrtx.html