Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录

一、概述

二、 使用工具

三、Python 在 PDF 中插入图片

3.1 插入图片到现有PDF

3.2 插入图片到新建PDF

3.3 批量插入多张图片到PDF

四、Python 提取 PDF 图片及其元数据

五、Python 替换 PDF 图片

5.1 使用图片替换图片

5.2 使用文字替换图片

六、Python 实现 PDF 图片分页布局

七、Python 设置 PDF 图片透明度与旋转

八、Python 压缩 PDF 图片

九、Python 删除 PDF 图片


一、概述

图片是 PDF 文档的核心元素之一,它们不仅能够增强文档的视觉吸引力,还能有效传达信息,帮助读者更好地理解内容和主题。在实际操作中,我们常需要对PDF中的图片进行多种处理,包括插入、提取、替换、旋转、分页、压缩、删除等。通过Python编程实现这些操作的自动化,不仅可以提升工作效率,还能减少人为错误率,特别适用于大批量文档处理的场景。这篇文章将详细介绍如何使用Python在PDF中实现图片插入、提取、替换、压缩、分页、旋转和删除等操作。

Python 插入、提取、替换、压缩、旋转和删除图片

二、 使用工具

要在Python中实现PDF图片处理,需要一个合适的PDF处理库。本文将使用Spire.PDF for Python,该库主要用于在Python应用程序中创建、读取、转换和编辑PDF文档。

安装 Spire.PDF

在开始之前,需要先安装 Spire.PDF 库。你可以在终端中运行以下命令进行安装:

pip install spire.pdf

三、Python 在 PDF 中插入图片

插入图片可以分多种场景,例如插入图片到现有PDF,插入图片到新建PDF,批量插入多张图片到PDF等。下面将对这几种场景进行逐一介绍。

3.1 插入图片到现有PDF

实现步骤

  • 使用PdfDocument类加载现有PDF文档。
  • 使用PdfDocument.Pages[index]属性获取要插入图片的目标页面。
  • 使用PdfImage.FromFile方法加载图片到PdfImage对象。
  • 使用PdfPageBase.Canvas.DrawImage()方法将该图片对象绘制到页面的指定位置。
  • 使用PdfDocument.SaveToFile()方法保存结果PDF文档。

实现代码

以下Python代码展示了如何插入一张图片到现有PDF文档:

from spire.pdf import *# 打开现有PDF文档
pdf = PdfDocument("测试.pdf")# 获取第一页
page = pdf.Pages[0]# 加载图片
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")# 指定绘制图片的坐标和大小 (如果需要按照原图大小插入,则不指定宽度和高度)
x, y, width, height = 50.0, 50.0, 200.0, 200.0# 在第一页的指定位置绘制图片
page.Canvas.DrawImage(image, x, y, width, height)# 将文档保存为新PDF文件
pdf.SaveToFile("插入图片到现有PDF.pdf", FileFormat.PDF)
pdf.Close()

3.2 插入图片到新建PDF

实现步骤

  • 使用PdfDocument类创建一个新的PDF文档。
  • 使用PdfDocument.Pages.Add()方法给新建的PDF文档添加一个页面。
  • 使用PdfImage.FromFile方法加载图片到PdfImage对象。
  • 使用PdfPageBase.Canvas.DrawImage()方法将该图片对象绘制到页面的指定位置。
  • 使用PdfDocument.SaveToFile()方法保存结果PDF文档。

实现代码

以下Python代码展示了如何新建一个PDF文档并插入一张图片:

from spire.pdf import *# 创建PDF文档
pdf = PdfDocument()# 添加页面
page = pdf.Pages.Add()# 加载图片
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")# 指定绘制图片的坐标和大小
x, y, width, height = 10.0, 50.0, 200.0, 100.0# 在第一页的指定位置绘制图片 (如果需要按照原图大小插入,则不指定宽度和高度)
page.Canvas.DrawImage(image, x, y, width, height)# 保存修改后的文档
pdf.SaveToFile("插入图片到新建PDF.pdf", FileFormat.PDF)
pdf.Close()

3.3 批量插入多张图片到PDF

实现步骤

批量插入图片到PDF需要遍历图片列表,然后依次将它们绘制到PDF页面上。实现步骤与上面的步骤类似,这里不再详细描述。

实现代码

以下Python代码展示了如何批量插入多张图片到一个新的PDF文档:

from spire.pdf import *def batch_insert_images(image_paths, positions):# 创建新的PDF文档pdf = PdfDocument()# 遍历图片文件列表for img_path, pos in zip(image_paths, positions):# 添加新页面page = pdf.Pages.Add()# 加载图片image = PdfImage.FromFile(img_path)# 在页面上绘制图片到指定位置page.Canvas.DrawImage(image, *pos)# 保存PDF文档pdf.SaveToFile("批量插入图片.pdf", FileFormat.PDF)pdf.Close()# 调用
image_paths = ["C:/Users/Administrator/Desktop/img1.png","C:/Users/Administrator/Desktop/img2.png","C:/Users/Administrator/Desktop/img3.png",
]
positions = [(0, 0),  # 第一个图片的位置(0, 0),  # 第二个图片的位置(0, 0),  # 第三个图片的位置
]batch_insert_images(image_paths, positions)

四、Python 提取 PDF 图片及其元数据

实现步骤

  • 使用PdfDocument类加载PDF文档。
  • 遍历文档的所有页面。
    • 获取当前页面的图片信息集合。
    • 遍历页面的图片信息集合。
      • 获取每张图片的位置信息和尺寸。
      • 将图片保存到指定路径并打印其元数据,如所在页码、图片号、位置、尺寸、保存位置等。

实现代码

以下Python代码展示了如何提取PDF中的图片及其元数据,如尺寸、位置和所在页码:

from spire.pdf import *
import os# 打开现有PDF文档
pdf = PdfDocument("测试.pdf")# 创建保存图片的目录
output_dir = "提取的图片"
os.makedirs(output_dir, exist_ok=True)# 遍历所有页面
for page_index in range(pdf.Pages.Count):page = pdf.Pages[page_index]imageInfo = page.ImagesInfo# 提取页面上的所有图片for i in range(len(imageInfo)):# 获取图片的位置信息和尺寸bounds = imageInfo[i].Boundswidth = bounds.Widthheight = bounds.Height# 构建保存图片的文件路径file_path = os.path.join(output_dir, f"page{page_index + 1}_image_{i + 1}.png")# 保存图片到指定路径imageInfo[i].Image.Save(file_path)# 打印图片的详细信息print({"页面": page_index + 1,"图片": i + 1,"宽度和高度": f"{width}x{height}","位置": (bounds.X, bounds.Y),"保存位置": file_path})# 关闭文档
pdf.Close()

五、Python 替换 PDF 图片

替换PDF图片可以分两种场景,一种是使用新图片替换文档中的图片,另一种是使用文字替换图片。下面将对这两种替换场景进行逐一介绍。

5.1 使用图片替换图片

实现步骤

  • 使用PdfDocument类加载PDF文档。
  • 使用PdfDocument.Pages[index]属性获取要替换图片的目标页面。
  • 使用PdfPageBase.ReplaceImage()方法将页面中的指定图片替换为新图片。使用该方法,替换后的图片将保持原始图片的大小和位置。
  • 使用PdfDocument.SaveToFile()方法保存结果PDF文档。

实现代码

以下Python代码展示了如何使用新图片替换PDF中的指定图片:

from spire.pdf import *# 打开现有PDF文档
pdf = PdfDocument("测试.pdf")# 获取第一页
page = pdf.Pages[0]# 加载新图片
new_image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img1.png")# 用新图片替换页面上的第一个图片
page.ReplaceImage(0, new_image)# 保存修改后的文档
pdf.SaveToFile("图片替换图片.pdf")
pdf.Close()

5.2 使用文字替换图片

实现步骤

  • 使用PdfDocument类加载PDF文档。
  • 使用PdfDocument.Pages[index]属性获取要替换图片的目标页面。
  • 使用PdfPageBase.ImagesInfo属性获取页面的图片信息。
  • 从图片信息集合中获取第一个图片的图片流数据并将其加载到PdfImage对象。
  • 获取图片对象的尺寸和坐标位置。
  • 将图片从页面中删除。
  • 将文字绘制到图片位置。
  • 使用PdfDocument.SaveToFile()方法保存结果文档。

