Python批量處理PDF圖片的操作指南(插入、壓縮、提取、替換、分頁(yè)、旋轉(zhuǎn)、刪除)
一、概述
圖片是 PDF 文檔的核心元素之一,它們不僅能夠增強(qiáng)文檔的視覺(jué)吸引力,還能有效傳達(dá)信息,幫助讀者更好地理解內(nèi)容和主題。在實(shí)際操作中,我們常需要對(duì)PDF中的圖片進(jìn)行多種處理,包括插入、提取、替換、旋轉(zhuǎn)、分頁(yè)、壓縮、刪除等。通過(guò)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
在開(kāi)始之前,需要先安裝 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 * # 打開(kāi)現(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 # 打開(kāi)現(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 * # 打開(kāi)現(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 * # 打開(kāi)現(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è),以確保其完全可見(jiàn)。具體實(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è)面畫(huà)布的初始狀態(tài)。
- 使用PdfPageBase.Canvas.SetTransparency()方法對(duì)頁(yè)面畫(huà)布應(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è)面畫(huà)布的狀態(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è)面畫(huà)布的狀態(tài) state = page.Canvas.Save() # 對(duì)頁(yè)面畫(huà)布應(yīng)用透明度 page.Canvas.SetTransparency(0.5) # 將坐標(biāo)系移動(dòng)到繪制圖片的特定坐標(biāo),并將頁(yè)面畫(huà)布逆時(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è)面畫(huà)布的狀態(tài) page.Canvas.Restore(state) # 保存PDF文檔 pdf.SaveToFile("設(shè)置圖片透明度與旋轉(zhuǎn).pdf") pdf.Close()
八、Python 壓縮 PDF 圖片
實(shí)現(xiàn)步驟
- 使用PdfCompressor類打開(kāi)PDF文檔。
- 設(shè)置圖片壓縮選項(xiàng)。
- 使用PdfCompressor.CompressToFile()方法壓縮PDF并保存。
示例代碼
以下Python代碼展示了如何壓縮PDF文檔中的圖片:
from spire.pdf import * # 使用PdfCompressor類打開(kāi)現(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類打開(kāi)PDF文檔。
- 遍歷文檔中的所有頁(yè)面。
- 使用PdfPageBase.ImagesInfo屬性獲取當(dāng)前頁(yè)面的圖片信息集合。
- 遍歷集合中的所有圖片。
- 使用PdfPageBase.DeleteImage()方法將當(dāng)前圖片從頁(yè)面上刪除。
- 使用Pdf.SaveToFile()方法保存修改后的PDF文檔。
示例代碼
以下Python代碼展示了如何刪除PDF文檔中的圖片:
from spire.pdf import * # 打開(kāi)現(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使用matplotlib繪制三維參數(shù)曲線操作示例
這篇文章主要介紹了Python使用matplotlib繪制三維參數(shù)曲線操作,結(jié)合實(shí)例形式分析了Python使用matplotlib的數(shù)值計(jì)算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-09-09詳解Ubuntu16.04安裝Python3.7及其pip3并切換為默認(rèn)版本
這篇文章主要介紹了詳解Ubuntu16.04安裝Python3.7及其pip3并切換為默認(rèn)版本,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02django連接Mysql中已有數(shù)據(jù)庫(kù)的方法詳解
眾所周知Django較為適合原生開(kāi)發(fā),即通過(guò)該框架搭建一個(gè)全新的項(xiàng)目,通過(guò)在修改models.py來(lái)創(chuàng)建新的數(shù)據(jù)庫(kù)表,下面這篇文章主要給大家介紹了關(guān)于django連接Mysql中已有數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-05-05探索Python進(jìn)度條魔法解密任務(wù)進(jìn)展新玩法
在日常編程和應(yīng)用開(kāi)發(fā)中,展示進(jìn)度條是一種常見(jiàn)的技巧,不僅能夠提供用戶友好的體驗(yàn),還可以顯示任務(wù)執(zhí)行的進(jìn)度,Python作為一種多才多藝的編程語(yǔ)言,提供了多種方法來(lái)創(chuàng)建進(jìn)度條,本篇文章將深入探討這些方法,為您呈現(xiàn)各種實(shí)現(xiàn)進(jìn)度條的技術(shù)和技巧2024-01-01Python列表創(chuàng)建、操作、刪除與遍歷的全方位解析
Python列表是編程中的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)有序元素集合,列表中的元素可以是不同類型,增強(qiáng)了數(shù)據(jù)處理的靈活性,本文詳細(xì)介紹了列表的常用操作,如查找元素索引、插入、刪除、遍歷等,需要的朋友可以參考下2024-11-11