Python 如何批量壓縮PDF文件或減小PDF文件大小

目錄

安裝Python PDF庫

Python通過壓縮圖片來減小PDF文件大小

Python通過壓縮字體或取消嵌入字體來減小PDF文件大小

Python通過刪除不必要的內容如附件、注釋或表單來減小PDF文件大小

總結


PDF文件憑借其平臺無關性和便攜性,已經成為日常辦公和信息共享的首選格式。然而,很多PDF文件通常都體積較大,給存儲和傳輸帶來不少麻煩。尤其當需要頻繁發送、共享或備份大型PDF時,文件體積問題就會凸顯出來,不僅傳輸速度慢,還耗費大量存儲空間。壓縮PDF文檔可以有效減小PDF文件的大小,加快文件的傳輸和共享。在這篇博客中,我們將探討使用Python壓縮PDF文件的幾種方式:

  • Python通過壓縮圖片來減小PDF文件大小
  • Python通過壓縮字體或取消嵌入字體來減小PDF文件大小
  • Python通過刪除不必要的內容如附件、注釋或表單來減小PDF文件大小

安裝Python PDF庫

要在Python中壓縮PDF文件,可以使用Spire.PDF for Python庫。它支持在Python應用程序中創建、讀取、操作和轉換PDF文檔。

你可以通過在終端運行以下命令來從PyPI安裝Spire.PDF for Python:

pip install Spire.PDF

Python通過壓縮圖片來減小PDF文件大小

很多大型PDF文件中通常包含大量的高分辨率的圖片,這些圖片是造成文件較大的主要原因。通過調整圖片的分辨率和質量可以達到減小PDF文件大小的目的。

壓縮PDF文件中的圖片的主要步驟如下:

  • 創建PdfCompressor實例,用于壓縮指定的PDF文件。
  • 設置壓縮選項,如設置圖片質量、啟用圖片大小調整和壓縮。
  • 使用PdfCompressor.CompressToFile()方法壓縮PDF文檔并將結果保存為一個新的PDF。

下面是批量壓縮一個文件夾下的所有PDF文件中的圖片的實現代碼:

import os
from spire.pdf import *
from spire.pdf.common import *# 設置輸入和輸出文件夾
input_folder = "輸入PDF/"
output_folder = "輸出PDF/"# 創建輸出文件夾(如果不存在)
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍歷輸入文件夾下的所有 PDF 文件
for filename in os.listdir(input_folder):if filename.endswith(".pdf"):input_pdf = os.path.join(input_folder, filename)output_pdf = os.path.join(output_folder, filename)# 創建 PdfCompressor 對象,并設置壓縮選項(設置圖片質量、啟用圖片大小調整和壓縮)compressor = PdfCompressor(input_pdf)compression_options = compressor.OptimizationOptionscompression_options.SetImageQuality(ImageQuality.Medium)compression_options.SetResizeImages(True)compression_options.SetIsCompressImage(True)# 壓縮 PDF 文件并保存到輸出文件夾compressor.CompressToFile(output_pdf)

Python通過壓縮字體或取消嵌入字體來減小PDF文件大小

PDF 中嵌入的字體也會導致文件大小增大。通過壓縮或取消嵌入這些字體有助于減小文件大小。

壓縮PDF文件中的字體或取消嵌入字體的主要步驟如下:

  • 創建PdfCompressor實例,用于壓縮指定的PDF文件。
  • 設置壓縮選項,如啟用字體壓縮或取消嵌入字體。
  • 使用PdfCompressor.CompressToFile()方法壓縮PDF文檔并將結果保存為一個新的PDF。

下面是批量壓縮一個文件夾下的所有PDF文件中的字體或者取消這些PDF文件中的字體嵌入的實現代碼:

