利用python拆分本地pdf文件的方法

之前分享过利用在线文件格式转换工具来拆分PDF文件的方法,昨天遇到一个尴尬的问题,利用在线转换的时候,上传速度很快,拆分也没有报错,然而拆分后的压缩包总计32M,而下载速度却只有可怜的30k,这就有点不能忍了。于是在下载进度条第一次报错后,博主开始尝试利用python来进行本地的拆分。

博主的python版本是2.7.18,在Python 2.7中,我们可以使用PyPDF2库来拆分PDF文件,如果之前没有使用过类似的功能,那么首先当然是先安装这个库,该库独立性较强,没有多余的分支任务,所以下载速度也比较快:

pip install PyPDF2

拆分方式

方法1:按页数拆分PDF

import os
from PyPDF2 import PdfFileReader, PdfFileWriter

def split_pdf_by_pages(input_pdf_path, output_folder, pages_per_split):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
    total_pages = input_pdf.getNumPages()
    
    for i in range(0, total_pages, pages_per_split):
        output = PdfFileWriter()
        for j in range(i, min(i + pages_per_split, total_pages)):
            output.addPage(input_pdf.getPage(j))
        
        output_filename = os.path.join(
            output_folder, 
            "split_{}-{}.pdf".format(i+1, min(i + pages_per_split, total_pages))
        )
        with open(output_filename, "wb") as output_stream:
            output.write(output_stream)
        print "Created: {}".format(output_filename)

# 使用示例
split_pdf_by_pages("input.pdf", "output_folder", 5)  # 每5页拆分为一个PDF

方法2:拆分为单页PDF

def split_pdf_to_single_pages(input_pdf_path, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
    
    for i in range(input_pdf.getNumPages()):
        output = PdfFileWriter()
        output.addPage(input_pdf.getPage(i))
        
        output_filename = os.path.join(output_folder, "page_{}.pdf".format(i+1))
        with open(output_filename, "wb") as output_stream:
            output.write(output_stream)
        print "Created: {}".format(output_filename)

# 使用示例
split_pdf_to_single_pages("input.pdf", "single_pages")

方法3:按页码范围拆分

def split_pdf_by_range(input_pdf_path, output_path, start_page, end_page):
    input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
    output = PdfFileWriter()
    
    for i in range(start_page-1, end_page):
        output.addPage(input_pdf.getPage(i))
    
    with open(output_path, "wb") as output_stream:
        output.write(output_stream)
    print "Created: {}".format(output_path)

# 使用示例
split_pdf_by_range("input.pdf", "pages_3-7.pdf", 3, 7)

博主自用代码

因为博主希望拆分后的页面命名简单规律方便批量导入,所以对文件命名进行了一点修改。

import os
from PyPDF2 import PdfFileReader, PdfFileWriter

def split_pdf_by_pages(input_pdf_path, output_folder, pages_per_split):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    input_pdf = PdfFileReader(open(input_pdf_path, "rb"))
    total_pages = input_pdf.getNumPages()
    
    for i in range(0, total_pages, pages_per_split):
        output = PdfFileWriter()
        for j in range(i, min(i + pages_per_split, total_pages)):
            output.addPage(input_pdf.getPage(j))
        
        output_filename = os.path.join(
            output_folder, 
            "{}.pdf".format(i+1)
        )
        with open(output_filename, "wb") as output_stream:
            output.write(output_stream)
        print "Created: {}".format(output_filename)

# 使用示例
split_pdf_by_pages("需要拆分的文件.pdf", "output", 1) 

标签: python

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-03-29

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

扫描了一份52页的银行流水,需要提交到某个网站,但该站点限制最大文件不超过10M,博主的扫描件大小总计38M,用夸克浏览器扫描得到,即便选择瘦身模式,最终的大小也超过了30M。之前有找过压缩pdf的在线站点,博主在博客内也有提及,有兴...

少儿编程 python

thumbnail 2025-01-07

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

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

少儿编程 python

thumbnail 2024-06-28

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

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

少儿编程 python

thumbnail 2024-06-27

小鸟数据python语法速查表

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

少儿编程 python

thumbnail 2024-06-18

pyautogui报错误:No module named pytweening

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

少儿编程 python

thumbnail 2024-06-17

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

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

少儿编程 python

thumbnail 2024-04-08

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

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

少儿编程 python

thumbnail 2024-03-21

利用python批量修改照片名称

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

少儿编程 python

thumbnail 2023-10-24

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

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

少儿编程 python

thumbnail 2023-09-28

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

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

少儿编程 python