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的分割与合并的更多相关文章

  1. PDF文件分割和合并

    今天自己用C#实现了下PDF文件的分割和合并,大家可以试用一下. 代码和使用说明在这里:https://github.com/cserspring/pdf_split_merge 有什么意见,大家可以 ...

  2. Linux下分割、合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具

    Linux下分割.合并PDF(pdftk),用于Linux系统的6款最佳PDF页面裁剪工具 Linux下分割.合并PDF(pdftk) pdftk http://www.pdflabs.com/doc ...

  3. java:快速文件分割及合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  4. (转)java:快速文件分割及合并

    文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...

  5. Linux之文件过滤分割与合并

    文件过滤分割与合并 1.grep命令 grep(global regular expression print)全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本, ...

  6. JAVA IO分析三:IO总结&文件分割与合并实例

    时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...

  7. c语言文件分割与合并

    一.综述 c语言操作文件通过文件指针FILE*,每个要操作的文件必须打开然后才能读写. 注意事项: @1分割与合并文件最好使用二进制模式即"rb"或"wb",这 ...

  8. Linux下分割、合并文件——dd和cat

    功能说明:读取,转换并输出数据. 语 法:dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=& ...

  9. Linux、Windows 下分割、合并rar文件

    1.分割rar 1.1 linux下分割压缩rar 安装rar和unrar和序 $sudo aptitude install rar unrar 示例,分割压缩temp文件,每个包为1MB $rar ...

  10. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

随机推荐

  1. JS实现提示文本框可输入剩余字数

    最近在设计写博客功能时,涉及到留言框输入字数限制,需要给用户剩余数字提示. 参考文章:https://www.cnblogs.com/crazytrip/p/4968230.html 实现效果: 源码 ...

  2. 从零开始写 Docker(一)---实现 mydocker run 命令

    本文为从零开始写 Docker 系列第一篇,主要实现 mydocker run 命令,构造了一个具有基本的 Namespace 隔离的简单容器. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章 ...

  3. logback 常用配置(详解)

    转自:https://blog.csdn.net/qq_36850813/article/details/83092051 官方文档参考:https://logback.qos.ch/manual/a ...

  4. 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,rgv小车,期限控制,参数调试等)

    需求   1.键鼠控制,承担ui界面设计,布局兼容分辨率1024x768 ~ 1920x1080.  2.权限控制:三种权限,分为管理员(可以定制模块界面,修改产品名称等定制化软件和其他权限,同时具备 ...

  5. 项目打包setup.py(setuptools)

    参考 https://www.cnblogs.com/dan-baishucaizi/p/13564333.html https://www.cnblogs.com/dan-baishucaizi/p ...

  6. ASP.NET 读取FTP文件流

    参考资料 ASP.NET 上传文件到共享文件夹 工具类代码 /// <summary> /// 读取ftp文件流 /// </summary> /// <param na ...

  7. 对于Celery原理的简单理解

    参考博客: https://www.cnblogs.com/forward-wang/p/5970806.html https://blog.csdn.net/cuomer/article/detai ...

  8. Nebula Operator 云上实践

    本文首发于 Nebula Graph Community 公众号 嗨,大家好!Nebula Operator 开源也有一段时间了,之前也有一篇相关的博客介绍,但是实践相关的博客却还没有,现在: 它来了 ...

  9. 问答:C程序为何for循环和while循环无法相互替代?

    百鸡百钱问题: C代码: include <stdio.h> main() { int cock, hen, chicken; for(cock=0;cock<=20;cock++) ...

  10. MyBatis的Example类详解

    Example类的定义? 第一次幕课网教程看到关于这方面教时,没有懂example起什么用,感觉不用example也可以查询了,后来认真一看才知道这是查询条件生成器 mybatis-generator ...