from spire.pdf import *
from spire.pdf.common import *
import os# 設置輸入和輸出文件夾
input_folder = "輸入PDF/"
output_folder = "輸出PDF/"# 創建輸出文件夾(如果不存在)
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍歷輸入文件夾下的所有 PDF 文件
for filename in os.listdir(input_folder):if filename.endswith(".pdf"):input_pdf = os.path.join(input_folder, filename)output_pdf = os.path.join(output_folder, filename)# 創建 PdfCompressor 對象并設置壓縮選項compressor = PdfCompressor(input_pdf)compression_options = compressor.OptimizationOptions# 啟用字體壓縮compression_options.SetIsCompressFonts(True)# 或取消嵌入字體# compression_options.SetIsUnembedFonts(True)# 壓縮 PDF 文件并保存到輸出文件夾compressor.CompressToFile(output_pdf)

Python通過刪除不必要的內容如附件、注釋或表單來減小PDF文件大小

優化圖片或字體是壓縮PDF文檔的兩種主要方式。但有時候,PDF文件可能包含各種附件、注釋、或表單數據等附加信息,這些信息也會增加文件的大小。刪除掉文件中不需要的內容,也能減小文件的大小。

下面是從一個PDF文件中刪除附件的主要步驟:

  • 創建?PdfDocument 實例并傳入要壓縮的 PDF 文件路徑。
  • PdfDocument.FileInfo.IncrementalUpdate屬性設置為False來禁用增量更新。
  • 使用PdfDocument.Attachments.Clear()方法刪除文件中所有的附件。
  • 使用PdfDocument.SaveToFile()方法將結果保存為一個新的PDF。

實現代碼:

from spire.pdf import *
from spire.pdf.common import *# 創建PdfDocument 對象并傳入要壓縮的 PDF 文件路徑
input_pdf = "測試.pdf"
pdf = PdfDocument(input_pdf)
# 禁用增量更新
pdf.FileInfo.IncrementalUpdate = False# 從 PDF 文件中刪除所有附件
pdf.Attachments.Clear()# 將結果保存到一個新文件
output_pdf = "刪除附件.pdf"
pdf.SaveToFile(output_pdf)
pdf.Close()

下面是從一個PDF文件中刪除注釋的主要步驟:

  • 創建一個 PdfDocument 實例并傳入要壓縮的 PDF 文件路徑。
  • PdfDocument.FileInfo.IncrementalUpdate屬性設置為False來禁用增量更新。
  • 遍歷PDF文件中的頁面。
  • 使用PdfPageBase.Annotations.Clear()方法刪除頁面上的所有注釋。
  • 使用PdfDocument.SaveToFile()方法將結果保存為一個新的PDF。

實現代碼:

from spire.pdf import *
from spire.pdf.common import *# 創建 PdfDocument 對象并指定要壓縮的 PDF 文件路徑
input_pdf = "測試.pdf"
pdf = PdfDocument(input_pdf)
# 禁用增量更新
pdf.FileInfo.IncrementalUpdate = False# 遍歷 PDF 文件的每一頁并從中刪除注釋
for i in range(pdf.Pages.Count):page = pdf.Pages[i]page.Annotations.Clear()# 將結果保存到一個新文件
output_pdf = "刪除注釋.pdf"
pdf.SaveToFile(output_pdf)
pdf.Close()

下面是扁平化或刪除一個PDF文件中的所有表單的主要步驟:

  • 創建PdfDocument 實例并傳入要壓縮的 PDF 文件路徑。
  • PdfDocument.FileInfo.IncrementalUpdate屬性設置為False來禁用增量更新。
  • 使用PdfDocument.Form屬性獲取文件中的表單。
  • 使用PdfForm.IsFlatten屬性扁平化所有表單。或使用PdfFormWidget.FieldsWidget.Clear()方法刪除所有表單。
  • 使用PdfDocument.SaveToFile()方法將結果保存為一個新的PDF。

實現代碼:

from spire.pdf import *
from spire.pdf.common import *# 創建一個 PdfDocument 對象并指定要處理的 PDF 文件路徑
input_pdf = "測試.pdf"
pdf = PdfDocument(input_pdf)
# 禁用增量更新
pdf.FileInfo.IncrementalUpdate = False# 獲取 PDF 文件中的表單
form = pdf.Form
# 扁平化表單
# form.IsFlatten = True# 從 PDF 文件中刪除所有表單
formWidget = PdfFormWidget(form)
formWidget.FieldsWidget.Clear()# 將結果保存到一個新文件
output_pdf = "扁平化或刪除表單.pdf"
pdf.SaveToFile(output_pdf)
pdf.Close()