实现代码:

from spire.pdf import *# 打开现有PDF文档
pdf = PdfDocument("测试.pdf")# 获取PDF第一页
page = pdf.Pages[0]# 从页面获取图片信息
imageInfo = page.ImagesInfo# 提取页面中的第一个图片
image = PdfImage.FromStream(imageInfo[0].Image)# 获取图片的尺寸(单位为像素)
widthInPixel = image.Width
heightInPixel = image.Height# 将像素值转换为磅值
convertor = PdfUnitConvertor()
width = convertor.ConvertFromPixels(float(widthInPixel), PdfGraphicsUnit.Point)
height = convertor.ConvertFromPixels(float(heightInPixel), PdfGraphicsUnit.Point)# 获取图片的坐标
x = imageInfo[0].Bounds.X
y = imageInfo[0].Bounds.Y# 从页面删除图片
page.DeleteImage(0)# 指定绘制文字的矩形区域(与图片的位置和尺寸相同)
rect = RectangleF(PointF(x, y), SizeF(width, height))# 设置文本对齐方式
strformat = PdfStringFormat()
strformat.Alignment = PdfTextAlignment.Center
strformat.LineAlignment = PdfVerticalAlignment.Middle# 将文字绘制到图片位置
page.Canvas.DrawString("替换文本", PdfFont(PdfFontFamily.Helvetica, 18.0), PdfBrushes.get_Purple(), rect, strformat)# 保存修改后的PDF
pdf.SaveToFile("文字替换图片.pdf")
pdf.Close()

六、Python 实现 PDF 图片分页布局

实现步骤

在将图片插入PDF页面时,可能会遇到图片太大,一张页面显示不完的情况。这种情况下,就需要将显示不完的部分绘制到下一页,以确保其完全可见。具体实现步骤如下:

  • 使用PdfDocument类新建一个PDF文档。
  • 向文档中添加一页。
  • 使用PdfTextLayout类设置分页布局。
  • 使用PdfImage.Draw()方法,以分页布局在页面上绘制图片。
  • 使用PdfDocument.SaveToFile()方法保存结果PDF文档。

示例代码

以下Python代码展示了如何添加一张大图片到PDF并使其分页显示:

from spire.pdf import *# 创建PDF文档
pdf = PdfDocument()# 添加页面
page = pdf.Pages.Add()# 加载图片
image = PdfImage.FromFile("img.png")# 设置布局选项,使图片分页
format = PdfTextLayout()
format.Break = PdfLayoutBreakType.FitPage
format.Layout = PdfLayoutType.Paginate# 使用分页布局在页面上绘制图片
image.Draw(page, 20.0, 600.0, format)# 保存PDF文档
pdf.SaveToFile("图片分页.pdf")
pdf.Close()

七、Python 设置 PDF 图片透明度与旋转

实现步骤

  • 使用PdfDocument类新建一个PDF文档。
  • 使用PdfDocument.Pages.Add()方法向文档中添加一页。
  • 使用PdfPageBase.Canvas.Save()方法保存页面画布的初始状态。
  • 使用PdfPageBase.Canvas.SetTransparency()方法对页面画布应用透明度。
  • 使用PdfPageBase.Canvas.RotateTransform()方法将页面的坐标系移动到绘制图片的位置并旋转特定角度。
  • 使用PdfImage.FromFile方法加载图片到PdfImage对象。
  • 使用PdfPageBase.Canvas.DrawImage()方法将该图片对象绘制到页面的指定位置。
  • 使用PdfPageBase.Canvas.Restore()方法恢复页面画布的状态。
  • 使用PdfDocument.SaveToFile()方法保存结果PDF文档。

实现代码

以下Python代码展示了如何在PDF中设置图片的透明度与旋转角度:

