当前位置: 首页 > article >正文

python-实战4拆分pdf文件

       Wps等软件拆分一份页数较多的PDF文件时,经常会出现要收费或者只能拆分其中几页的情况,下面我们就自己来写代码来实现这个收费功能。
        课程中已经初步学习了如何将一个PDF文件拆分成总页数个子PDF文件,我们基于其中的思路进行改进,将拆分代码封装成函数,代码如下:

import os
from PyPDF2 import PdfWriter, PdfReader


def split_pdf(file_name, file_path, save_dir, step=3):
    """
    拆分PDF为多个小的PDF文件。

    :param file_name: 拆分后的文件名的前缀
    :param file_path: 原始PDF文件路径
    :param save_dir: 保存拆分后PDF文件的目录路径
    :param step: 每step页拆分为一个新的PDF文件,例如step=3表示每隔3页拆分一次
    """
    # 如果保存目录不存在,则创建目录
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 检查step值是否合法
    if step < 1:
        print("输入的拆分间隔不能小于1")
        return

    # 读取PDF文件
    pdf_reader = PdfReader(file_path)
    page_count = len(pdf_reader.pages)  # 获取总页数

    # 遍历每个页码区间
    for page in range(0, page_count, step):
        pdf_writer = PdfWriter()

        # 添加指定页码的内容到新的PDF中
        for index in range(page, page + step):
            if index < page_count:
                pdf_writer.add_page(pdf_reader.pages[index])#将当前页码 index 对应的页面添加到 pdf_writer 中,即将页面内容写入新的PDF文件。

        # 生成拆分后的文件名
        child_name = f'{file_name}_{int(page / step) + 1}.pdf'
        save_path = os.path.join(save_dir, child_name)
'''
int(page / step):
这是计算当前页码区间所对应的拆分文件的索引。
page / step 计算当前页码区间属于哪个拆分文件,这里使用了浮点除法(即 page 除以 step)。
int(page / step) 将结果转换为整数,舍去小数部分。这样可以得到当前页码区间对应的文件索引(从0开始)。'''
        # 将拆分后的PDF写入文件
        with open(save_path, "wb") as out_file:
            pdf_writer.write(out_file)

        print(f"文件已保存至: {save_path}")

    print(f"所有文件已成功拆分,保存路径为:{save_dir}")


if __name__ == '__main__':
    split_pdf('拆分PDF', 'D:/自动化/第12讲.pdf', 'D:/自动化/拆分2', 3)

        Pdf文件在办公文件中占有很大一席之地,熟悉了pdfplumbe库一些常用操作可以让你轻松获取pdf文件中的内容,不用再一次次去选中文件中的文字进行复制,PyPDF2库可以让你自己实现很多付费软件才能实现的功能。
        学习二字,多学多习,希望同学们有空时将本节课中学习的代码都抽离成一个个函数,以后用时直接调用,既省时又省力了。


http://www.kler.cn/a/289730.html

相关文章:

  • D67【python 接口自动化学习】- python基础之数据库
  • 【小程序】封装网络请求request模块
  • 蓝牙BLE开发——iOS 每次写入数据超过200字节报错?
  • 券商隔夜单自动下单交易接口
  • [HarmonyOS]简单说一下鸿蒙架构
  • 红日靶机(七)笔记
  • 小土堆pytorch
  • CSS实现水滴效果图
  • 【Linux】进程间的关系(第十三篇)
  • oracle日期加减方式
  • 【区块链 + 物联网】智慧路灯计费和融资区块链解决方案 | FISCO BCOS应用案例
  • H265视频转换H264视频对应m3u8格式地址播放完整案例
  • IP地址查询功能详解—构建风险画像与代理识别
  • 传统CV算法——特征匹配算法
  • 创建MySQL数据库和相应表
  • C#复习之封装_静态成员
  • 「数组」计数排序|桶排序|基数排序(C++)
  • Android的Launch
  • 花10秒进来学学吧!用AI画朵云,点赞也能10万+
  • 深度学习速通系列:鲁棒性和稳定性
  • 二手手机回收小程序搭建,小程序功能特点
  • 力扣9.2
  • iscntrl函数讲解 <ctype.h>头文件函数
  • 运动耳机怎么选购?解密最值得购买的五大品牌!
  • 【算法专场】模拟(上)
  • CAAC执照无人机实训室建设技术详解