PDF的分割与合并
1.进行PDF切割
python代码如下:

# 20220521
# 1.选择要分割的文件
# 2.选择要保存的位置,分割为多个文件时,可自动用页码命名
# 3.输入要分割的页码,可以是一个范围1-23(将第1-23页提取出来),也可以是单个页码,12(将第12页单独提取出来)
# 4.点击按钮执行
# 20220528
# 模块化 可用
# 20220529 输入页码范围判断
import os.path from PyPDF2 import PdfReader, PdfWriter
import tkinter as tk
from tkinter import filedialog as fd
import tkinter.messagebox file_types = [('PDF文件', '.pdf')] # 分割操作,三个参数分别为待分割文件,分割开始页,结束页
def split_pdf(pdf_i, start_page, end_page):
pdf = PdfReader(pdf_i)
# pages = len(pdf.pages)
# pages = pdf.getNumPages()
pdf_wt = PdfWriter()
# print(pages)
for i in range(start_page - 1, end_page):
pdf_wt.add_page(pdf.pages[i])
# pdf_wt.add_page(pdf.pages(i)) # 使用wb模式。使用ab模式的话,会保留原始数据,文件会越来越大
pdf_path, pdf_name = os.path.split(pdf_in.get())
pdf_name, pdf_ext = os.path.splitext(pdf_name) split_name = pdf_out.get() + '\\' + pdf_name + f'(第{start_page}——{end_page}页).pdf'
split_name2 = pdf_out.get() + '\\' + pdf_name + f'(第{start_page}页).pdf'
pdf_name = split_name2 if start_page == end_page else split_name with open(pdf_name, 'wb') as outfile:
pdf_wt.write(outfile) # 选择待分割文件
def select_pdf():
pdf_selected = fd.askopenfilename(filetypes=file_types)
if pdf_selected != '':
pdf_in.set(pdf_selected)
pdf = PdfReader(pdf_selected)
pages = len(pdf.pages)
pdf_pages.set(f'③输入要分割的页码:(页码范围1-{pages})')
button_out['state'] = 'normal'
# button_split['state'] = 'normal' # 选择保存位置
def select_out():
# path_save = fd.asksaveasfilename(defaultextension='*.pdf', filetypes=file_types)
path_save = fd.askdirectory()
# a = fd.askdirectory()
if path_save != '':
button_split['state'] = 'normal'
pdf_out.set(path_save) # 分割前操作
def pdf_split():
if pdf_out2.get() != '': # 输入页码范围时,将中文’,‘替换为英文','
page_out_in = pdf_out2.get().replace(',', ',')
# 将输入的要分割的页码分开
page_split = page_out_in.split(',')
# 要分割的pdf文件名称,获取StringVar中存储的数据
pdf_to_be_split = pdf_in.get()
pdf = PdfReader(pdf_to_be_split)
pages = len(pdf.pages)
flag_successed = 0
flag_failed = [] for i in page_split:
page_range = i.split('-')
page_range_l = len(page_range)
# 如果输入的是一个范围,获取获取开始页和结束页。例如,1-18,18-39,2-15
# 起始页大于结束页时,不能正确分割
if page_range_l > 1:
start_page = int(page_range[0])
end_page = int(page_range[1])
if start_page <= end_page <= pages:
# print(start_page, end_page, pages)
split_pdf(pdf_to_be_split, start_page, end_page)
flag_successed += 1
# tkinter.messagebox.showinfo('操作提示', '分割成功')
else:
flag_failed.append(f'{start_page}-{end_page}') # tkinter.messagebox.showinfo('操作提示', f'页码输入错误,页码范围为1——{pages}')
# 输入的是某个数值,单独提取一页。例如1,3,12,5,53
# 输入数值大于待分割文件总页数时,不能正常分割
elif page_range_l == 1:
if int(page_range[0]) <= pages:
split_pdf(pdf_to_be_split, int(page_range[0]), int(page_range[0])) flag_successed += 1
# tkinter.messagebox.showinfo('操作提示', '分割成功')
else:
flag_failed.append(f'{page_range[0]}') # tkinter.messagebox.showinfo('操作提示', f'页码输入错误,页码范围为1——{pages}')
if len(flag_failed) == 0:
tkinter.messagebox.showinfo('操作提示', f'{flag_successed}个文件分割成功')
else:
tkinter.messagebox.showinfo('操作提示', f'{flag_successed}个文件分割成功,{len(flag_failed)}个文件分割失败')
tkinter.messagebox.showinfo('操作提示', f'以下页码输入错误,页码范围为1--{pages}\n{flag_failed}') global pdf_in, pdf_out, pdf_out2, entry_out, entry_out2, pdf_pages, button_out, button_split def main(root3):
global pdf_in, pdf_out, pdf_out2, entry_out, entry_out2, pdf_pages, button_out, button_split
pdf_in = tk.StringVar()
pdf_out = tk.StringVar()
pdf_out2 = tk.StringVar()
pdf_pages = tk.StringVar()
pdf_pages.set('③输入要分割的页码:') label_input = tk.Label(root3, text='①选择要分割的PDF文件:')
entry_input = tk.Entry(root3, textvariable=pdf_in, width=45)
button_input = tk.Button(root3, text='①选择要分割的PDF文件', command=select_pdf) label_out = tk.Label(root3, text='②选择输出文件夹:')
entry_out = tk.Entry(root3, textvariable=pdf_out, width=45)
button_out = tk.Button(root3, text='②选择保存位置', command=select_out)
button_out['state'] = 'disabled' page_out = tk.Label(root3, textvariable=pdf_pages, text='③输入要分割的页码:')
page_out_ = tk.Label(root3, text='(可分割为多个PDF,用逗号分隔。例如,1-10,2-17,10,12)')
entry_out2 = tk.Entry(root3, textvariable=pdf_out2, width=45)
button_split = tk.Button(root3, text='④执行分割', command=pdf_split, width=20, height=3)
button_split['state'] = 'disabled'
# entry_out2.bind('<Key>', jc)
# button_split.configure(text=pdf_out2.get()) label_input.place(x=10, y=10)
entry_input.place(x=10, y=35)
button_input.place(x=350, y=32) label_out.place(x=10, y=80)
entry_out.place(x=10, y=105)
button_out.place(x=350, y=97) page_out.place(x=10, y=150)
page_out_.place(x=10, y=175)
entry_out2.place(x=10, y=200) button_split.place(x=220, y=240) root2 = tk.Tk()
# 窗口尺寸
# root.geometry('400x300')
# 窗口居中
sw = root2.winfo_screenwidth()
sh = root2.winfo_screenheight()
c = (sw - 400) / 2
d = (sh - 300) / 2
# print(a,b,c,d)
root2.geometry('605x500+%d+%d' % (c, d))
# 软件标题
root2.title('PDF分割软件')
# # 软件左上角图标
# root2.iconbitmap('tubiao.ico')
# 窗口大小不可调
root2.resizable(width=False, height=False) root = tk.Frame(root2, width=605, height=500)
root.place(x=0, y=0)
main(root) root2.mainloop()
2.进行PDF合并
有合并顺序需手动进行数字命名。如:01.pdf,02.pdf,03.pdf,04.pdf……

