写点什么

[笔记]Reportlab 生成 PDF(表格)

用户头像
森蓝Senlan
关注
发布于: 2020 年 06 月 17 日

参考

https://zhaobugs.com/2018/07/09/%E4%BD%BF%E7%94%A8Python%E7%94%9F%E6%88%90PDF-reportlab%E7%AF%87/

https://www.youtube.com/watch?v=B3OCXBL4Hxs



背景:想生成一个简单的表格,然后往表格填充数据。

实现代码:

from reportlab.lib.pagesizes import A4, landscape, cm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
def gen_pdf(value):
buf = BytesIO()
# 自定义字体
font_path = os.path.realpath(os.path.join(__file__, '../..', 'static', 'fonts', 'msyh.ttf'))
pdfmetrics.registerFont(TTFont('msyh', font_path))
from reportlab.lib import fonts, colors
fonts.addMapping('msyh', 0, 0, 'msyh')
fonts.addMapping('msyh', 0, 1, 'msyh-Italic')
# 生成自带模板
doc = SimpleDocTemplate(buf, pagesize=A4, rightMargin=10, leftMargin=10, topMargin=20, bottomMargin=10)
doc.pagesize = landscape(A4)
elements = []
# 14行 10列
data = [[''] * 10 for i in range(1, 15)]
# 省略代码:往data数组填充数据
# 创建表格样式,按顺序加载,会被覆盖
ts_list = [
('FONT', (0, 0), (-1, -1), 'msyh'),
('FONTSIZE', (0, 0), (-1, -1), 14),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('TEXTCOLOR', (0, 0), (-1, -1), colors.black),
# 内部网格
('INNERGRID', (0, 0), (-1, -1), 0.05 * cm, colors.black),
# 单元格底部padding
('BOTTOMPADDING', (0, 0), (-1, -1), 8),
# 外边框
('BOX', (0, 0), (-1, -1), 0.075 * cm, colors.black),
# 单元格组成区域的上方
# ('LINEABOVE', (0, 0), (-1, -1), 0.025 * cm, colors.white),
]
# 奇数行单元格下方边线弱化
rows = len(data)
for i in range(1, rows):
if i % 2 == 0:
continue
else:
line_below = ('LINEBELOW', (0, i - 1), (-1, i - 1), 0.015 * cm, colors.white)
ts_list.append(line_below)
# 生成样式表
style = getSampleStyleSheet()
style = style["BodyText"]
# 自动换行
style.wordWrap = 'CJK'
# 创建表格, 每个单元格的width height
table = Table(data, 2 * cm, 0.9 * cm)
# 将样式应用到表格
table_style = TableStyle(ts_list)
table.setStyle(table_style)
elements.append(table)
# 生成PDF
doc.build(elements)
pdf_content = buf.getvalue()
buf.close()
return pdf_content
gen_pdf(value)



字体

  1. 中文字体需要加载。

  2. 在Docker下运行的,需要把字体路径设置成真实路径。

font_path = os.path.realpath(os.path.join(__file__, '../..', 'static', 'src', 'fonts', 'msyh.ttf'))



发布于: 2020 年 06 月 17 日阅读数: 129
用户头像

森蓝Senlan

关注

正在代码世界打怪升级中。 2020.06.01 加入

乐观,好奇,开心,健康。

评论

发布
暂无评论
[笔记]Reportlab生成PDF(表格)