赞
踩
我们平时在使用PDF时有时会遇到PDF过大的情况,例如最近我在进行工程制图时,需要将影像使用PDF导出,这就导致PDF文件会非常大,一般有200M左右,这对于数据传输非常不友好。同时有很多软件的PDF压缩功能都需要收费,所以今天就跟大家分享一下如何使用Python对PDF文件进行压缩,这里给大家分别用三个Python库对PDF文件进行压缩。
Python的fitz库是一个基于Python开发的PDF处理库,它是PyMuPDF的前身。fitz提供了一系列的API和功能,可以用于读取、编辑和生成PDF文件。此外,它还可以处理其他类型的图像,如TIFF和JPEG,提供图像处理功能,如旋转、裁剪、缩放、调整亮度、对比度和色彩平衡等。
在使用fitz库之前,需要先安装它。可以通过pip命令进行安装,但需要注意的是,fitz库依赖于libmupdf,所以在安装前需要先安装libmupdf。安装完成后,可以导入fitz库,并使用其中的函数和类来操作PDF文件或其他图像。
在Python中,fitz库可以用于多种任务,如打开PDF文件、遍历页面、添加注释、提取文本、旋转页面等。此外,它还可以用于在PDF页面上添加高亮注释、提取图像等操作。
总的来说,fitz库是一个非常实用的Python库,它提供了丰富的PDF和图像处理功能,可以让我们更加方便地处理PDF文件和其他图像。虽然可能需要一定的学习曲线,但是一旦掌握了其使用方法,就能够大大提高工作效率。
- # -*- coding: utf-8 -*-
- """
- @Time : 2023/11/3 14:37
- @Auth : RS迷途小书童
- @File :Compress PDF.py
- @IDE :PyCharm
- @Purpose:PDF文件压缩
- @Web:博客地址:https://blog.csdn.net/m0_56729804
- """
- import os
- import fitz
- import PyPDF2
- import aspose.pdf as ap
-
-
- # --------------------------------------通过转换图片实现压缩------------------------------------
-
-
- def convert_img(path1, dpi, work_path):
- file = fitz.open(path1)
- page_count = file.page_count
- if os.path.exists(work_path): # 临时文件夹,需要为空
- os.removedirs(work_path)
- os.mkdir(work_path)
- for i in range(page_count):
- page = file[i]
- dpi = int(dpi) # 值越大,分辨率越高,文件越清晰
- rotate = int(0)
- print(page)
- trans = fitz.Matrix(dpi / 100.0, dpi / 100.0).prerotate(rotate)
- pm = page.get_pixmap(matrix=trans, alpha=False)
- img_path = work_path + '/%s.jpg' % str(i + 1)
- pm.save(img_path) # 保存为图像文件
- file.close()
-
-
- def img_for_pdf(path1, path2, work_path):
- file1 = fitz.open(path1)
- page_count = file1.page_count
- file2 = fitz.open()
- for i in range(page_count):
- img_path = work_path + '/%s.jpg' % str(i + 1)
- img = fitz.open(img_path) # 打开图片
- pdf = img.convert_to_pdf() # 使用图片创建单页的PDF
- os.remove(img_path)
- pdf_temp = fitz.open("pdf", pdf)
- file2.insert_pdf(pdf_temp) # 将当前页插入文档
- if os.path.exists(path2): # 若文件存在先删除
- os.remove(path2)
- file2.save(path2) # 保存PDF文件
- file2.close()
-
-
- def Compress_by_img(path1, path2, dpi, work_path):
- """
- :param path1: 需要压缩的pdf文件路径
- :param path2: 保存的pdf文件路径
- :param dpi: 分辨率
- :param work_path: 临时工作路径
- :return: None
- 无水印,效果较好!
- """
- convert_img(path1, dpi, work_path)
- img_for_pdf(path1, path2, work_path)
- os.removedirs(work_path)
-
-
- if __name__ == "__main__":
- work_path1 = r'Z:/彭俊喜/.pdf'
- in_path = r"Z:/彭俊喜/123.pdf" # 需要压缩的PDF文件
- out_path = r"Z:/彭俊喜/321.pdf" # 压缩后的PDF文件路径
- zoom = 1500 # 清晰度调节,缩放比率
- Compress_by_img(in_path, out_path, zoom, work_path1)
Aspose.PDF for Python是一款高级PDF处理API,它允许在跨平台应用程序中轻松生成、修改、转换、呈现、保护和打印PDF文档,而无需使用Adobe Acrobat。这款API提供了广泛的功能,包括压缩选项、表创建和处理、图形和图像功能、超链接功能、图章和水印任务,以及扩展的安全控件和自定义字体处理。
具体来说,Aspose.PDF for Python可以帮助你执行以下操作:
总的来说,Aspose.PDF for Python是一款功能强大、易于使用的PDF处理库,它可以帮助你高效地处理PDF文件,提高工作效率。同时,它也提供了丰富的API接口和文档支持,方便开发者进行集成和开发。
- # -*- coding: utf-8 -*-
- """
- @Time : 2023/11/3 14:37
- @Auth : RS迷途小书童
- @File :Compress PDF.py
- @IDE :PyCharm
- @Purpose:PDF文件压缩
- @Web:博客地址:https://blog.csdn.net/m0_56729804
- """
- import os
- import fitz
- import PyPDF2
- import aspose.pdf as ap
-
- # ---------------------------------------无损压缩,但有水印-------------------------------------
-
-
- def Lossless_Compression(path1, path2):
- """
- :param path1: 需要压缩的pdf文件路径
- :param path2: 保存的pdf文件路径
- :return: None
- 无损压缩,无法去除水印!!!
- """
- compress_path = ap.Document(path1) # 需要压缩的pdf文件路径
- # print(compress_path)
- optimize = ap.optimization.OptimizationOptions()
- optimize.image_compression_options.compress_images = True
- optimize.image_compression_options.image_quality = 90 # 压缩质量
- compress_path.optimize_resources(optimize)
- compress_path.save(path2) # 需要压缩后保存的文件路径
- # Evaluation Only. Created with Aspose.PDF. Copyright 2002-2023 Aspose Pty Ltd.无法去除水印
-
-
- if __name__ == "__main__":
- work_path1 = r'Z:/彭俊喜/.pdf'
- in_path = r"Z:/彭俊喜/123.pdf" # 需要压缩的PDF文件
- out_path = r"Z:/彭俊喜/321.pdf" # 压缩后的PDF文件路径
- Lossless_Compression(in_path, out_path)
PyPDF2是一个纯Python的PDF处理库,它允许用户读取、合并、拆分、旋转和转换PDF文件。此外,它还可以为PDF文件添加水印、密码保护,以及从PDF中提取文本和元数据。
以下是PyPDF2库的一些主要功能和特点:
总的来说,PyPDF2是一个功能强大且易于使用的Python PDF处理库,适用于各种PDF处理任务,包括文件合并、拆分、旋转、添加水印、密码保护以及文本和元数据提取等。然而,需要注意的是,PyPDF2项目的最后一个版本将是3.0.X,后续的开发将继续使用pypdf==3.1.0。因此,在使用PyPDF2时,建议查看最新的文档和更新信息,以确保兼容性和稳定性。
- # -*- coding: utf-8 -*-
- """
- @Time : 2023/11/3 14:37
- @Auth : RS迷途小书童
- @File :Compress PDF.py
- @IDE :PyCharm
- @Purpose:PDF文件压缩
- @Web:博客地址:https://blog.csdn.net/m0_56729804
- """
- import os
- import fitz
- import PyPDF2
- import aspose.pdf as ap
-
- # ---------------------------------------逐页压缩,效果未知-------------------------------------
- def compress_by_page(path1, path2):
- """
- :param path1: 需要压缩的pdf文件路径
- :param path2: 保存的pdf文件路径
- :return: None
- 逐页压缩,效果未知,慢!!!
- """
- pdf_file = open(path1, "rb")
- pdf_reader = PyPDF2.PdfReader(pdf_file)
- pdf_writer = PyPDF2.PdfWriter()
- for page_num in range(len(pdf_reader.pages)):
- page = pdf_reader.pages[page_num]
- page.compress_content_streams()
- pdf_writer.add_page(page)
- out_file = open(path2, "wb")
- pdf_writer.write(out_file)
- out_file.close()
- pdf_file.close()
-
-
- if __name__ == "__main__":
- # work_path1 = r'Z:/彭俊喜/.pdf'
- in_path = r"Z:/彭俊喜/123.pdf" # 需要压缩的PDF文件
- out_path = r"Z:/彭俊喜/321.pdf" # 压缩后的PDF文件路径
- compress_by_page(in_path, out_path)
从三个库的压缩效果来说,aspose.pdf库压缩的时间最短、质量更好、占用空间最小,但它保存PDF时会在左上角默认添加一行红字(版权说明)。其次就是fitz库,通过调节分辨率也可以很高质量地压缩PDF,但是占用空间略大于aspose.pdf。最后就是PyPDF2,虽然是原生的Python库,但是压缩速度较慢,同时它的原理是逐页进行图片压缩,对于我这个单页单图片太大的PDF作用不大,我也没空去测试多页压缩的效果,你们可以自己试试。
我会不定期地分享平时工作、学习中使用的代码和学习经验,感兴趣的话可以点个关注。如果有什么学术问题,可以直接留言或者私信我,看到就会回复!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。