import os
from PyPDF2 import PdfMerger #target_path = r'C:\Users\Administrator\Desktop\合并pdf文件' # pdf目录文件 path = __file__
target_path = os.path.dirname(path)
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst] file_merger = PdfMerger()
for pdf in pdf_lst:
file_merger.append(pdf,import_outline=False) # 合并pdf文件 file_merger.write(r"合并文件.pdf")
PDF的分割与合并的更多相关文章
- PDF文件分割和合并
今天自己用C#实现了下PDF文件的分割和合并,大家可以试用一下. 代码和使用说明在这里:https://github.com/cserspring/pdf_split_merge 有什么意见,大家可以 ...
- Linux下分割、合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具
Linux下分割.合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具 Linux下分割.合并PDF(pdftk) pdftk http://www.pdflabs.com/doc ...
- java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- (转)java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- Linux之文件过滤分割与合并
文件过滤分割与合并 1.grep命令 grep(global regular expression print)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本, ...
- JAVA IO分析三:IO总结&文件分割与合并实例
时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...
- c语言文件分割与合并
一.综述 c语言操作文件通过文件指针FILE*,每个要操作的文件必须打开然后才能读写. 注意事项: @1分割与合并文件最好使用二进制模式即"rb"或"wb",这 ...
- Linux下分割、合并文件——dd和cat
功能说明:读取,转换并输出数据. 语 法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=& ...
- Linux、Windows 下分割、合并rar文件
1.分割rar 1.1 linux下分割压缩rar 安装rar和unrar和序 $sudo aptitude install rar unrar 示例,分割压缩temp文件,每个包为1MB $rar ...
- java 流操作对文件的分割和合并的实例详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...
随机推荐
- JS Leetcode 852. 山脉数组的峰顶索引图解分析,高高的山峰一起吹山风吧。
壹 ❀ 引 本题来自LeetCode 852. 山脉数组的峰顶索引,难度依旧是简单,也是一道考二分法的题目,题目描述如下: 符合下列属性的数组 arr 称为 山脉数组 : arr.length > ...
- NC16122 郊区春游
题目链接 题目 题目描述 今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci.经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑 ...
- 配置nginx反向代理
最近在做一个前后分离的项目,前端用Vue,后台spring boot,使用nginx做反向代理.下面说一下如何配置: 启动spring boot项目,端口8110 启动nginx 修改nginx.co ...
- Selenium入门介绍
目录 Selenium概述 浏览器支持 工具库 开发实践 等待 操作浏览器 定位元素 定位单个元素 定位多个元素 获取HTML元素内容的方式 Selenium概述 https://github.com ...
- MySQL Boolean类型的坑
MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...
- django学习第五天---model类的属性参数,单表ORM数据库增删改查动作,查询的13个API接口
model类的属性参数 比如:models.CharField(null=True,blank=True) (1)null 如果为True,Django将用NULL在数据库中存储空值.默认值时Fals ...
- ABP模块签入GitLab后自动打包并推送到ProGet
# 1.添加一个名为下划线的解决方案文件夹 # 2.把解决方案根目录下的几个必要的文件添加到上述文件夹下 # 3.修改NuGet.Config,添加私有NuGet服务器的网址,并配置用户名和密码: A ...
- canal实现mysql跨机房备份
背景介绍 跨机房数据库数据备份 数据库增量异构系统分发(cache,mq等) 数据内容聚合分析组件 摘录作者的描述 原理图 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL ...
- 【Azure 应用服务】App Service下部署的应用报错 Out of Memory
问题描述 应用部署到App Service后,遇见了Out of Memory的错误. 报错信息:GetData Error:, Exception of type 'System.OutOfMem ...
- 黑马python基础课的一些题
1, 打印5行小星星 思路: 可以用1个星星乘以行数:还可以循环嵌套,外层循环控制行数,内层循环控制每一行应该输出多少个小星星,比如,第一行输出1个,第二行输出2个,内层循环可以当成列,只不过这个列要 ...