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.mzph.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;并完成基…