Python中图片下方添加标注文本并批量导出PDF的最优方案咨询
实现方案与推荐依赖库
核心思路
你需要的是不修改原图、仅在PDF排版环节给每张图片追加下方文本标注的方案,全程不需要接触图片内部像素,也不需要用Matplotlib这类绘图库的坐标轴、图例组件,直接通过PDF排版工具完成「图片插入+下方文本拼接」即可,Python生态是实现这个需求的最优选择。
推荐方案(按优先级排序)
方案1:轻量原生PDF生成(无中间文件)
依赖库
Pillow:用于读取图片、统一计算适配PDF页面的缩放尺寸ReportLab:用于直接生成PDF,支持自定义坐标插入图片、绘制文本
核心逻辑示例
from reportlab.pdfgen import canvas from PIL import Image # 配置A4页面参数(单位:点,1点=1/72英寸) A4_WIDTH = 595.27 A4_HEIGHT = 841.89 LEFT_MARGIN = 50 TOP_MARGIN = 50 IMAGE_MAX_HEIGHT = 400 IMG_TO_TEXT_GAP = 20 LINE_GAP = 15 def generate_pdf(img_label_pairs: list[tuple[str, list[str]]], output_path: str): c = canvas.Canvas(output_path, pagesize=(A4_WIDTH, A4_HEIGHT)) # 初始Y坐标从页面顶部往下算 current_y = A4_HEIGHT - TOP_MARGIN for img_path, labels in img_label_pairs: # 计算图片适配页面的缩放后尺寸 with Image.open(img_path) as img: w, h = img.size # 先按宽度适配左右边距 scale = (A4_WIDTH - LEFT_MARGIN * 2) / w scaled_w, scaled_h = w * scale, h * scale # 超过最大高度就按高度适配 if scaled_h > IMAGE_MAX_HEIGHT: scale = IMAGE_MAX_HEIGHT / h scaled_w, scaled_h = w * scale, h * scale # 剩余空间不够放当前图片就换页 if current_y - scaled_h < TOP_MARGIN: c.showPage() current_y = A4_HEIGHT - TOP_MARGIN # 插入图片 c.drawImage( img_path, x=LEFT_MARGIN, y=current_y - scaled_h, width=scaled_w, height=scaled_h ) current_y = current_y - scaled_h - IMG_TO_TEXT_GAP # 逐行插入标注 for label in labels: # 剩余空间不够放当前行就换页 if current_y < TOP_MARGIN: c.showPage() current_y = A4_HEIGHT - TOP_MARGIN c.drawString(x=LEFT_MARGIN, y=current_y, text=f"- {label}") current_y -= LINE_GAP # 两张图片的内容块之间留间隔 current_y -= 30 c.save()
优势
- 全程无中间文件,生成速度快
- 支持自定义标注的字体、颜色、排版格式,文本可选可复制
- 千张级图片处理耗时不超过1分钟
方案2:低代码排版(适合复杂格式需求)
依赖库
python-docx:生成Word文档,自动处理排版,不需要手动计算坐标docx2pdf:直接把生成的Word转成PDF
核心逻辑
- 新建空白Word文档,遍历所有图片和对应标签
- 先插入调整好尺寸的图片,设置图片居中
- 图片后插入无序列表,把所有目标标签作为列表项添加
- 全部内容插入完成后保存Word,调用转换接口直接导出PDF
优势
- 不需要手动计算坐标、分页逻辑,所有排版由Word自动处理
- 支持多列展示标注、自定义段落样式,适合单张图片标注量超过半页的场景
其他语言可选方案
如果你使用Node.js技术栈,可选用pdf-lib库实现和ReportLab一致的原生PDF生成逻辑,性能和Python方案基本持平。
内容的提问来源于stack exchange,提问作者Entropie_13
相关产品推荐
相关产品推荐