總結

這篇博客介紹了使用Python壓縮PDF文檔的幾種不同的方式。你可以根據自己的文檔結構,使用其中最適合的一種或者結合多種方式來實現最優壓縮效果。

感謝閱讀!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42392.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

15集終于編譯成功了-了個球!編譯TFLite Micro語音識別工程-《MCU嵌入式AI開發筆記》

15集終于編譯成功了-個球!編譯TFLite Micro語音識別工程-《MCU嵌入式AI開發筆記》 還是參考這個官方文檔: https://codelabs.developers.google.cn/codelabs/sparkfun-tensorflow#2 全是干貨! 這里面提到的這個Micro工程已經移開了&#xff1…

【微服務】springboot對接Prometheus指標監控使用詳解

目錄 一、前言 二、微服務監控概述 2.1 微服務常用監控指標 2.2 微服務常用指標監控工具 2.3 微服務使用Prometheus監控優勢 三、環境準備 3.1 部署Prometheus服務 3.2 部署Grafana 服務 3.3 提前搭建springboot工程 3.3.1 引入基礎依賴 3.3.2 配置Actuator 端點 3.…

【Linux】信號的處理

你很自由 充滿了無限可能 這是很棒的事 我衷心祈禱你可以相信自己 無悔地燃燒自己的人生 -- 東野圭吾 《解憂雜貨店》 信號的處理 1 信號的處理2 內核態 VS 用戶態3 鍵盤輸入數據的過程4 如何理解OS如何正常的運行5 如何進行信號捕捉信號處理的總結6 可重入函數volatile關…

C# 如何獲取屬性的displayName的3種方式

文章目錄 1. 使用特性直接訪問2. 使用GetCustomAttribute()方法通過反射獲取3. 使用LINQ查詢總結和比較 在C#中,獲取屬性的displayName可以通過多種方式實現,包括使用特性、反射和LINQ。下面我將分別展示每種方法,并提供具體的示例代碼。 1.…

數據庫逆向工程工具reverse_sql

reverse_sql 是一個用于解析和轉換 MySQL 二進制日志(binlog)的工具。它可以將二進制日志文件中記錄的數據庫更改操作(如插入、更新、刪除)轉換為反向的 SQL 語句,以便對系統或人為產生的誤操作進行數據回滾和恢復。 *…

JVM專題之垃圾收集器

