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

news2025/4/22 19:10:54

目录

一、概述

二、 使用工具

三、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].Bounds
        width = bounds.Width
        height = 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.coloradmin.cn/o/2335599.html

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

相关文章

七种驱动器综合对比——《器件手册--驱动器》

九、驱动器 名称 功能与作用 工作原理 优势 应用 隔离式栅极驱动器 隔离式栅极驱动器用于控制功率晶体管(如MOSFET、IGBT、SiC或GaN等)的开关,其核心功能是将控制信号从低压侧传输到高压侧的功率器件栅极,同时在输入和输出之…

redis系列--1.redis是什么

国际惯例,想了解一个东西,首先就要看看官方提供了什么。redis的官网是https://redis.io 。以下这段话就是redis的简介了: Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message…

CSS 过渡与变形:让交互更丝滑

在网页设计中,动效能让用户交互更自然、流畅,提升使用体验。本文将通过 CSS 的 transition(过渡)和 transform(变形)属性,带你入门基础动效设计,结合案例演示如何实现颜色渐变、元素…

MecAgent Copilot:机械设计师的AI助手,开启“氛围建模”新时代

MecAgent Copilot作为机械设计师的AI助手,正通过多项核心技术推动机械设计进入“氛围建模”新时代。以下从功能特性、技术支撑和应用场景三方面解析其创新价值: 一、核心功能特性 ​​智能草图生成与参数化建模​​ 支持自然语言输入生成设计草图和3D模型,如输入“剖面透视…

【prometheus+Grafana篇】Prometheus与Grafana:深入了解监控架构与数据可视化分析平台

💫《博主主页》:奈斯DB-CSDN博客 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解 💖如果觉得文章对你有所帮…

【后端开发】初识Spring IoC与SpringDI、图书管理系统

文章目录 图书管理系统用户登录需求分析接口定义前端页面代码服务器代码 图书列表展示需求分析接口定义前端页面部分代码服务器代码Controller层service层Dao层modle层 Spring IoC定义传统程序开发解决方案IoC优势 Spring DIIoC &DI使用主要注解 Spring IoC详解bean的存储五…

git在IDEA中使用技巧

git在IDEA中使用技巧 merge和rebase 参考:IDEA小技巧-Git的使用 git回滚、强推、代码找回 参考:https://www.bilibili.com/video/BV1Wa411a7Ek?spm_id_from333.788.videopod.sections&vd_source2f73252e51731cad48853e9c70337d8e cherry pick …

榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案

无人共享经济下的技术革新 随着无人值守经济模式的快速发展,传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBootMySQLUniApp技术栈,结合物联网与移动互联网技术,为商家提供低成本、高可用的无人化运营解决方案。…

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据: 当前地图有3个图层,两个栅格图层和一个矢量图层 两个栅格图层:beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

考研408参考用书:计算机组成原理(唐朔飞)介绍,附pdf

我用夸克网盘分享了「《计算机组成原理》第2,3版 唐朔飞」, 链接:https://pan.quark.cn/s/6a87d10274a3 1. 书籍定位与适用对象 定位:计算机组成原理是计算机科学与技术、软件工程等专业的核心基础课程,涉及计算机硬件的底层工作原…

国网B接口云镜控制接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议云镜控制接口介绍B.8.1 接口描述B.8.2 接口流程B.8.3 接口参数B.8.3.1 SIP头字段B.8.3.2 SIP响应码B.8.3.3 XML Schema参数定义 B.8.4 消息示例B.8.4.1 云镜控制请求B.8.4.2 云镜控制请求响应 二、B接口云镜控制失败常见问题(一)网…

vue3使用keep-alive缓存组件与踩坑日记

目录 一.了解一下KeepAlive 二.使用keep-alive标签缓存组件 1.声明Home页面名称 三.在路由出口使用keep-alive标签 四.踩坑点1:可能需要配置路由(第三点完成后有效可忽略) 五.踩坑点2:没有找到正确的路由出口 一.了解一下Kee…

gpt2 本地调用调用及其调用配置说明

gpt2 本地调用调用及其调用配置说明 环境依赖安装,模型下载 在大模型应用开发中,需要学会本地调用模型, 要在本地环境调用gpt2 模型需要将模型下载到本地,这里记录本地调用流程: 在huggingface 模型库中查找到需要使…

【Abstract Thought】【Design Patterns】python实现所有个设计模式【下】

前言 彼岸花开一千年,花开花落不相见。 若问花开叶落故,彼岸缘起缘又灭——《我欲封天》 \;\\\;\\\; 目录 前言简单的设计模式复杂的设计模式13责任链14迭代器15备忘录16状态机17模板方法18访问者19观察者20命令Shell21策略22调解23解释器 简单的设计模…

【物联网】PWM控制蜂鸣器

文章目录 一、PWM介绍1.PWM的频率2.PWM的周期 二、PWM工作原理分析三、I.MX6ull PWM介绍1.时钟信号2.工作原理3.FIFO 四、PWM重点寄存器介绍1.PWM Control Register (PWMx_PWMCR)2.PWM Counter Register (PWMx_PWMCNR)3.PWM Period Register (PWMx_PWMPR)4.PWM Sample Register…

Python----机器学习(基于PyTorch的乳腺癌逻辑回归)

Logistic Regression(逻辑回归)是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型,通过Sigmoid函数将输出映射到[0, 1]范围内,表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…

5分钟学会接口自动化测试框架

今天,我们来聊聊接口自动化测试。 接口自动化测试是什么?如何开始?接口自动化测试框架如何搭建? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发…

基于FreeRTOS和LVGL的多功能低功耗智能手表(APP篇)

目录 一、简介 二、软件框架 2.1 MDK工程架构 2.2 CubeMX框架 2.3 板载驱动BSP 1、LCD驱动 2、各个I2C传感器驱动 3、硬件看门狗驱动 4、按键驱动 5、KT6328蓝牙驱动 2.4 管理函数 2.4.1 StrCalculate.c 计算器管理函数 2.4.2 硬件访问机制-HWDataAccess 2.4.3 …

布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维

摘要:在商业竞争日益激烈的当下,布局与终局预判成为企业成功的关键要素。本文探讨了布局与终局预判的智慧性,强调其虽无法做到百分之百准确,但能显著提升思考能力。终局思维作为重要战略工具,并非一步到位的战略部署&a…

告别循环!用Stream优雅处理集合

什么是stream? 也叫Stream流,是jdk8新增的一套API(java.util.stream.*)可以用于操作集合或者数组的数据。 优势:Stream流大量的结合了Lambda语法的风格编程,提供了一种更加强大,更加简单的方式…