如何使用Python在PDF文件中绘制矩形等形状?
在现有PDF中绘制形状的修改方案
你当前使用的reportlab的canvas组件已内置形状绘制能力,仅需要在can.save()执行前添加对应形状的绘制代码即可实现需求,无需调整现有代码的整体流程。
常用绘制API说明
- 绘制矩形:调用
can.rect(x, y, width, height, stroke=1, fill=0),参数说明:- x、y:矩形左下角的坐标,和你绘制文本的坐标体系一致
- width、height:矩形的宽度和高度
- stroke:是否显示边框,1为显示,0为隐藏
- fill:是否填充矩形内部,1为填充,0为不填充
- 配置样式:可以在绘制形状前调用以下方法调整外观:
can.setLineWidth(2):设置边框粗细为2ptcan.setStrokeColorRGB(1, 0, 0):设置边框颜色为红色,三个参数分别对应RGB通道的0-1取值can.setFillColorRGB(0, 0, 1):设置填充颜色为蓝色,可额外加alpha参数设置透明度
- 其他常用形状绘制:
- 绘制直线:
can.line(x1, y1, x2, y2),绘制从(x1,y1)到(x2,y2)的直线 - 绘制圆形:
can.circle(x, y, r, stroke=1, fill=0),x、y是圆心坐标,r是半径
- 绘制直线:
完整修改后代码示例(适配你原有Python2环境)
# 给现有PDF添加文本和矩形 from pyPdf import PdfFileWriter, PdfFileReader import StringIO from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter packet = StringIO.StringIO() can = canvas.Canvas(packet, pagesize=letter) # 原有添加文本逻辑 TXT="Sample Text" can.drawString(300, 70, TXT) # 新增:绘制矩形示例 can.setLineWidth(2) can.setStrokeColorRGB(1, 0, 0) can.setFillColorRGB(0, 1, 0, alpha=0.3) # 左下角坐标(290,60),宽100高30,带边框和填充 can.rect(290, 60, 100, 30, stroke=1, fill=1) can.save() # 后续原有合并逻辑不变 packet.seek(0) new_pdf = PdfFileReader(packet) existing_pdf = PdfFileReader(file("original.pdf", "rb")) output = PdfFileWriter() page = existing_pdf.getPage(0) page.mergePage(new_pdf.getPage(0)) output.addPage(page) outputStream = file("destination.pdf", "wb") output.write(outputStream) outputStream.close()
Python3适配说明
如果使用Python3环境,仅需做以下修改即可:
- 将
import StringIO替换为import io - 将
packet = StringIO.StringIO()替换为packet = io.BytesIO() - 将所有
file()文件读写方法替换为open() - 建议将停止维护的
pyPdf替换为PyPDF2,导入语句改为from PyPDF2 import PdfFileWriter, PdfFileReader,其余调用逻辑不变。
内容的提问来源于stack exchange,提问作者BSFU
相关产品推荐
相关产品推荐

