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.pswp.cn/web/76196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76196.shtml
英文地址,請注明出處:http://en.pswp.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時, 假設輸入信號為: