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. UVA12467 Secret Word 题解

    题目传送门 前置知识 前缀函数与 KMP 算法 解法 考虑将 \(S\) 翻转后得到 \(S'\),然后就转化为求 \(S'\) 的一个最长子串使得其是 \(S\) 的前缀.使用 KMP 求解即可. ...

  2. Burnside引理和Pólya定理

    不想写很多冗杂的群论定义,所以本博客不是用来入门的. 如果你想要入门,请点这里. 概要 对于一个作用在集合 \(X\) 上的有限群 \(G\) ,对于每个 \(g\in G\) 令 \(X^g\) 表 ...

  3. 2024 SICTF Round#3出题 crypto misc osint

    有幸参与了本次比赛crypto misc OSINT出题,难易程度循序渐进,下面记录一下本人题目题解(( 比赛网址:https://yuanshen.life/ CRYPTO SuperbRSA(85 ...

  4. junit自定义测试方法执行顺序

    平常我们写单元测试类,多个方法的执行顺序其实是没有特定顺序的.例如下面代码: package com.laoxu.gamedog; import org.junit.FixMethodOrder; i ...

  5. WSL2镜像文件压缩

    WSL2的镜像文件(*.vhdx)支持自动扩容,但是一般不会自动缩容.一旦某次存放过大文件以后,即使后续删除,镜像文件体积仍然不会缩小,导致大量磁盘空间浪费.因此,可以定期对镜像文件进行手动压缩. 镜 ...

  6. deque双端队列

    # 支持从任意一端增加和删除元素 d = collections.deque() d.extend('abcdefg') d.append('h') d.extendleft(range(6)) # ...

  7. 08-Redis系列之-Redis布隆过滤器,MySQL主从,Django读写分离

    Redis实现布隆过滤器 前言 布隆过滤器使用场景 比如有如下几个需求: 原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中? 解决办法一:将10亿个号码存 ...

  8. ASP.NET Core 微信支付(三)【查询订单 APIV3】

    官方参考资料 查询订单 理论实战 官方提供两种查询订单的方式,一种是根据商户自己生成的订单号查询,一种方式是根据微信生成的订单号查询.而我使用的就是第一种方式. 调用微信支付的查询订单,需要生成签名, ...

  9. 第一百一十二篇: JS数组Array(一)数组基本用法

    好家伙,   1.数组 Array应该就是ECMAScript中最常用的类型了.ECMAScript数组跟其他编程语言的数组有很大区别. 跟其他语言中的数组一样,ECMAScript 数组也是一组有序 ...

  10. Html飞机大战(十一): 飞机撞毁爆炸

    好家伙,这篇写英雄撞机爆炸   我们先把子弹销毁弄上去 子弹穿过敌机,敌机爆炸后消失,子弹同样也应该销毁,(当然后续会考虑穿甲弹)   然后我们还要把主角碰撞爆炸检测也加上去   因为他们共用一个思路 ...