canvas 画布提供绘画操作,可以认为 canvas 是一张白纸,我们可以自由的在上面绘画。
绘画就需要工具,在纸板上,绘画工具是彩笔,而在 canvas 中,绘画工具就是 线条、文本、图形、图像等。
正如铅笔的颜色、粗细等状态一样,canvas工具也有状态(state),那就是字体、字体大小、颜色、线条粗细等。
canvas 笛卡尔直角坐标, 起始坐标 (0,0) 为左下角。
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.pagesizes import letter, A4
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib import colors
# 中文支持的话需要注册字体,可以先直接运行本代码
# 若报错可以参考 https://blog.csdn.net/xxilong/article/details/122546268 中的字体注册方法
# 仿宋
song = "simsun"
pdfmetrics.registerFont(TTFont(song, "simsun.ttc"))
# 画布默认大小为 A4 纸大小,也可以设置其它大小
c = canvas.Canvas("hello.pdf", pagesize=(800,1200))
# 状态操作 设置字体和大小
c.setFont(song, 50)
# 工具使用 坐标(400,1100)处开始绘制单行字符串,
c.drawString(400,1100,"Hello World")
c.line(0,1100,800,1100) # 工具使用 画横线
c.drawCentredString(400, 1000, "你好,世界") #居中
c.line(400,1200,400,1000) # 工具使用 画竖线
# 暂存状态,保存当前的字体、字体大小、颜色等
c.saveState()
# 写入多行文本
c.setFont(song, 20) # 重新设置状态
textobject = c.beginText(10, 900)
textobject.textLines('''
任何时候,我对世界总有一个主观的先验判断,
但是这个判断会随着世界的真实变化而随机修正,
我对世界永远保持开放的态度
''')
c.drawText(textobject)
c.restoreState() # 恢复最近一次状态 即song, 50
c.drawString(10,700,"Crystal Liu")
image_path1 = "https://img1.baidu.com/it/u=1709141848,358113343&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=608"
# 设置图片插入起始位置,及图片大小
c.drawImage(image_path1, 0, 300, width=250,height=304,mask=None)
image_path2 = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fa25910b0-81e3-4fd3-bf22-bdab2f079d5e%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1687091775&t=71743df2960ae2a371726d2e78a35f8f"
c.drawImage(image_path2, 400, 300, width=304,height=304,mask=None)
"""绘制页脚"""
# 设置边框颜色
c.setStrokeColor(colors.dimgrey)
# 绘制线条
c.line(30, 30, 570, 30)
# 绘制页脚文字
c.setFont(song, 8)
c.drawString(30, 15, "368复机,请说出密码")
# 保存当前画布,保存后后续内容将换页绘制
c.showPage()
# 从这里翻页,到第二页,在新的页面上,之前的一切状态都不起作用,需要重新设置
c.setFont(song, 50)
c.drawCentredString(400, 1000, "你好,第二个世界") #居中
# 生成PDF文档
c.save()
效果图:
第一页:
第二页:
官方离线PDF文档
官方在线文档
Python学习——使用ReportLab生成带表格和图文的PDF
学Python,用Python自动创建PDF文档,实现办公自动化