JVM參數 3.1.1 標準參數 -version -help -server -cp 3.1.2 -X參數 非標準參數,也就是在JDK各個版本中可能會變動 ``` -Xint 解釋執行 -Xcomp 第一次使用就編譯成本地代碼 -Xmixed 混合模式,JVM自己來決定 3.1.3 -XX參數 > 使用得最多的參數類型 > > 非…

RedHat運維-Linux文本操作基礎-牛客AWK

1. 查看static這個連接文件是否自動連接的命令是____________________________________; 2. 查看default這個連接文件是否自動連接的命令是_____________________________________; 3. 查看con0這個連接文件是否自動連接的命令是_______________________…

【Python】已解決:(paddleocr導包報錯)ModuleNotFoundError: No module named ‘paddle’

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:(paddleocr導包報錯)ModuleNotFoundError: No module named ‘paddle’ 一、分析問題背景 近日,一些使用PaddleOCR庫進行文字…

Python數據分析案例49——基于機器學習的垃圾郵件分類系統構建(樸素貝葉斯,支持向量機)

案例背景 trec06c是非常經典的郵件分類的數據,還是難能可貴的中文數據集。 這個數據集從一堆txt壓縮包里面提取出來整理為excel文件還真不容不易,肯定要做一下文本分類。 雖然現在文本分類基本都是深度學習了,但是傳統的機器學習也能做。本案…

C#架構師的成長之路

成為一名C#架構師不僅需要深厚的技術功底,還需要廣泛的行業知識、優秀的團隊協作能力和領導力。以下是C#架構師成長之路上的關鍵步驟和技能要求: 1. 扎實的技術基礎 精通C#語言:深入理解C#的語法、特性,包括但不限于泛型、多線程…

Xilinx FPGA:vivado關于真雙端口的串口傳輸數據的實驗

一、實驗內容 用一個真雙端RAM,端口A和端口B同時向RAM里寫入數據0-99,A端口讀出單數并存入單端口RAM1中,B端口讀出雙數并存入但端口RAM2中,當檢測到按鍵1到來時將RAM1中的單數讀出顯示到PC端,當檢測到按鍵2到來時&…

Vim編輯器與Shell命令腳本

前言:本博客僅作記錄學習使用,部分圖片出自網絡,如有侵犯您的權益,請聯系刪除 目錄 一、Vim文本編輯器 二、編寫Shell腳本 三、流程控制語句 四、計劃任務服務程序 致謝 一、Vim文本編輯器 “在Linux系統中一切都是文件&am…

Rust 程序設計語言學習——函數式語言功能:迭代器和閉包

Rust 的閉包(closures)是可以保存在一個變量中或作為參數傳遞給其他函數的匿名函數。可以在一個地方創建閉包,然后在不同的上下文中執行閉包運算。不同于函數,閉包允許捕獲被定義時所在作用域中的值。 迭代器(iterato…

C++ STL 隨機數用法介紹

目錄 一:C語言中的隨機數 二:C++中的隨機數 1. 生成隨機數的例子 2. 隨機數引擎 3. 隨機數引擎適配器 4. C++中預定義的隨機數引擎,引擎適配器 5. 隨機數分布 一:C語言中的隨機數 <stdlib.h>//初始化隨機種子 srand(static_cast<unsigned int>(time(nullptr)…

C#面: 依賴注入有哪幾種方式?

依賴注入&#xff08;Dependency Injection&#xff0c;簡稱DI&#xff09;是一種設計模式&#xff0c;用于解耦組件之間的依賴關系。在C#中&#xff0c;常見的依賴注入方式有以下幾種&#xff1a; 構造函數注入&#xff08;Constructor Injection&#xff09;&#xff1a;通過…

dependencyManagement的作用、nacos的學習

使用SpringCloudAlibaba注意各組件的版本適配 SpringCloudAlibaba已經包含了適配的各組件&#xff08;nacos、MQ等&#xff09;的版本號&#xff0c;也是一個版本仲裁者&#xff0c;但是可能已經有了父項目Spring-Boot-Starter-Parent這個版本仲裁者&#xff0c;又不能加多個父…

什么是獨立服務器?

獨立服務器是指一個單獨的物理服務器&#xff0c;整體的硬件設施都是獨立存在的&#xff0c;有著強大的性能&#xff0c;只需要運行用戶個人的數據信息&#xff0c;并且可以享受到獨立服務器的硬件與軟件&#xff0c;當網站有著大量的用戶進行訪問或者是需要運行大型的軟件時&a…

leetcode熱題100.零錢兌換(動態規劃)

今天給大家分享一道動態規劃的常考題&#xff0c;零錢兌換&#xff0c;很有趣的動態規劃題目&#xff0c;希望可以對大家找工作過程中起到幫助&#xff0c;幫助大家拓展下思維 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xf…

6、Redis系統-數據結構-06-跳表

六、跳表&#xff08;Skiplist&#xff09; 跳表是一種高效的動態數據結構&#xff0c;可以用于實現有序集合&#xff08;Sorted Set&#xff0c;Zset&#xff09;。與平衡樹相比&#xff0c;跳表具有實現簡單、效率高的優點&#xff0c;因此被 Redis 選用作為有序集合的底層數…

階段三:項目開發---搭建項目前后端系統基礎架構:任務13:實現基本的登錄功能

任務描述 任務名稱&#xff1a; 實現基本的登錄功能 知識點&#xff1a; 了解前端Vue項目的基本執行過程 重 點&#xff1a; 構建項目的基本登陸功能 內 容&#xff1a; 通過實現項目的基本登錄功能&#xff0c;來了解前端Vue項目的基本執行過程&#xff0c;并完成基…