Python批量處理PDF圖片的操作指南(插入、壓縮、提取、替換、分頁(yè)、旋轉(zhuǎn)、刪除)
一、概述
圖片是 PDF 文檔的核心元素之一,它們不僅能夠增強(qiáng)文檔的視覺吸引力,還能有效傳達(dá)信息,幫助讀者更好地理解內(nèi)容和主題。在實(shí)際操作中,我們常需要對(duì)PDF中的圖片進(jìn)行多種處理,包括插入、提取、替換、旋轉(zhuǎn)、分頁(yè)、壓縮、刪除等。通過Python編程實(shí)現(xiàn)這些操作的自動(dòng)化,不僅可以提升工作效率,還能減少人為錯(cuò)誤率,特別適用于大批量文檔處理的場(chǎng)景。這篇文章將詳細(xì)介紹如何使用Python在PDF中實(shí)現(xiàn)圖片插入、提取、替換、壓縮、分頁(yè)、旋轉(zhuǎn)和刪除等操作。
二、 使用工具
要在Python中實(shí)現(xiàn)PDF圖片處理,需要一個(gè)合適的PDF處理庫(kù)。本文將使用Spire.PDF for Python,該庫(kù)主要用于在Python應(yīng)用程序中創(chuàng)建、讀取、轉(zhuǎn)換和編輯PDF文檔。
安裝 Spire.PDF
在開始之前,需要先安裝 Spire.PDF 庫(kù)。你可以在終端中運(yùn)行以下命令進(jìn)行安裝:
pip install spire.pdf
三、Python 在 PDF 中插入圖片
插入圖片可以分多種場(chǎng)景,例如插入圖片到現(xiàn)有PDF,插入圖片到新建PDF,批量插入多張圖片到PDF等。下面將對(duì)這幾種場(chǎng)景進(jìn)行逐一介紹。
3.1 插入圖片到現(xiàn)有PDF
實(shí)現(xiàn)步驟
- 使用PdfDocument類加載現(xiàn)有PDF文檔。
- 使用PdfDocument.Pages[index]屬性獲取要插入圖片的目標(biāo)頁(yè)面。
- 使用PdfImage.FromFile方法加載圖片到PdfImage對(duì)象。
- 使用PdfPageBase.Canvas.DrawImage()方法將該圖片對(duì)象繪制到頁(yè)面的指定位置。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果PDF文檔。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何插入一張圖片到現(xiàn)有PDF文檔:
from spire.pdf import *
# 打開現(xiàn)有PDF文檔
pdf = PdfDocument("測(cè)試.pdf")
# 獲取第一頁(yè)
page = pdf.Pages[0]
# 加載圖片
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")
# 指定繪制圖片的坐標(biāo)和大小 (如果需要按照原圖大小插入,則不指定寬度和高度)
x, y, width, height = 50.0, 50.0, 200.0, 200.0
# 在第一頁(yè)的指定位置繪制圖片
page.Canvas.DrawImage(image, x, y, width, height)
# 將文檔保存為新PDF文件
pdf.SaveToFile("插入圖片到現(xiàn)有PDF.pdf", FileFormat.PDF)
pdf.Close()3.2 插入圖片到新建PDF
實(shí)現(xiàn)步驟
- 使用PdfDocument類創(chuàng)建一個(gè)新的PDF文檔。
- 使用PdfDocument.Pages.Add()方法給新建的PDF文檔添加一個(gè)頁(yè)面。
- 使用PdfImage.FromFile方法加載圖片到PdfImage對(duì)象。
- 使用PdfPageBase.Canvas.DrawImage()方法將該圖片對(duì)象繪制到頁(yè)面的指定位置。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果PDF文檔。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何新建一個(gè)PDF文檔并插入一張圖片:
from spire.pdf import *
# 創(chuàng)建PDF文檔
pdf = PdfDocument()
# 添加頁(yè)面
page = pdf.Pages.Add()
# 加載圖片
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")
# 指定繪制圖片的坐標(biāo)和大小
x, y, width, height = 10.0, 50.0, 200.0, 100.0
# 在第一頁(yè)的指定位置繪制圖片 (如果需要按照原圖大小插入,則不指定寬度和高度)
page.Canvas.DrawImage(image, x, y, width, height)
# 保存修改后的文檔
pdf.SaveToFile("插入圖片到新建PDF.pdf", FileFormat.PDF)
pdf.Close()3.3 批量插入多張圖片到PDF
實(shí)現(xiàn)步驟
批量插入圖片到PDF需要遍歷圖片列表,然后依次將它們繪制到PDF頁(yè)面上。實(shí)現(xiàn)步驟與上面的步驟類似,這里不再詳細(xì)描述。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何批量插入多張圖片到一個(gè)新的PDF文檔:
from spire.pdf import *
def batch_insert_images(image_paths, positions):
# 創(chuàng)建新的PDF文檔
pdf = PdfDocument()
# 遍歷圖片文件列表
for img_path, pos in zip(image_paths, positions):
# 添加新頁(yè)面
page = pdf.Pages.Add()
# 加載圖片
image = PdfImage.FromFile(img_path)
# 在頁(yè)面上繪制圖片到指定位置
page.Canvas.DrawImage(image, *pos)
# 保存PDF文檔
pdf.SaveToFile("批量插入圖片.pdf", FileFormat.PDF)
pdf.Close()
# 調(diào)用
image_paths = [
"C:/Users/Administrator/Desktop/img1.png",
"C:/Users/Administrator/Desktop/img2.png",
"C:/Users/Administrator/Desktop/img3.png",
]
positions = [
(0, 0), # 第一個(gè)圖片的位置
(0, 0), # 第二個(gè)圖片的位置
(0, 0), # 第三個(gè)圖片的位置
]
batch_insert_images(image_paths, positions)四、Python 提取 PDF 圖片及其元數(shù)據(jù)
實(shí)現(xiàn)步驟
- 使用PdfDocument類加載PDF文檔。
- 遍歷文檔的所有頁(yè)面。
- 獲取當(dāng)前頁(yè)面的圖片信息集合。
- 遍歷頁(yè)面的圖片信息集合。
- 獲取每張圖片的位置信息和尺寸。
- 將圖片保存到指定路徑并打印其元數(shù)據(jù),如所在頁(yè)碼、圖片號(hào)、位置、尺寸、保存位置等。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何提取PDF中的圖片及其元數(shù)據(jù),如尺寸、位置和所在頁(yè)碼:
from spire.pdf import *
import os
# 打開現(xiàn)有PDF文檔
pdf = PdfDocument("測(cè)試.pdf")
# 創(chuàng)建保存圖片的目錄
output_dir = "提取的圖片"
os.makedirs(output_dir, exist_ok=True)
# 遍歷所有頁(yè)面
for page_index in range(pdf.Pages.Count):
page = pdf.Pages[page_index]
imageInfo = page.ImagesInfo
# 提取頁(yè)面上的所有圖片
for i in range(len(imageInfo)):
# 獲取圖片的位置信息和尺寸
bounds = imageInfo[i].Bounds
width = bounds.Width
height = bounds.Height
# 構(gòu)建保存圖片的文件路徑
file_path = os.path.join(output_dir, f"page{page_index + 1}_image_{i + 1}.png")
# 保存圖片到指定路徑
imageInfo[i].Image.Save(file_path)
# 打印圖片的詳細(xì)信息
print({
"頁(yè)面": page_index + 1,
"圖片": i + 1,
"寬度和高度": f"{width}x{height}",
"位置": (bounds.X, bounds.Y),
"保存位置": file_path
})
# 關(guān)閉文檔
pdf.Close()五、Python 替換 PDF 圖片
替換PDF圖片可以分兩種場(chǎng)景,一種是使用新圖片替換文檔中的圖片,另一種是使用文字替換圖片。下面將對(duì)這兩種替換場(chǎng)景進(jìn)行逐一介紹。
5.1 使用圖片替換圖片
實(shí)現(xiàn)步驟
- 使用PdfDocument類加載PDF文檔。
- 使用PdfDocument.Pages[index]屬性獲取要替換圖片的目標(biāo)頁(yè)面。
- 使用PdfPageBase.ReplaceImage()方法將頁(yè)面中的指定圖片替換為新圖片。使用該方法,替換后的圖片將保持原始圖片的大小和位置。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果PDF文檔。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何使用新圖片替換PDF中的指定圖片:
from spire.pdf import *
# 打開現(xiàn)有PDF文檔
pdf = PdfDocument("測(cè)試.pdf")
# 獲取第一頁(yè)
page = pdf.Pages[0]
# 加載新圖片
new_image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img1.png")
# 用新圖片替換頁(yè)面上的第一個(gè)圖片
page.ReplaceImage(0, new_image)
# 保存修改后的文檔
pdf.SaveToFile("圖片替換圖片.pdf")
pdf.Close()5.2 使用文字替換圖片
實(shí)現(xiàn)步驟
- 使用PdfDocument類加載PDF文檔。
- 使用PdfDocument.Pages[index]屬性獲取要替換圖片的目標(biāo)頁(yè)面。
- 使用PdfPageBase.ImagesInfo屬性獲取頁(yè)面的圖片信息。
- 從圖片信息集合中獲取第一個(gè)圖片的圖片流數(shù)據(jù)并將其加載到PdfImage對(duì)象。
- 獲取圖片對(duì)象的尺寸和坐標(biāo)位置。
- 將圖片從頁(yè)面中刪除。
- 將文字繪制到圖片位置。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果文檔。
實(shí)現(xiàn)代碼:
from spire.pdf import *
# 打開現(xiàn)有PDF文檔
pdf = PdfDocument("測(cè)試.pdf")
# 獲取PDF第一頁(yè)
page = pdf.Pages[0]
# 從頁(yè)面獲取圖片信息
imageInfo = page.ImagesInfo
# 提取頁(yè)面中的第一個(gè)圖片
image = PdfImage.FromStream(imageInfo[0].Image)
# 獲取圖片的尺寸(單位為像素)
widthInPixel = image.Width
heightInPixel = image.Height
# 將像素值轉(zhuǎn)換為磅值
convertor = PdfUnitConvertor()
width = convertor.ConvertFromPixels(float(widthInPixel), PdfGraphicsUnit.Point)
height = convertor.ConvertFromPixels(float(heightInPixel), PdfGraphicsUnit.Point)
# 獲取圖片的坐標(biāo)
x = imageInfo[0].Bounds.X
y = imageInfo[0].Bounds.Y
# 從頁(yè)面刪除圖片
page.DeleteImage(0)
# 指定繪制文字的矩形區(qū)域(與圖片的位置和尺寸相同)
rect = RectangleF(PointF(x, y), SizeF(width, height))
# 設(shè)置文本對(duì)齊方式
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 實(shí)現(xiàn) PDF 圖片分頁(yè)布局
實(shí)現(xiàn)步驟
在將圖片插入PDF頁(yè)面時(shí),可能會(huì)遇到圖片太大,一張頁(yè)面顯示不完的情況。這種情況下,就需要將顯示不完的部分繪制到下一頁(yè),以確保其完全可見。具體實(shí)現(xiàn)步驟如下:
- 使用PdfDocument類新建一個(gè)PDF文檔。
- 向文檔中添加一頁(yè)。
- 使用PdfTextLayout類設(shè)置分頁(yè)布局。
- 使用PdfImage.Draw()方法,以分頁(yè)布局在頁(yè)面上繪制圖片。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果PDF文檔。
示例代碼
以下Python代碼展示了如何添加一張大圖片到PDF并使其分頁(yè)顯示:
from spire.pdf import *
# 創(chuàng)建PDF文檔
pdf = PdfDocument()
# 添加頁(yè)面
page = pdf.Pages.Add()
# 加載圖片
image = PdfImage.FromFile("img.png")
# 設(shè)置布局選項(xiàng),使圖片分頁(yè)
format = PdfTextLayout()
format.Break = PdfLayoutBreakType.FitPage
format.Layout = PdfLayoutType.Paginate
# 使用分頁(yè)布局在頁(yè)面上繪制圖片
image.Draw(page, 20.0, 600.0, format)
# 保存PDF文檔
pdf.SaveToFile("圖片分頁(yè).pdf")
pdf.Close()七、Python 設(shè)置 PDF 圖片透明度與旋轉(zhuǎn)
實(shí)現(xiàn)步驟
- 使用PdfDocument類新建一個(gè)PDF文檔。
- 使用PdfDocument.Pages.Add()方法向文檔中添加一頁(yè)。
- 使用PdfPageBase.Canvas.Save()方法保存頁(yè)面畫布的初始狀態(tài)。
- 使用PdfPageBase.Canvas.SetTransparency()方法對(duì)頁(yè)面畫布應(yīng)用透明度。
- 使用PdfPageBase.Canvas.RotateTransform()方法將頁(yè)面的坐標(biāo)系移動(dòng)到繪制圖片的位置并旋轉(zhuǎn)特定角度。
- 使用PdfImage.FromFile方法加載圖片到PdfImage對(duì)象。
- 使用PdfPageBase.Canvas.DrawImage()方法將該圖片對(duì)象繪制到頁(yè)面的指定位置。
- 使用PdfPageBase.Canvas.Restore()方法恢復(fù)頁(yè)面畫布的狀態(tài)。
- 使用PdfDocument.SaveToFile()方法保存結(jié)果PDF文檔。
實(shí)現(xiàn)代碼
以下Python代碼展示了如何在PDF中設(shè)置圖片的透明度與旋轉(zhuǎn)角度:
from spire.pdf.common import *
from spire.pdf import *
# 創(chuàng)建PDF文檔
pdf = PdfDocument()
# 添加頁(yè)面
page = pdf.Pages.Add()
# 指定繪制圖片的位置和尺寸
x, y, width, height = 50.0, 200.0, 200.0, 100.0
# 保存頁(yè)面畫布的狀態(tài)
state = page.Canvas.Save()
# 對(duì)頁(yè)面畫布應(yīng)用透明度
page.Canvas.SetTransparency(0.5)
# 將坐標(biāo)系移動(dòng)到繪制圖片的特定坐標(biāo),并將頁(yè)面畫布逆時(shí)針旋轉(zhuǎn)45度
page.Canvas.RotateTransform(-45.0, PointF(x, y))
# 加載圖片
image = PdfImage.FromFile("C:/Users/Administrator/Desktop/img.png")
# 在頁(yè)面的指定位置繪制圖片
page.Canvas.DrawImage(image, x, y, width, height)
# 恢復(fù)頁(yè)面畫布的狀態(tài)
page.Canvas.Restore(state)
# 保存PDF文檔
pdf.SaveToFile("設(shè)置圖片透明度與旋轉(zhuǎn).pdf")
pdf.Close()八、Python 壓縮 PDF 圖片
實(shí)現(xiàn)步驟
- 使用PdfCompressor類打開PDF文檔。
- 設(shè)置圖片壓縮選項(xiàng)。
- 使用PdfCompressor.CompressToFile()方法壓縮PDF并保存。
示例代碼
以下Python代碼展示了如何壓縮PDF文檔中的圖片:
from spire.pdf import *
# 使用PdfCompressor類打開現(xiàn)有PDF
compressor = PdfCompressor("測(cè)試.pdf")
# 設(shè)置圖片壓縮選項(xiàng)
compression_options = compressor.OptimizationOptions
compression_options.SetImageQuality(ImageQuality.Low)
compression_options.SetResizeImages(True)
compression_options.SetIsCompressImage(True)
# 壓縮PDF文件中的圖片,并將結(jié)果保存到新文件
compressor.CompressToFile("壓縮圖片.pdf")九、Python 刪除 PDF 圖片
實(shí)現(xiàn)步驟
- 使用PdfDocument類打開PDF文檔。
- 遍歷文檔中的所有頁(yè)面。
- 使用PdfPageBase.ImagesInfo屬性獲取當(dāng)前頁(yè)面的圖片信息集合。
- 遍歷集合中的所有圖片。
- 使用PdfPageBase.DeleteImage()方法將當(dāng)前圖片從頁(yè)面上刪除。
- 使用Pdf.SaveToFile()方法保存修改后的PDF文檔。
示例代碼
以下Python代碼展示了如何刪除PDF文檔中的圖片:
from spire.pdf import *
# 打開現(xiàn)有PDF文檔
pdf = PdfDocument("example.pdf")
# 遍歷所有頁(yè)面
for page_index in range(pdf.Pages.Count):
page = pdf.Pages[page_index]
imageInfo = page.ImagesInfo
# 刪除頁(yè)面上的所有圖片
for i in range(len(imageInfo) - 1, -1, -1):
page.DeleteImage(imageInfo[i])
# 保存文檔
pdf.SaveToFile("刪除圖片.pdf")
pdf.Close()以上就是使用Python處理PDF圖片的所有內(nèi)容。
到此這篇關(guān)于Python批量處理PDF圖片的操作指南(插入、壓縮、提取、替換、分頁(yè)、旋轉(zhuǎn)、刪除)的文章就介紹到這了,更多相關(guān)Python處理PDF圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python調(diào)用requests庫(kù)實(shí)現(xiàn)自動(dòng)化發(fā)牌功能
在游戲開發(fā)或自動(dòng)化測(cè)試中,快速生成隨機(jī)撲克牌是一個(gè)常見需求,本文將使用Python中的requests庫(kù)實(shí)現(xiàn)自動(dòng)化發(fā)牌功能,有需要的小伙伴可以參考一下2025-07-07
Python使用進(jìn)程池并發(fā)執(zhí)行SQL語句的操作代碼
Python的進(jìn)程池是一種并發(fā)工具,它允許我們將任務(wù)分發(fā)給一組工作進(jìn)程,這些進(jìn)程可以同時(shí)運(yùn)行并共享一個(gè)進(jìn)程池,本文給大家介紹了Python使用進(jìn)程池并發(fā)執(zhí)行SQL語句的操作代碼,需要的朋友可以參考下2024-10-10
使用python socket分發(fā)大文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇使用python socket分發(fā)大文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python 高效去重復(fù) 支持GB級(jí)別大文件的示例代碼
今天小編就為大家分享一篇python 高效去重復(fù) 支持GB級(jí)別大文件的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Django項(xiàng)目中用JS實(shí)現(xiàn)加載子頁(yè)面并傳值的方法
今天小編就為大家分享一篇Django項(xiàng)目中用JS實(shí)現(xiàn)加載子頁(yè)面并傳值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
用Python的Flask框架結(jié)合MySQL寫一個(gè)內(nèi)存監(jiān)控程序
這篇文章主要介紹了用Python的Flask框架結(jié)合MySQL些一個(gè)內(nèi)存監(jiān)控程序的例子,并且能將結(jié)果作簡(jiǎn)單的圖形化顯示,需要的朋友可以參考下2015-11-11

