扫描了一份52页的银行流水,需要提交到某个网站,但该站点限制最大文件不超过10M,博主的扫描件大小总计38M,用夸克浏览器扫描得到,即便选择瘦身模式,最终的大小也超过了30M。之前有找过压缩pdf的在线站点,博主在博客内也有提及,有兴趣的可以搜索一下博客,但因为是国外站点,上传速度过于龟速,所以转而想利用python来解决。
在公司尝试了半天,在2.7.18版本的python下各种依赖不全,下班后并不死心,在家里的电脑上继续测试,家里的电脑python版本为3.6.8,所以下文的内容仅能确保在这个版本下实现效果。
安装依赖
首先安装利用pip能直接安装的依赖;
pip install pillow
pip install pdf2image
继续安装依赖
让deepseek给了一段程序,运行后报错,deekseek想起来还需要一个外部依赖poppler,因为博主的系统是windows7,所以需要下载的版本是windows版本,github国内访问时好时坏,博主会在文末附上poppler-windows
的网盘分享;
继续继续安装依赖
如果不幸又有一个新的报错,“msvcp140.dll缺失”,那么博主摊手表示遗憾之余,也恭喜您可以立刻解决这个问题,点击下方链接,或者在底部的网分享中,您都可以找到这个 Microsoft Visual C++ Redistributable 库。
Microsoft Visual C++ Redistributable官方下载地址
卍解
蓄力完成,将以下代码保存为py文件,在同文件夹内放进需要压缩的pdf文件,修改文件名为input.pdf,然后享受劳动成果吧。
from pdf2image import convert_from_path
from PIL import Image
import os
# 设置你的poppler路径(根据实际安装位置修改)
POPPLER_PATH = r"C:\poppler\Library\bin"
def pdf_to_images_to_pdf(input_path, output_path, quality=50, dpi=200):
"""
将PDF转换为图像再转回PDF实现压缩
参数:
input_path: 输入PDF路径
output_path: 输出PDF路径
quality: 图像质量 (1-100)
dpi: 图像分辨率 (默认200)
"""
try:
# 检查输入文件是否存在
if not os.path.exists(input_path):
raise FileNotFoundError(f"输入文件不存在: {input_path}")
# 1. 将PDF转换为图像列表(指定poppler路径)
images = convert_from_path(
input_path,
dpi=dpi,
poppler_path=POPPLER_PATH
)
# 2. 准备临时文件列表
temp_images = []
# 3. 保存临时图像
for i, image in enumerate(images):
temp_path = f"temp_{i}.jpg"
image.save(temp_path, 'JPEG', quality=quality)
temp_images.append(temp_path)
# 4. 将图像合并为PDF
first_image = Image.open(temp_images[0])
other_images = [Image.open(img) for img in temp_images[1:]]
first_image.save(
output_path,
"PDF",
resolution=dpi,
save_all=True,
append_images=other_images,
quality=quality
)
print(f"PDF压缩完成,保存至: {output_path}")
except Exception as e:
print(f"处理过程中发生错误: {str(e)}")
raise
finally:
# 5. 清理临时文件
for img in temp_images:
try:
if os.path.exists(img):
os.remove(img)
except:
pass
# 使用示例
if __name__ == "__main__":
try:
pdf_to_images_to_pdf(
input_path="input.pdf", # 替换为你的输入文件
output_path="compressed.pdf", # 输出文件名
quality=70, # 质量参数 (1-100)
dpi=120 # 分辨率 (越高越清晰)
)
except Exception as e:
print(f"PDF压缩失败: {str(e)}")
需要注意的是代码中的这一句:
POPPLER_PATH = r"C:\poppler\Library\bin"
确保poppler解压缩的文件构成与代码一致,或者将代码调整为实际的poppler的文件夹地址。