首页>少儿编程>利用python压缩扫描图片格式的pdf文件

利用python压缩扫描图片格式的pdf文件

扫描了一份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的文件夹地址。

文章提及的依赖文件

依赖文件望盘分享

标签: python

移动端可扫我直达哦~

推荐阅读

python 2025-01-07

利用python3查找文件夹内所有文件内容

学习wp主题的时候看到了几个自定义的action,因为主题文件较多,随手点了几个都不对,逐渐红温,忽然想起来python可能会有对应的模块吧,毕竟“人生苦短,我用python”嘛。要说ai搜索这东西,方便确实是方便,一搜索直接把示例程...

少儿编程 python

python 2024-06-28

python中print函数的格式控制符号

%字符:标记转换说明符的开始;转换标志:- 表示左对齐;+ 表示在转换值之前要加上正负号;“” (空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充;最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽...

少儿编程 python

python 2024-06-27

小鸟数据python语法速查表

Python对大小写敏感,使用半角符号,变量命名采用“_”、数字或字母的组合,建议采用规范的命名方式,比如使用驼峰式命名方式,编程过程中多写注释。基础语法数据类型:整数,浮点,字符串,逻辑值运算符号:+,-,*,/, % , // ,...

少儿编程 python

python 2024-06-18

pyautogui报错误:No module named pytweening

之前利用pyautogui实现了一个类似按键精灵的功能,在一个可写的PDF文件中,动态修改某个单元格的值,并依次打印出来。利用python2.7实现的程序,因为中途换装过python3,换回python2.7版本之后很多库都失效了,年...

少儿编程 python

python 2024-06-17

利用PYTHON批量修改图片的宽高尺寸

将制作完成的产品拍照发客户,是博主的工作之一,原来是用的数码相机,随着手机照片质量的提升,现在用手机拍照也能满足需求。目前在用的手机是xsmax,默认设置下一张照片经常会超过4M,记得购买的第一个u盘的容量也就32M还是64M。遇到客...

少儿编程 python

python 2024-04-08

Python利用tinify API实现批量压缩图片

一直觉得“API”这个词语的书面解释过于高大上,使用下来感觉API就如同一个自动售货机,有需求的人投了一个币进去,然后售货机给了你对应面值的饮料。就比如这个tinify API,核心功能是实现图片的压缩,用户传过去一张图片,它回传一个...

少儿编程 python

python 2024-03-21

利用python批量修改照片名称

博主之前用的iphone6sp,年前闲鱼入了一个二手的xsmax,两者拍摄的照片默认后缀都是大写的"JPG"。小鸟数据博客的主题是自己捣鼓的,技术实力有限,仅能正确识别小写的图片名称,所以某次直接用原图发布文章的时候,发生了图片无法正...

少儿编程 python

python 2023-10-24

Python官网下载速度很慢怎么办

之前一直在Python官网下载安装包,用浏览器自带的下载工具,并没有觉得慢到难以忍受。时隔大半年,手头的存储安装包的u盘不知道落哪里了,于是又一次访问了官网。公司单独拉了一根光纤,然而打开Python官网主页居然就花了半天,心说完犊子...

少儿编程 python

python 2023-09-28

pyautogui中的键盘对应键位的名称

pyautogui可以模拟用户按键,比如需要按回车,我们可以输入“enter”,需要按删除键,我们可以输入“delete”,键位太多记不过来,干脆写篇笔记记录一下吧。顺便一提,利用help可以查看pyautogui的帮助信息:help...

少儿编程 python

python 2023-09-28

利用python自动编辑可编辑pdf并实现自动打印

可编辑的pdf文件不多,工作中很少遇到类似的情况,很多需要用到自动打印的场合,一般就直接把pdf拖入到coreldraw或ai中,转换为矢量图,然后利用vba在编辑软件中实现自动打印。手头上有一份客户发过来的pdf文件,可以直接在文件...

少儿编程 python

python 2023-09-28

python2.7所对应的pyautogui版本是哪个

想安装一个pyautogui,用于实现一个类似按键精灵的效果,因为客户发过来一个可编辑的pdf文件,需要在其中填入对应的序列号,手工填写一次几百张有点儿麻烦,所以考虑用python来组合一套动作,实现自动的操作。于是在win7系统中打...

少儿编程 python