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

目录

一、概述

[二、 使用工具](#二、 使用工具)

[三、Python 在 PDF 中插入图片](#三、Python 在 PDF 中插入图片)

[3.1 插入图片到现有PDF](#3.1 插入图片到现有PDF)

[3.2 插入图片到新建PDF](#3.2 插入图片到新建PDF)

[3.3 批量插入多张图片到PDF](#3.3 批量插入多张图片到PDF)

[四、Python 提取 PDF 图片及其元数据](#四、Python 提取 PDF 图片及其元数据)

[五、Python 替换 PDF 图片](#五、Python 替换 PDF 图片)

[5.1 使用图片替换图片](#5.1 使用图片替换图片)

[5.2 使用文字替换图片](#5.2 使用文字替换图片)

[六、Python 实现 PDF 图片分页布局](#六、Python 实现 PDF 图片分页布局)

[七、Python 设置 PDF 图片透明度与旋转](#七、Python 设置 PDF 图片透明度与旋转)

[八、Python 压缩 PDF 图片](#八、Python 压缩 PDF 图片)

[九、Python 删除 PDF 图片](#九、Python 删除 PDF 图片)


一、概述

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

二、 使用工具

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

安装 Spire.PDF

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

python 复制代码
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文档:

python 复制代码
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文档并插入一张图片:

python 复制代码
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文档:

python 复制代码
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中的图片及其元数据,如尺寸、位置和所在页码:

python 复制代码
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中的指定图片:

python 复制代码
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()**方法保存结果文档。

实现代码:

python 复制代码
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并使其分页显示:

python 复制代码
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中设置图片的透明度与旋转角度:

python 复制代码
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文档中的图片:

python 复制代码
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文档中的图片:

python 复制代码
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图片的所有内容。感谢阅读!

相关推荐
这里有鱼汤5 分钟前
无需HTML/CSS!用Python零基础打造专业级数据应用——Streamlit入门指南
前端·后端·python
三月樱13 分钟前
通过python实现bilibili缓存视频转为mp4格式
python·音视频
这里有鱼汤18 分钟前
10 分钟搞定一个 Python Web 应用?这不比泡面更香!🍜
python
梓羽玩Python22 分钟前
这个开源神器终结了AI数据整合的噩梦!一键聚合网页、代码、论文到剪贴板!
人工智能·python·github
一个天蝎座 白勺 程序猿32 分钟前
Python(16)Python文件操作终极指南:安全读写与高效处理实践
开发语言·python·安全
天才测试猿41 分钟前
接口测试之postman使用指南
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
databook41 分钟前
Python3.14 即将带来的变化
python
CodeCraft Studio1 小时前
PDF处理控件Aspose.PDF指南:使用 C# 从 PDF 文档中删除页面
前端·pdf·c#
H.ZWei1 小时前
鸿蒙应用开发—鸿蒙app一键安装脚本
python·华为·harmonyos·安装·hdc
全栈小51 小时前
【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
pdf·c#·html