from spire.pdf.common import *
from spire.pdf import *# 创建PDF文档
pdf = PdfDocument()# 添加页面
page = pdf.Pages.Add()# 指定绘制图片的位置和尺寸
x, y, width, height = 50.0, 200.0, 200.0, 100.0# 保存页面画布的状态
state = page.Canvas.Save()# 对页面画布应用透明度
page.Canvas.SetTransparency(0.5)# 将坐标系移动到绘制图片的特定坐标,并将页面画布逆时针旋转45度
page.Canvas.RotateTransform(-45.0, PointF(x, y))# 加载图片 
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")# 在页面的指定位置绘制图片
page.Canvas.DrawImage(image, x, y, width, height)# 恢复页面画布的状态
page.Canvas.Restore(state)# 保存PDF文档        
pdf.SaveToFile("设置图片透明度与旋转.pdf")
pdf.Close()

八、Python 压缩 PDF 图片

实现步骤

  • 使用PdfCompressor类打开PDF文档。
  • 设置图片压缩选项。
  • 使用PdfCompressor.CompressToFile()方法压缩PDF并保存。

示例代码

以下Python代码展示了如何压缩PDF文档中的图片:

from spire.pdf import *# 使用PdfCompressor类打开现有PDF
compressor = PdfCompressor("测试.pdf")# 设置图片压缩选项
compression_options = compressor.OptimizationOptions
compression_options.SetImageQuality(ImageQuality.Low)
compression_options.SetResizeImages(True)
compression_options.SetIsCompressImage(True)# 压缩PDF文件中的图片,并将结果保存到新文件
compressor.CompressToFile("压缩图片.pdf")

九、Python 删除 PDF 图片

实现步骤

  • 使用PdfDocument类打开PDF文档。
  • 遍历文档中的所有页面。
  • 使用PdfPageBase.ImagesInfo属性获取当前页面的图片信息集合。
  • 遍历集合中的所有图片。
    • 使用PdfPageBase.DeleteImage()方法将当前图片从页面上删除。
  • 使用Pdf.SaveToFile()方法保存修改后的PDF文档。

示例代码

以下Python代码展示了如何删除PDF文档中的图片:

from spire.pdf import *# 打开现有PDF文档
pdf = PdfDocument("example.pdf")# 遍历所有页面
for page_index in range(pdf.Pages.Count):page = pdf.Pages[page_index]imageInfo = page.ImagesInfo# 删除页面上的所有图片for i in range(len(imageInfo) - 1, -1, -1):page.DeleteImage(imageInfo[i])# 保存文档
pdf.SaveToFile("删除图片.pdf")
pdf.Close()

以上就是使用Python处理PDF图片的所有内容。感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到

在开发中医知识问答历史对话查看功能的时候,出现了前后端信息获取异同的问题,在经过非常非常非常艰难的查询之后终于解决了这一问题,而这一问题的罪魁祸首就是后端没有setter和getter方法!!!!&a…

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录 应用全局UI状态存储和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 应用全局UI状态存储和持久化V2版本 以下实例AppStorageV2、PersistenceV2和装饰…

最大子序和问题——动态规划/贪心算法解决

目录 一:问题描述 二:解决思路1——动态规划思想 三:C 语言代码实现 四:复杂度分析 五:解决思路2——贪心算法思想 六:具体步骤 七: C语言代码实现 八:复杂度分析 一:问题描述 …

【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例

大家好,我是唐叔!今天给大家带来一篇Python文件读取的终极指南。无论是数据分析、办公自动化还是爬虫开发,文件读取都是Python程序员必须掌握的核心技能。本文将详细介绍Python处理5大常用文件格式的方法,包含完整可运行的代码示例…

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主…

《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》

在深度学习领域,使用循环神经网络(RNN)进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开,深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…

Lambda 函数与 peek 操作的使用案例

Lambda 函数和 peek 操作是 Java 8 Stream API 中非常有用的特性&#xff0c;下面我将介绍它们的使用案例。 Lambda 函数使用案例 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。 集合操作 List<String> names Arrays.asList("Alice", "B…

Docker私有仓库页面访问实现

通过 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有仓库默认不提供网页访问界面。它是一个基于API的后端服务&#xff0c;主要用于镜像的存储和管理。但可以通过以下两种方式实现网页访问&#xff1a; 一、通过第三方Web UI工具扩展 1. 使用 D…

[王阳明代数讲义]语言模型核心代码调研

