python自动化--拆分pdf

# 打包命令
 pyinstaller -F 拆分pdf文件.py     #会显示控制台 cmd
  pyinstaller -F -w 拆分pdf文件.py     #不会显示控制台
# 20220521
# 1.选择要分割的文件
# 2.选择要保存的位置,分割为多个文件时,可自动用页码命名
# 3.输入要分割的页码,可以是一个范围1-23(将第1-23页提取出来),也可以是单个页码,12(将第12页单独提取出来)
# 4.点击按钮执行
# 20220528
# 模块化 可用
# 20220529 输入页码范围判断
import os.path
import time

from PyPDF2 import PdfFileReader, PdfFileWriter
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 = PdfFileReader(pdf_i)
    # pages = len(pdf.pages)
    # pages = pdf.getNumPages()
    pdf_wt = PdfFileWriter()
    # print(pages)
    for i in range(start_page - 1, end_page):
        pdf_wt.addPage(pdf.getPage(i))
        # pdf_wt.addPage(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() + '\\'+f'(第{start_page}——{end_page}页)'+ pdf_name + f'.pdf'
    split_name2 = pdf_out.get() + '\\' +f'(第{start_page}页)'+ pdf_name + f'.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 = PdfFileReader(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 = PdfFileReader(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()

time.sleep(10)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容