tkinterとPyPDF2を組み合わせてGUIからPDFを選択し、選択したPDFにパスワードを付ける
■はじめに
PDFを操作するアプリとして、これまでに以下の4つの機能を作成しました。
1. 複数のPDFをGUIから選んで結合する機能
2. PDFから任意のページを抽出する機能
3.任意のPDFから指定のページ範囲を分割する機能
4.任意のPDFの総ページ数を調べる機能
stjun.hatenablog.com
stjun.hatenablog.com
stjun.hatenablog.com
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")
frame4=tk.LabelFrame(root,text="その他",foreground="green")
frame4.grid(row=3,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)
entry_password=tk.Entry(frame4,width=35)
entry_password.insert(tk.END,"パスワードを英数字で入力してください")
entry_password.grid(row=1,column=1,padx=5)
entry_title_password=tk.Entry(frame4,width=35)
entry_title_password.insert(tk.END,"保存ファイル名")
entry_title_password.grid(row=2,column=1,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)
message=tk.Label(frame4,text="ボタンを押すとページ数が表示されます",width=30)
message.grid(row=0,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の分割に成功しました")
def pagenumber():
filetype=[("all file","*")]
path=fl.askopenfilename(initialdir="C:/Users/ユーザー",filetypes=filetype,title="select file")
source=pdf2.PdfFileReader(path)
message["text"]="ページ数は"+str(source.numPages)+"です。"
def password():
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(0,last,1):
sepa_pdf.addPage(source.getPage(i))
sepa_pdf.encrypt(entry_password.get())
out_pdf = open(entry_title_password.get()+'.pdf', 'wb')
sepa_pdf.write(out_pdf)
out_pdf.close()
mb.showinfo("確認","パスワード作成に成功")
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_research=tk.Button(frame3,text="選ぶ&分割",width=10,command=separate_all)
button_research.grid(row=0,rowspan=3,column=0,sticky="ns")
button_pagenumber=tk.Button(frame4,text="ページ数を確認",width=10,command=pagenumber)
button_pagenumber.grid(row=0,column=0,sticky="ns")
button_password=tk.Button(frame4,text="パスワード作成",width=10,command=password)
button_password.grid(row=1,column=0,rowspan=2,sticky="ns",padx=5)
root.mainloop()
(※コード内の「ユーザー名」の部分にお使いのPCの名前を入れて下さい)
実行すると以下の画面が現れます。
その他欄のパスワード作成ボタン横の空欄に、パスワードと保存ファイル名を入力します。
次に、パスワード作成ボタンを押しPDFを選ぶと、選んだPDFにパスワードが付きます。
下の画像はパスワードを付けたPDFをChromeで開いた画面です。ちゃんとパスワードが付いていることが分かります。
■お得情報の紹介
私はAmazon kindle unlimitedというサービスを1年以上利用しています。
これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。
ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。
なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。
それか30日内に気になる本を全て読破すれば実質タダです。
ぜひ気になった方はチェックしてみて下さい。
なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。
ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。
(https://www.amazon.co.jp/b?ie=UTF8&node=5431437051)
学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。
以下に私がkindle unlimitedで読んだ本を載せておきます。
■雑誌系
■おわりに
いかがだったでしょうか。次回も更に機能を追加していきます。