安装模块
pip install reportlab
代码示例
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
c = canvas.Canvas('xxxx.pdf', pagesize=(283, 283)) # 创建xxxx.pdf,大小为283px×283px
# 导入字体,字体文件在windows系统的存放路径为:C:\Windows\Fonts
pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc')) # 宋体
pdfmetrics.registerFont(TTFont('SimSunBold', '宋体-粗体.ttf')) # 宋体-粗体
c.setFont("SimSun", 12) # 设置字体为12磅宋体
"""
绘制一个表格,实际由多条线组合而成,宽273,高273
左边有8行,列宽85
右边有7行,列宽188
"""
c.line(5, 278, 278, 278) # 画上边框
c.line(5, 5, 278, 5) # 画下边框
c.line(5, 278, 5, 5) # 画左边框
c.line(278, 278, 278, 5) # 画右边框
c.setStrokeColorRGB(127/255, 127/255, 127/255) # 设置线的颜色为灰色(127, 127, 127)
c.line(90, 278, 90, 5) # 画中间竖线
c.setStrokeColorRGB(0, 0, 0) # 设置线的颜色为黑色(0, 0, 0)
for line in range(6):
c.line(5, 253 - line * 25, 278, 253 - line * 25) # 画表格内横线
c.line(5, 103, 90, 103) # 画第7横
# 在左边列写入文字内容
texts = ['标题1', '标题2', '标题3', '标题4', '标题5', '标题6', '备注']
for line in range(len(texts)):
text_width = c.stringWidth(texts[line]) # 获取在当前字体下这串文字的宽度
x_center = (85 - text_width) / 2
y_position = 278 - (line + 1) * 25 + 7.5
c.drawString(x_center + 5, y_position, texts[line]) # 写文字,并使文字居中对齐
# 在右边列写入内容
texts = ['内容1', '内容2', '内容3', '内容4', '内容5', '内容6']
for line in range(len(texts)):
if line <= 1:
c.setFont("SimSunBold", 14) # 设置字体为14磅宋体-粗体
text_width = c.stringWidth(texts[line])
x_center = (188 - text_width) / 2
y_position = 278 - (line + 1) * 25 + 6.5
c.drawString(x_center + 90, y_position, texts[line])
else:
c.setFont("SimSun", 12) # 设置字体为12磅宋体
text_width = c.stringWidth(texts[line])
x_center = (188 - text_width) / 2
y_position = 278 - (line + 1) * 25 + 7.5
c.drawString(x_center + 90, y_position, texts[line])
# 写入备注
remark = '这是一个备注1!这是一个备注2!'
sections = []
index = 0
# 因为左边列宽只有85px,要计算备注的宽度并分行
for i in range(len(remark) + 1):
text_width = c.stringWidth(remark[index: i])
if text_width >= 85:
sections.append([index, i - 1])
index = i - 1
else:
sections.append([index, len(remark)])
texts = [remark[i[0]: i[1]] for i in sections]
for text in texts:
y_position = 54 + 6 * len(texts) - 12 * texts.index(text) - 12
c.setFont("SimSun", 12)
c.drawString(5, y_position, text) # 水平方向左对齐垂直方向居中对齐写入备注文字
# 在表格右边列最下一格插入图片xxxx.png,设置图片宽高为116px
c.drawImage('xxxx.png', x=126, y=8, width=116, height=116)
# 保存PDF文件
c.save()
效果展示