LoginSignup
14

More than 1 year has passed since last update.

PythonでPDFファイルを結合・分割・並び替えアプリ作成

Last updated at Posted at 2022-04-10

はじめに

Pythonプログラムで即業務に役立つサンプルプログラムとして、PDFファイルを分割、結合、並び替えできるアプリを作成してみましたので、備忘録も兼ねて掲載します。
プログラムは、PDFファイルをドラッグ&ドロップしたり、並び替えが出来るなど、GUI画面で操作しやすくしてみました。

動作環境

Visual Studio Code
Python3.8.8

各種インストールライブラリー

PyPDF2 1.26.0
tkinterdnd2 0.3.0

画面イメージ:

PDFファイルをドラッグ&ドロップしたり並び替えたり、結合、分割するためのアプリ本体の画面イメージは以下のようになっています。
LISTBOXやボタンを使って、出来るだけ操作しやすいようにしています。
完成イメージ.png

YouTubeでの解説:

プログラムの作り方や操作の概要をYoutubeで詳しく解説していますので、ぜひご覧ください!

サンプルソース(途中版):

プログラムソースは、上記YouTubeの動画
https://youtu.be/2-fSrPWxSIQ
の概要欄に、限定公開用のURLを掲載させて頂いています。
恐れ入りますが、YouTube動画経由でアクセスしてご覧ください。

pdf_cut_add.py
from tkinterdnd2 import *
from tkinter import *
import tkinter as tk
from tkinter import filedialog
import PyPDF2
from PyPDF2 import PdfFileReader
import os

def add_listbox(event):
    if event.data.endswith(".pdf"):
        listbox.insert("end", event.data)

def pdf_add():  # pdfファイルを結合
    # アウトプットPDFファイル名を指定するポップアップ表示
    filename = filedialog.asksaveasfilename(
        title = "結合するPDFファイル名を指定してください",
        filetypes = [("pdf", ".pdf") ], # ファイルフィルタ
        initialdir = "./", # 自分自身のディレクトリ
        defaultextension = "pdf")
    if filename == '':
        return
    merger = PyPDF2.PdfFileMerger(strict=False)
    for i in range(listbox.size()):
        merger.append(listbox.get(i))
    merger.write(filename)
    merger.close()

def pdf_cut():  # pdfファイルを分割
    cut_dir = filedialog.askdirectory(title = "分割したファイルを保存するフォルダを選択してください",
        initialdir = './') 
    if cut_dir == '':
        return
    for i in range(listbox.size()):
        reader = PdfFileReader(listbox.get(i)) 
        for j in range(reader.getNumPages()):
            merger = PyPDF2.PdfFileMerger(strict=False)
            merger.append(listbox.get(i), pages=(j,j+1))
            cut_file = cut_dir + '/' + os.path.splitext(os.path.basename(listbox.get(i)))[0]
            merger.write(cut_file + '_' + str(j) + '.pdf')
            merger.close()

def del_listbox():  # 選択したファイルをLISTBOXからクリア
    indices = listbox.curselection()
    if len(indices) == 1:
        listbox.delete(indices)

def all_del_list(): # LISTBOXをクリア
    listbox.delete(0,listbox.size())

'''
続きはYouTube動画の概要欄の限定共有URLに掲載していますので、そちらをご覧ください
'''

最後に:

今後も、業務に役立ちそうなプログラムを作成して掲載していきたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14