機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【tkinter】【PyPDF2】PyPDF2を用いてPDFを分割するアプリを作る

tkinterとPyPDF2を組み合わせてGUIからPDFを選択し、選択したPDFから指定のページ範囲でPDFを分割する

■はじめに

前々回、複数のPDFをGUIから選んで結合するアプリを作りました。

stjun.hatenablog.com

また前回は上記アプリにPDFから任意のページを抽出する機能を追加しました。

 

stjun.hatenablog.com

 今回、任意のPDFから指定のページ範囲を分割する機能を追加したいと思います。

■コード

import PyPDF2 as pdf2
import tkinter.filedialog as fl 
import tkinter as tk
import tkinter.messagebox as mb

root=tk.Tk()
root.title('PDF結合ソフト')
frame1=tk.LabelFrame(root,text="結合",foreground="green")
frame1.grid(row=0,sticky="we")

frame2=tk.LabelFrame(root,text="抽出",foreground="green")
frame2.grid(row=1,sticky="we")

frame3=tk.LabelFrame(root,text="分割",foreground="green")
frame3.grid(row=2,sticky="we")

entry_title=tk.Entry(frame1,width=40)
entry_title.insert(tk.END,"保存するファイル名を記入してください")
entry_title.grid(row=0,column=1,padx=5)

entry_page=tk.Entry(frame2,width=10)
entry_page.insert(tk.END,"ページNo.")
entry_page.grid(row=0,column=1,padx=5)

entry_separate_title=tk.Entry(frame2,width=30)
entry_separate_title.insert(tk.END,"保存ファイル名")
entry_separate_title.grid(row=0,column=2,padx=5)

entry_page_start=tk.Entry(frame3,width=5)
entry_page_start.grid(row=0,column=2,padx=5)

entry_page_last=tk.Entry(frame3,width=5)
entry_page_last.grid(row=0,column=3,padx=5)

entry_page_separateall=tk.Entry(frame3,width=5)
entry_page_separateall.grid(row=1,column=2,padx=5)

entry_title_separate=tk.Entry(frame3,width=35)
entry_title_separate.insert(tk.END,"保存ファイル名")
entry_title_separate.grid(row=2,column=1,columnspan=2,padx=5)

var=tk.IntVar()
var.set(0)
radio_space=tk.Radiobutton(frame3,value=0,variable=var,text="範囲指定",anchor="w")
radio_space.grid(row=0,column=1,padx=5)
radio_comma=tk.Radiobutton(frame3,value=1,variable=var,text="指定ページから最後まで",anchor="w")
radio_comma.grid(row=1,column=1,padx=5)

def select():
    sub_pdf=pdf2.PdfFileMerger()
    filetype=[("all file","*")]
    path=fl.askopenfilenames(initialdir="C:/Users/ユーザー",filetypes=filetype,title="select file")
    file_title=entry_title.get()
    for i in path:
        sub_pdf.append(i)
    sub_pdf.write('C:/Users/ユーザー/'+file_title+'.pdf')
    sub_pdf.close()
    mb.showinfo("確認","PDFの結合に成功しました")
    
def separate(*args):
    try:
        filetype=[("all file","*")]
        path=fl.askopenfilename(initialdir="C:/Users/ユーザー",filetypes=filetype,title="select file")
        source=pdf2.PdfFileReader(path)
        sepa_pdf= pdf2.PdfFileWriter()
        sepa_pdf.addPage(source.getPage(int(entry_page.get())))
        out_pdf = open(entry_separate_title.get()+'.pdf', 'wb')
        sepa_pdf.write(out_pdf)
        out_pdf.close()
        mb.showinfo("確認","PDFの抽出に成功しました")
    except:
        mb.showinfo("エラー","エラー。設定を確認してください")

        
def separate_all():
    csv_data_separate=var.get()
    if csv_data_separate==0:
        start=int(entry_page_start.get())-1
        last=int(entry_page_last.get())
        filetype=[("all file","*")]
        path=fl.askopenfilename(initialdir="C:/Users/ユーザー",filetypes=filetype,title="select file")
        source=pdf2.PdfFileReader(path)
        sepa_pdf= pdf2.PdfFileWriter()
        for i in range(start,last,1):
            sepa_pdf.addPage(source.getPage(i))
        out_pdf = open(entry_title_separate.get()+'.pdf', 'wb')
        sepa_pdf.write(out_pdf)
        out_pdf.close()
        mb.showinfo("確認","PDFの分割に成功しました")
    else:
        start=int(entry_page_separateall.get())
        filetype=[("all file","*")]
        path=fl.askopenfilename(initialdir="C:/Users/ユーザー",filetypes=filetype,title="select file")
        source=pdf2.PdfFileReader(path)
        sepa_pdf= pdf2.PdfFileWriter()
        last=(source.numPages)
        for i in range(start,last,1):
            sepa_pdf.addPage(source.getPage(i))
        out_pdf = open(entry_title_separate.get()+'.pdf', 'wb')
        sepa_pdf.write(out_pdf)
        out_pdf.close()
        mb.showinfo("確認","PDFの分割に成功しました")
        
    

button_select=tk.Button(frame1,text="選ぶ&結合",width=10,command=select)
button_select.grid(row=0,column=0)

button_separate=tk.Button(frame2,text="選ぶ&抽出",width=10,command=separate)
button_separate.grid(row=0,column=0)

button_separate2=tk.Button(frame3,text="選ぶ分割",width=10,command=separate_all)
button_separate2.grid(row=0,rowspan=3,column=0,sticky="ns")

button_research=tk.Button(frame3,text="選ぶ分割",width=10,command=separate_all)
button_research.grid(row=0,rowspan=3,column=0,sticky="ns")


root.mainloop()

(※コード内の「ユーザー名」の部分にお使いのPCの名前を入れて下さい)

実行すると以下の画面が現れます。

f:id:stjun:20191110145942p:plain

今回は試しに指定した範囲のページだけを分割してみたいと思います。

試しに1~2ページを分割してみたいと思います。

下図のように範囲指定を選択し、その横のブロックに1と2を代入します。

左の選ぶ分割ボタンを押すと分割されます。

f:id:stjun:20191110150611p:plain

f:id:stjun:20191110150637p:plain

 

またあるページから最後のページまでを分割したいなら、

「指定ページから最後まで」を選択し、その横に指定ページNo.を入力すると分割できます。

f:id:stjun:20191110151229p:plain

 

■買って良かったもの紹介

 今回紹介したmatplotlib以外にもpandasやBokehなどのモジュールの使い方が書かれている本です。

公式リファレンス等もありますし、ネットで探せばいくらでもモジュールの使い方・書き方は見つかりますが、一冊くらいこのような本を手元に持っておくと便利です。

 

pythonを初めて触ろうとした時に読んだ本を紹介します。

 

 この本は、初心者に最適だと思います。確か亀を動かすゲームのようなコードが載っていたと思います。pythonをこれから始めようと思っている人は読んでみて下さい。

また下の入門python3も良い本だと思いますが、分厚いので中々根気が必要です。個人的には最小限必要なことが書いてある薄い本を読み、必要になってからちょっとずつ知識を増やしていくのが良いと思います。

また何度も紹介しますが、以下のニューラルネットワーク自作入門は非常に良い本です、pythonの書き方から記載されているのでいきなり読んでも大丈夫だと思います。

 とりあえず基本的なコードの書き方さえ分かってしまえば、後はネットで知りたい情報にアクセスする方が早いと思います。

■おわりに

次記事はこちらです。

stjun.hatenablog.com