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. 从零开始的react入门教程(八),redux起源与基础用法

    壹 ❀ 引 我们在从零开始的react入门教程(七),react中的状态提升,我们为什么需要使用redux一文中介绍了react的状态提升,对于不同组件之间状态需要通信时,将状态提升至两个组件共有的最 ...

  2. NC51178 没有上司的舞会

    题目链接 题目 题目描述 Ural大学有N名职员,编号为1~N. 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司. 每个职员有一个快乐指数,用整数 \(Hi\) 给出,其中 \(1\le ...

  3. CORS就是跨域吗?

    首先,跨域的域是什么? 跨域的英文是:Cross-Origin. Origin 中文含义为:起源,源头,出生地. 在跨域中,"域"指的是一个 Web 资源(比如网页.脚本.图片等) ...

  4. Java中的POJO是什么?

    1.介绍 在这个简短的教程中,我们将研究"普通Java对象"(Plain Old Java Object)的定义,简称POJO.我们将看看POJO与JavaBean的比较,以及如何 ...

  5. 7zip 命令行压缩指定后缀名

    接到一个需求,就是测试同学在测试软件的指定功能时,可能需要调试版本来查看输出信息,所以我们需要使用一个批处理文件来快速生成一个 debug 压缩包 7zip 给出了很多有用的命令行,我们可以使用它指定 ...

  6. Ubuntu防火墙相关

    查看防火墙当前状态 sudo ufw status 开启防火墙 sudo ufw enable 关闭防火墙 sudo ufw disable 查看防火墙版本 sudo ufw version 默认允许 ...

  7. python如何多版本共存

    1. 先正常安装多个python版本,比如我电脑里面是安装的3.10以及3.12 2. 安装的时候建议不要选择系统盘,可以用两个目录安装,例如: d:\py310\... d:\py312\... 3 ...

  8. python部署项目为什么要用Nginx和uWSGI

    一.测试运行python项目 1.1 Flask项目 说明1:当我们直接用编译器运行Flask项目的时候,会有一个提示:意思就是:这是开发环境的服务器,不能用于生产环境的部署,请使用WSGI的服务器替 ...

  9. 在Vue中使用Canvas绘制背景

    好家伙, 在vue中使用canvas绘制与在html中使用canvas绘制大致相同, 但又有所区别  法一(无图片资源): vue中canvas的使用 - 掘金 (juejin.cn) 找到canca ...

  10. [App Service for Windows]通过 KUDU 查看 Tomcat 配置信息

    问题描述 在App Service 中选择了Java Tomcat后,如何查看Azure App Service的Tomcat的配置信息呢? 问题解答 可以通过以下的 3个步骤查看: 第一步:登录 K ...