如何用Python脚本在PDF指定页码、位置插入指定尺寸的图片?
Python 向PDF指定位置插入图片(支持JPG/PNG)
下面提供两种实用方案,满足指定页码、坐标、宽高插入JPG/PNG图片的需求:
方案一:使用PyMuPDF(fitz)
PyMuPDF是处理PDF的高效库,插入图片的操作灵活且易上手。
安装依赖
pip install pymupdf
代码示例
import fitz # 导入PyMuPDF def insert_image_to_pdf(input_pdf, output_pdf, image_path, page_num, x, y, width, height): # 打开PDF文件 doc = fitz.open(input_pdf) # 获取目标页面(注意:PyMuPDF页码从0开始,若要插第3页,page_num传2) page = doc[page_num] # 插入图片:参数依次为图片路径、左下角坐标(x,y)、宽高 page.insert_image(fitz.Rect(x, y, x + width, y + height), filename=image_path) # 保存修改后的PDF doc.save(output_pdf) doc.close() # 调用示例 if __name__ == "__main__": insert_image_to_pdf( input_pdf="原文件.pdf", output_pdf="插入图片后的文件.pdf", image_path="test.png", # 支持jpg/png page_num=0, # 插入第1页 x=100, # 左下角x坐标(单位:点,1点=1/72英寸) y=200, # 左下角y坐标 width=150, # 图片宽度 height=100 # 图片高度 )
关键说明
- 坐标系统:PDF默认以页面左下角为原点,x轴向右,y轴向上,单位为点(1点≈0.35mm)
- 透明PNG:PyMuPDF会保留图片的透明通道,无需额外处理
- 页码转换:若你习惯从1开始计数,调用时可以把
page_num传参改为目标页码-1
方案二:使用fpdf2
fpdf2是轻量的PDF生成/修改库,适合简单场景下的图片插入。
安装依赖
pip install fpdf2
代码示例
from fpdf import FPDF from PyPDF2 import PdfReader, PdfWriter def insert_image_with_fpdf(input_pdf, output_pdf, image_path, page_num, x, y, width, height): # 读取原PDF内容 reader = PdfReader(input_pdf) writer = PdfWriter() # 遍历每一页,复制到新PDF for idx, page in enumerate(reader.pages): writer.add_page(page) # 当遍历到目标页码时插入图片(页码从0开始) if idx == page_num: # 创建临时PDF用于生成图片层 temp_pdf = FPDF(unit="pt") temp_pdf.add_page() temp_pdf.image(image_path, x=x, y=y, w=width, h=height) # 保存临时PDF到内存 from io import BytesIO temp_buffer = BytesIO() temp_pdf.output(temp_buffer) temp_buffer.seek(0) # 合并图片层到目标页面 temp_reader = PdfReader(temp_buffer) writer.pages[idx].merge_page(temp_reader.pages[0]) # 保存最终PDF with open(output_pdf, "wb") as out_file: writer.write(out_file) # 调用示例 if __name__ == "__main__": insert_image_with_fpdf( input_pdf="原文件.pdf", output_pdf="插入图片后的文件.pdf", image_path="test.jpg", page_num=1, # 插入第2页 x=150, y=250, width=200, height=150 )
关键说明
- 单位设置:示例中用
unit="pt"(点)和PyMuPDF保持一致,方便坐标统一 - 图片格式:支持JPG/PNG,透明PNG同样兼容
- 合并逻辑:通过临时PDF生成图片层,再合并到原页面,确保图片不会覆盖原有内容
内容的提问来源于stack exchange,提问作者wittn
相关产品推荐
相关产品推荐

