[笔记]Reportlab 生成 PDF(表格)
发布于: 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/
背景:想生成一个简单的表格,然后往表格填充数据。
实现代码:
from reportlab.lib.pagesizes import A4, landscape, cmfrom reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraphfrom reportlab.lib.styles import getSampleStyleSheetfrom reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFontdef 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_contentgen_pdf(value)
字体
中文字体需要加载。
在Docker下运行的,需要把字体路径设置成真实路径。
font_path = os.path.realpath(os.path.join(__file__, '../..', 'static', 'src', 'fonts', 'msyh.ttf'))
划线
评论
复制
发布于: 2020 年 06 月 17 日阅读数: 129
版权声明: 本文为 InfoQ 作者【森蓝Senlan】的原创文章。
原文链接:【http://xie.infoq.cn/article/768f4862c7e34a3bc7c739ae9】。文章转载请联系作者。
森蓝Senlan
关注
正在代码世界打怪升级中。 2020.06.01 加入
乐观,好奇,开心,健康。
评论