Python 自动化之修理PDF文件(二)

news2024/10/6 14:26:46

PDF文件_合并与拆分PDF文档Pro版本


文章目录

  • PDF文件_合并与拆分PDF文档Pro版本
  • 前言
  • 一、要做成什么样子
  • 二、主要用到的函数
  • 三、基本思路
    • 1.引入库
    • 2.创建用户输入模块
    • 3.确定主框架
  • 四、文档合并代码模块
    • 1.用户输入和函数调用
    • 2.引导用户输入文档信息
    • 3.合并文档内容
    • 4.命名新文档+生成路径
    • 5.保存文档+结束调用
  • 五、文档拆分代码模块
    • 1.确定基本框架
    • 2.用户输入和前提准备
    • 3.每一页都拆分代码模块
    • 4.指定页码拆分代码模块
      • 4.1.用户输入和创建对象
      • 4.2.遍历暂存指定页码内容
      • 4.3.指定路径生成指定名称的新PDF
  • 总结


前言

`
上一篇讲了pdf转文字的操作,这篇我们接着讲如何去拆分和合并pdf文件。用过的应该知道,在某软件上虽然可以用,但是也是存在限制的,文档页数过多就需要会员了。

那么怎么样才能不花钱(这个很重要)就能使用呢?自己写一个(# ^ . ^ #)
Alt


一、要做成什么样子

  1. 任意数量、页数的pdf文档,只要你电脑不冒烟~ ~ ~ ~
  2. 可按顺序合并任意数量的pdf文档。
  3. 可按顺序拆分任意页数的pdf文档。
  4. 可任意截取拆分掉pdf文档的某一段。
  5. 拆分的文档会按《原名+第a页》、《原名+第a页_第b页》命名
  6. 合并的文档会提示你给它取个新名字。
  7. 指定位置保存产生的新文件。

目前就想到这么些,后续有新的点子我再往上搞

二、主要用到的函数

都是PyPDF2 库的东西。
一个是PdfReader,用来读取pdf文档数据的;二是PdfWriter,用来写入前面读取到的数据。

三、基本思路

1.引入库

代码如下:

from PyPDF2 import PdfWriter
import PyPDF2

2.创建用户输入模块

代码如下:

print('请选择您要的操作(1 合并  2 拆分) :',  end='')
Go = input()

这里会提示用户是要合并还是拆分pdf文档,输入不同的数字会进入到不同的模式中去。
end=’ '的作用是不换行,可以在文字提示的后面直接输入。


3.确定主框架

代码如下:

if Go == '1':    #文档合并
	......
elif Go == '2':    #文档拆分
	......

上面也提到了,涉及到pdf的两个动作:合并和拆分。所以我这里采用if-----elif----的结构来处理。

接下来就是两个代码模块的编写了。这里我先写文档合并,后写文档拆分。


四、文档合并代码模块

1.用户输入和函数调用

代码如下:

		#提示用户输入
    print('请输入需要合并的pdf文档个数:', end='')
    numbers_pdf = int(input())
    #函数调用
    merger = PdfWriter()

需要合并几个文档就输入数字几就ojbk。
这里调用的函数下面会用到。PdfWriter 对象通常被用来合并PDF文件,或者创建新的PDF文档。


2.引导用户输入文档信息

代码如下:

    #创建空列表,用来存储pdf名称
    list_pdf = []
    
    #进行相应次数的遍历循环
    for number_pdf in range(numbers_pdf):
        #提示用户按照固定格式输入
        print(f'请按顺序输入第 {number_pdf+1} 个pdf(例子:E:\BaiduNetdiskDownload\你好.pdf):', end='')
        old_pdf = input()
        #用户每次输入都会被添加到列表当中
        list_pdf.append(old_pdf)

这段代码的意思是你合并几个文档,程序就会提示你几次输入文档信息。
需要注意的是,输入的先后顺序也代表了后续合并后内容的先后顺序。


3.合并文档内容

代码如下:

    for pdf in list_pdf:
        merger.append(pdf)

代码很少,意思就是遍历刚才用户输入的文档信息,逐个进行合并。


4.命名新文档+生成路径

代码如下:

    #提示输入文档名称
    print('已合并完,请输入新文件名称(例子:aaa)不用添加扩展名:', end='')
    new_pdf_name = input()
    
    # 指定保存 .pdf 文件的完整路径和名称
    output_dir = "D:/"  # 替换为您的实际输出目录
    output_file_name = f"{new_pdf_name}_合并.pdf"
    output_path = output_dir + output_file_name

第一段代码是提示用户输入新文档的名字,下面会用到。
第二段代码的意思是我先指定一个路径,然后生成文档的名称 new_pdf_name_合并.pdf,最后对它俩进行字符串拼接,这样后面才能根据output_path信息在指定路径下保存pdf文档。


5.保存文档+结束调用

代码如下:

    merger.write(output_path)
    print('合并好了去查收吧')
    merger.close()

提示合并好了。然后就去指定目录查看就行了。

合并文档到这里就结束了。


五、文档拆分代码模块

将拆分分为两部分,一是每一页都拆出来形成一个新文档;二是有用户指定范围,形成新文档。所以,在这里又会用到if----elif—结构,相当于嵌套里的嵌套。

这里我会先写每一页都拆,后写指定范围。

1.确定基本框架

代码如下:

    ..........       #用户输入和前提准备
    
    if split == '1':    #每一页都拆
	    ......
    elif split == '2':    #指定范围拆
	    ......

上面也刚说了,这里就不废话了。


2.用户输入和前提准备

代码如下:

        #提示用户输入要拆分的PDF文档
        print('请输入您要查分的文件(例子:E:\BaiduNetdiskDownload\你好.pdf):', end='')
        chaifen_pdf = input()
        
        open_pdf = open(chaifen_pdf, 'rb')       #以二进制形式打开文档
        read_pdf = PyPDF2.PdfReader(open_pdf)    #读取上面打开的PDF文件内容
        get_pdf_pages = len(read_pdf.pages)      #通过read_pdf获取PDF的总页数
        print(f"该文件共有{get_pdf_pages}页")
        
        #提示用户选择拆分模式
        print('全部拆分请输入1 指定位置查分请输入2 :', end='')
        split = input()

先是提示用户输入要拆分的文档;然后程序会打开并读取文档内内容,告诉我们文档总共有多少页;最后是提示用户选择哪种模式拆分。
我就不细说了,代码注释写的很明白。


3.每一页都拆分代码模块

代码如下:

            #遍历文档的每一页
            for get_pdf_page in range(get_pdf_pages):
                #读取文档当前遍历的页
                page = read_pdf.pages[get_pdf_page]
                # 创建一个新的PdfWriter对象
                pdf_writer = PdfWriter()
                # 将当前页添加到新的PdfWriter对象中
                pdf_writer.add_page(page)

                # 获取用户输入的文件名,不包括路径
                pdf_file_name = chaifen_pdf.split('\\')[-1]  # 使用 \\ 分隔符 去掉路径
                pdf_base_name = pdf_file_name.split('.')[0]  # 去掉扩展名
                
                # 指定保存 .pdf 文件的完整路径和名称
                output_dir = "D:/"  # 替换为您的实际输出目录
                output_file_name = f"{pdf_base_name}_第{get_pdf_page + 1}页.pdf"
                output_path = output_dir + output_file_name
                
                pdf_writer.write(output_path)
                pdf_writer.close()
                
            print('拆分好了,快去看一下吧。')

由于基本上都是在for_in range()结构的循环下,我就一块写了,要不让分开写很容易看混。
整体上分为五部分:

  1. 第一部分:读取文档当前遍历的页,然后创建一个新的PdfWriter对象,最后将当前页添加到新的PdfWriter对象中(就是生成一页的文档),三者缺一不可。如果没有PdfWriter对象,会出现第n份文档有n页内容。
  2. 第二部分和第三部分可以看我上一个文档的《第四大段第5小节》有详细解释。这是链接:https://blog.csdn.net/weixin_57061292/article/details/134790966
  3. 第四部分:按照前几分部分的设置进行文件的保存,还有结束函数的调用(有始有终嘛)。
  4. 第五部分:友好提示,出现上面那几个字就代表搞定了。

4.指定页码拆分代码模块

4.1.用户输入和创建对象

代码如下:

            print('请输入开始页 :', end='')
            start_pages = int(input())
            print('请输入结束页 :', end='')
            end_pages = int(input())
            
            # 创建一个新的PdfWriter对象
            pdf_writer = PdfWriter()

两部分,一是引导用户输入需要把从哪一页到哪一页的内容拆出来;二是函数的调用,没啥好说的(这是主力)。


4.2.遍历暂存指定页码内容

代码如下:

            for get_pdf_page in range(start_pages-1, end_pages):
                page = read_pdf.pages[get_pdf_page]
                # 将当前页添加到新的PdfWriter对象中
                pdf_writer.add_page(page)

这个结构用过很多次了,就不赘述了。
意思就是遍历我们选中的页,先把它们暂存起来留到到后面用。


4.3.指定路径生成指定名称的新PDF

代码如下:

           # 获取用户输入的文件名,不包括路径
            pdf_file_name = chaifen_pdf.split('\\')[-1]  # 使用 \\ 分隔符 去掉路径
            pdf_base_name = pdf_file_name.split('.')[0]  # 去掉扩展名
            
            # 指定保存 .pdf 文件的完整路径和名称
            output_dir = "D:/"  # 替换为您的实际输出目录
            output_file_name = f"{pdf_base_name}_第{start_pages}_{end_pages}页.pdf"
            output_path = output_dir + output_file_name
            
            pdf_writer.write(output_path)
            pdf_writer.close()
            
            print('拆分好了,快去看一下吧。')

各位同志,看不懂的话。这里请一定要参考 《 3.每一页都拆分代码模块》 和我的上一篇博客,这是链接:https://blog.csdn.net/weixin_57061292/article/details/134790966


总结

这就是PDF拆分和合并的全部内容了,看看这篇的反馈吧。有需要的话。后面我再找找PDF还有哪些操作大家还常用 给大家写出来。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据机器学习深度解读DBSCAN聚类算法:技术与实战全解析

大数据机器学习深度解读DBSCAN聚类算法:技术与实战全解析 一、简介 在机器学习的众多子领域中,聚类算法一直占据着不可忽视的地位。它们无需预先标注的数据,就能将数据集分组,组内元素相似度高,组间差异大。这种无监…

Springboot日志篇

一、概述 1.1简介 市场上存在非常多的日志框架。 JUL(java.util.logging),JCL(ApacheCommons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。 Spring Booti在框架内容部使用JCL,spring-boot-starter--logging采用了slf4jlogback的形式,Spring Boot也能自…

算法笔记—链表、队列和栈

链表、队列和栈 1. 链表1.1 单链表反转1.2 双链表反转1.3 合并两个有序链表1.4 链表相加1.5 划分链表 2. 队列和栈2.1 循环队列2.2 栈实现队列2.3 队列实现栈2.4 最小栈2.2 双端队列 1. 链表 1.1 单链表反转 力扣 反转链表 // 反转单链表public ListNode reverseList(ListNod…

达索系统SOLIDWORKS 2024 Visualize新功能

SOLIDWORKS Visualize(原名为 Bunkspeed)是一整套独立的软件工具,Visualize模块主要是用于对SOLIDWORKS设计出的产品图进行渲染、做动画,方便用户更好的展示、宣传产品;以最快速、最轻松的方式创建专业的照片级图像、动…

〖大前端 - 基础入门三大核心之JS篇(53)〗- 构造函数与类

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

【论文阅读笔记】M3Care: Learning with Missing Modalities in Multimodal Healthcare Data

本文介绍了一种名为“MCare”的模型,旨在处理多模态医疗保健数据中的缺失模态问题。这个模型是端到端的,能够补偿病人缺失模态的信息,以执行临床分析。MCare不是生成原始缺失数据,而是在潜在空间中估计缺失模态的任务相关信息&…

【知识积累】深度度量学习综述

原文指路:https://hav4ik.github.io/articles/deep-metric-learning-survey Problem Setting of Supervised Metric Learning 深度度量学习是一组旨在衡量数据样本之间相似性的技术。 Contrastive Approaches 对比方法的主要思想是设计一个损失函数,直…

STM32——震动传感器点亮LED灯

震动传感器简单介绍 若产品不震动,模块上的 DO 口输出高电平; 若产品震动,模块上的 DO 口输出低电平,D0-LED绿色指示灯亮。 震动传感器与STM32的接线 编程实现 需求:当震动传感器接收到震动信号时,使用中断…

Ubuntu 22安装PHP环境

参考博客为《练习 0(2/2):Ubuntu 环境下安装PHP(PHP-FPM)》和《原生态Ubuntu部署LAMP环境 PHP8.1MySQLApache》 sudo apt-get install -y php7.4想要安装php7.4,发现安装的是php8.1。 完成如下图&#xf…

构思3年,巨 TM 好用的 localStorage 封装!!!

localStorage 和 sessionStorage 作为一个本地存储方案,所有的操作都是同步的,用法也非常简单,所以深受广大前端的喜爱。 但是由于 localStorage 只能存储字符串,所以存储其他数据就比较麻烦。比如我们要存储一个对象的话可能需要…

【程序人生】还记得当初自己为什么选择计算机?

✏️ 初识计算机: 还记得人生中第一次接触计算机编程是在高中,第一门编程语言是Python(很可惜由于条件限制的原因,当时没能坚持学下去......现在想来有点后悔,没能坚持,唉......)。但是&#xf…

STM32G030C8T6:使用外部晶振配置LED灯闪烁

本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,使用STM32G030C8T6单片机,通过STM32CubeMX软件,配置并使用外部8MHz晶振,实…

python:五种算法(PSO、RFO、HHO、WOA、GWO)求解23个测试函数(python代码)

一、五种算法简介 1、粒子群优化算法PSO 2、红狐优化算法RFO 3、哈里斯鹰优化算法HHO 4、鲸鱼优化算法WOA 5、灰狼优化算法GWO 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary program…

git自动更新功能

确认权限 因为一般Linux系统网页用的www 或 www-data用户和用户组,所以要实现自动来去,首先要在www用户权限下生成ssh密钥,不然没有权限,其次就是,要把用root用户拉去的代码,批量改成www用户 1. 给www权…

Scrapy爬虫学习

Scrapy爬虫学习一 1 scrapy框架1.1 scrapy 是什么1.2 安装scrapy 2 scrapy的使用2.1创建scrapy项目2.2 创建爬虫文件2.3爬虫文件的介绍2.4 运行爬虫文件 3 爬取当当网前十页数据3.1 dang.py:爬虫的主文件3.2 items.py 定义数据结构3.3 pipelines.py 管道3.4 执行命令…

【教学类-06-16】20231213 (按比例抽题+乱序or先加再减后乘)X-Y之间“加法减法乘法+-×混合题”

作品展示: 背景需求: 大三班的“第一高手”对我提供的每一套的题目都只有一种反应: “这个是分合题,太简单了” “乘法,乘法我也会,11的1 22的4 33的9,,44十六……” “都太简单了&#xff0…

7个常见的jmeter压测问题

根据在之前的压测过程碰到的问题,今天稍微总结总结,以后方便自己查找。 一、单台Mac进行压测时候,压测客户端Jmeter启动超过2000个线程,Jmeter报OOM错误,如何解决? 解答:单台Mac配置内存为8G&…

快速上手linux | 一文秒懂Linux各种常用目录命令(上)

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一 、命令提示符和命令的基本格式1.1 如何查看主机名称及修改 二、命令基本格式2.1 命令格式示例2.2 参数的作用…

【价值几十万的仿抖音直播电商系统源码共享】

当下,传统的图文电商模式已经走向没落,以抖音为首的直播电商模式备受用户追捧,它具有实时直播和强互动的特点,是传统电商所不具备的优势。而且,当前正是直播电商的红利期,很多主播和品牌商都通过直播电商业…

【LeetCode刷题】-- 163.缺失的区间

163.缺失的区间 class Solution {public List<List<Integer>> findMissingRanges(int[] nums, int lower, int upper) {List<List<Integer>> res new ArrayList<>();for(int num : nums){if(lower < num){res.add(Arrays.asList(lower,num -…