语言模型核心代码调研 基于Consciciteation‌的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程&#xff0c;实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理&#xff0c;将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制&#xff0c…

flink jobmanager离奇的heap oom

文章目录 现象描述开始分析1.初步分析dump文件2.AI分析引用关系分析方向2.1 flink BlobServer bug分析方向2.2 和运行环境有关分析方向2.3 和任务有关 回到问题本身&#xff0c;思考一下1. seatunnel到底有没有问题2.再次分析zipfile对象3.分析seatunnel es connector 源码4 怀…

APP动态交互原型实例|墨刀变量控制+条件判断教程

引言 不同行业的产品经理在绘制原型图时&#xff0c;拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说&#xff0c;高保真动态交互原型不仅可以在开发前验证交互逻辑&#xff0c;还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…

AI 驱动下的后端开发架构革命:从智能协同体系

AI 驱动下的后端开发架构革命&#xff1a;从智能协同体系 一、引言&#xff1a;AI 重构后端开发范式 在 2025 年的企业级技术演进中&#xff0c;人工智能正从辅助工具升级为核心架构要素。根据 Gartner《2025 智能技术栈成熟度报告》&#xff0c;传统 "人力编码 硬规则…

安卓基础(生命周期)

创建阶段&#xff1a;onCreate方法被调用&#xff0c;用于初始化 Activity&#xff0c;如设置布局等。启动阶段&#xff1a;依次调用onStart和onResume方法&#xff0c;让 Activity 变得可见并可与用户交互。暂停与恢复阶段&#xff1a;当 Activity 失去焦点但可见时&#xff0…

Uniapp: 下拉选择框 ba-tree-picker

目录 1、效果展示2、如何使用2.1 插件市场2.2 引入插件 3、参数配置3.1 属性3.2 方法 4、遇见的问题4.1、设置下拉树的样式 1、效果展示 2、如何使用 2.1 插件市场 首先从插件市场中将插件导入到项目中 2.2 引入插件 在使用的页面引入插件 <view click"showPicke…

Spring Boot实战:基于策略模式+代理模式手写幂等性注解组件

一、为什么需要幂等性&#xff1f; 核心定义&#xff1a;在分布式系统中&#xff0c;一个操作无论执行一次还是多次&#xff0c;最终结果都保持一致。 典型场景&#xff1a; 用户重复点击提交按钮网络抖动导致的请求重试消息队列的重复消费支付系统的回调通知 不处理幂等的风…

如何恢复极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 恢复极狐GitLab (BASIC SELF) 极狐GitLab 提供了一个命令行界面来恢复整个安装&#xff0c;足够灵活以满足您的需求。 恢复…

面试高阶问题:android后台任务(如数据同步、定位)消耗过多电量,导致用户投诉。你会如何分析和优化后台任务的执行?

在现代移动设备生态中,安卓系统以其开放性和灵活性占据了全球智能手机市场的绝大部分份额。作为一款功能强大的操作系统,安卓允许应用程序在后台执行各种任务,例如数据同步、定位服务、消息推送以及其他周期性更新。这些后台任务在提升用户体验方面扮演了不可或缺的角色——…

最近在学习web搞大屏看板

人到中年&#xff0c;delphi发展越来越不行&#xff0c;就业环境是真差啊&#xff0c;没办法&#xff0c;学呗 中国地图&#xff1a; // 中国地图function getChinaMapChart() {// 初始化echarts实例var myEcharts echarts.init(document.getElementById("china_box"…

117.在 Vue 3 中使用 OpenLayers 实现 CTRL 控制拖拽和滚动缩放

✨ 前言 在使用 OpenLayers 开发地图类项目时,我们有时会希望用户必须按下 CTRL(或 Mac 的 Command ⌘ 键)才能拖拽地图或使用鼠标滚轮缩放。这种交互方式能够避免用户在浏览页面时意外滑动或拖动地图,尤其是在地图嵌入页面中时非常有用。 本文将带你一步一步实现在 Vue …

MATLAB 控制系统设计与仿真 - 34

多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增益跟w有关系, 当G(s)为MIMO时,例如2X2时, 假设输入信号为: