使用 Python 在 PDF 中插入、替换和删除图片

PDF 文档中的图片是内容的重要组成部分,无论是产品照片、图表、公司 Logo 还是扫描插图,都依赖图片来增强信息表达。在实际工作中,经常需要对已有 PDF 中的图片进行更新------插入新的图片、替换过时的图片,或者移除不再需要的图片。手动使用 PDF 编辑器逐一处理效率低下,而通过 Python 编程可以轻松实现批量自动化操作。本文将介绍如何使用 Python 在 PDF 文档中插入、替换和删除图片。

环境准备

本文使用 Spire.PDF for Python 来操作 PDF 中的图片。通过以下命令安装:

bash 复制代码
pip install Spire.PDF

安装完成后,在脚本中导入相关模块即可开始使用。

向 PDF 插入图片

向 PDF 页面插入图片的核心方法是 DrawImage(),它将图片绘制到页面的指定位置和尺寸上。首先需要加载图片文件创建 PdfImage 对象,然后计算目标位置和大小,最后调用画布方法完成绘制。通过控制坐标和尺寸参数,可以精确地定位图片在页面上的位置。

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

# 创建 PDF 文档并添加页面
doc = PdfDocument()
page = doc.Pages.Add()

# 加载图片
image = PdfImage.FromFile("Logo.png")

# 计算图片的显示尺寸(按比例缩放)
width = image.Width * 0.75
height = image.Height * 0.75

# 计算居中位置
x = (page.Canvas.ClientSize.Width - width) / 2
y = 60.0

# 将图片绘制到页面
page.Canvas.DrawImage(image, x, y, width, height)

# 保存文档
doc.SaveToFile("InsertImage.pdf")
doc.Dispose()

PdfImage.FromFile() 方法从指定路径加载图片文件,支持 PNG、JPEG 等常见格式。DrawImage() 方法的最后两个参数分别控制图片的宽度和高度,通过设置不同的值可以实现缩放效果。上方代码中通过 image.Width * 0.75 将图片缩小到原始尺寸的 75%,同时保持宽高比例不变。

替换 PDF 中的已有图片

当 PDF 中的某张图片需要更新时(例如 Logo 换版、产品图更新),可以使用 PdfImageHelper 来定位已有图片并进行替换。首先获取页面上的图片信息集合,找到目标图片后,调用 ReplaceImage() 方法用新图片替换旧图片,图片的原始位置和大小会自动保留。

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

# 加载 PDF 文档
doc = PdfDocument()
doc.LoadFromFile("InsertImage.pdf")

# 获取第一个页面
page = doc.Pages[0]

# 创建图片辅助对象并获取页面上的图片信息
imageHelper = PdfImageHelper()
imageInfo = imageHelper.GetImagesInfo(page)

# 用新图片替换第一张图片
imageHelper.ReplaceImage(imageInfo[0], PdfImage.FromFile("new_logo.png"))

# 保存文档
doc.SaveToFile("ReplacedImage.pdf")
doc.Close()

GetImagesInfo() 方法返回页面上所有图片的信息对象列表,每个对象包含图片的位置、尺寸、索引等属性。ReplaceImage() 方法接收两个参数:要替换的图片信息对象和新的 PdfImage 对象。替换操作会保持图片在原文档中的位置和尺寸不变,只更新图片内容本身。

删除 PDF 中的图片

删除图片同样使用 PdfImageHelper。通过获取图片信息集合,可以按索引或按位置来定位要删除的图片,然后调用 DeleteImage() 方法将其移除。

按索引删除

如果知道要删除的是页面上的第几张图片,可以直接通过索引访问并删除:

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

pdf = PdfDocument()
pdf.LoadFromFile("InsertImage.pdf")
page = pdf.Pages[0]

imageHelper = PdfImageHelper()
imageInfos = imageHelper.GetImagesInfo(page)

# 删除第一张图片
imageHelper.DeleteImage(imageInfos[0])

pdf.SaveToFile("DeletedImage.pdf")
pdf.Close()

按位置删除

当需要根据图片在页面上的位置来决定是否删除时,可以通过 Bounds 属性判断图片的区域范围。Contains() 方法检查某个坐标点是否落在图片区域内,IntersectsWith() 方法则判断图片区域是否与指定矩形区域相交。

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

pdf = PdfDocument()
pdf.LoadFromFile("document.pdf")
page = pdf.Pages[0]

imageHelper = PdfImageHelper()
imageInfo = imageHelper.GetImagesInfo(page)

for i in range(len(imageInfo)):
    # 删除包含指定坐标点的图片
    if imageInfo[i].Bounds.Contains(49.68, 73.1):
        imageHelper.DeleteImage(imageInfo[i])
    # 删除与指定区域相交的图片
    if imageInfo[i].Bounds.IntersectsWith(RectangleF(100.0, 500.0, 30.0, 40.0)):
        imageHelper.DeleteImage(imageInfo[i])

pdf.SaveToFile("DeletedByBounds.pdf")
pdf.Close()

按位置删除的方式在批量处理中特别有用。例如,需要移除页面上某个固定区域的所有图片(如页眉 Logo 区域),或者清除特定坐标范围内的插图,都可以通过这种方式精确定位并删除。

批量处理多个页面

实际应用中,PDF 文件往往包含多个页面,需要对所有页面中的图片进行统一操作。通过遍历 Pages 集合,可以对每个页面执行相同的图片处理逻辑。

python 复制代码
from spire.pdf import *
from spire.pdf.common import *

doc = PdfDocument()
doc.LoadFromFile("multi_page.pdf")

imageHelper = PdfImageHelper()

# 遍历所有页面,替换每页的第一张图片
for page in doc.Pages:
    imageInfo = imageHelper.GetImagesInfo(page)
    if len(imageInfo) > 0:
        imageHelper.ReplaceImage(imageInfo[0], PdfImage.FromFile("new_logo.png"))

doc.SaveToFile("batch_replaced.pdf")
doc.Close()

这种批量处理方式适合统一更新公司 Logo、替换水印、或移除所有页面中特定位置图片等场景。

实用技巧

在处理 PDF 图片时,有几点值得注意。替换图片时,新图片的原始尺寸可能与旧图片不同,但 ReplaceImage() 会保持原来的显示尺寸,因此宽高比差异较大的图片可能会出现拉伸或压缩。如果需要精确控制,可以在替换前先调整新图片的尺寸。

删除图片后,页面上会留下空白区域。如果需要同时清除空白区域或调整后续内容的排版,需要额外处理页面布局。

在批量操作前,建议先通过 GetImagesInfo() 获取图片信息并打印出来检查,确认图片的索引、位置和尺寸是否符合预期,避免误删或误替换。

总结

本文介绍了使用 Python 操作 PDF 图片的几种核心场景:向页面插入新图片、替换已有图片、按索引或按位置删除图片,以及跨页面的批量处理。这些操作主要依赖 PdfImagePdfImageHelper 两个核心类。

掌握这些技巧后,可以进一步探索图片的高级操作,如设置图片透明度、添加图片水印、旋转图片角度等。将图片操作与文本处理、页面管理等功能结合使用,能够构建功能完备的 PDF 自动化处理流程。

相关推荐
工具派3 小时前
从 git commit 到交付 PDF:我的一条在线工具流实录
git·elasticsearch·pdf
yaoxin52112312 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
中微极客12 小时前
解锁LLM开发全栈能力:Python + LangChain + RAG 工程实战指南
人工智能·python·langchain
hhzz13 小时前
Barbershop:基于GAN和分割Mask的图像合成技术——从理论到实战全解析
图像处理·人工智能·python·深度学习·计算机视觉
Ulyanov14 小时前
雷达导引头Python仿真框架:GPU加速、6-DOF模型与半实物仿真接口
开发语言·python·雷达信号处理·雷达导引头
列逍15 小时前
博客系统测试
自动化测试·python·性能测试
星云开发15 小时前
拒绝无效加班!用Python打造自动化办公流,附Word/PDF互转硬核代码
python
dream_home840716 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
AIGS00116 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
李可以量化16 小时前
PTrade 量化策略实战:二八轮动策略深度解析(下)
python