【Python】PDF上にPDFを貼る(合成・マージ)アプリ作成(PyPDF2、mergePage)

時計 2020.11.01 / 時計

【Python】PDF上にPDFを貼る(合成・マージ)アプリ作成(PyPDF2、mergePage)

仕事においてPDFを扱うことは非常に多いですよね。
PDF操作を簡単にできるようになれば、仕事の効率は良くなるはずです。

PythonでPDFファイルを操作する場合、PyPDF2を使用することが多いです。

本記事では、PDF上にPDFを貼り付ける(合成・マージ)方法を解説いたします。

そこまでこの方法を必要とする人は少ないかもしれません。
ですが少なくとも少数はいるはずです。

というのも、私の会社ではPDF(特定の書類)の上に、とあるPDF(エクセルをPDFに変換した、文字のみが記入されているPDF)を貼り付ける作業がありました。

今まではPDFを印刷し、さらにその印刷したPDFにとあるPDFを印刷するという作業を行っていました。

今回紹介するアプリを作成してから、わざわざ紙を印刷する必要がなくなりました。

ぜひ今回紹介する方法をマスターしていただき、仕事の効率化や紙の削減を進めていただければと思います。

今回使用するPyPDF2モジュールの使い方を紹介した記事は他にもありますので、仕事に合う記事をぜひ見つけて参考にしてください。

アプリの概要

今回作成するアプリケーションの概要を説明します。

アプリはGUIアプリケーションであり、GUI画面の作成にはTkinterを使用します。
作成されるGUIウィンドウは以下になります。

GUIアプリのウィンドウ
アプリ概要

TkinterでGUI画面を表示する

貼り付けられるPDFを選択する

貼り付けるPDFを選択する

出力フォルダを選択する

上記の流れで動作する、PDF上にPDFを貼り付けるアプリを作成していきます。

アプリのソースコード紹介

上記で紹介したアプリのソースコードを以下に記します。

コピペして、実際にどのように動くのか確かめてみてください。

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as f
import tkinter.filedialog,tkinter.messagebox
import os, sys
import PyPDF2

def set_from():
    entry_from.delete(0,tk.END)
    fTyp = [("", ".pdf")]
    iDir = os.path.abspath(os.path.dirname(sys.argv[0]))
    pdfFrom = tkinter.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    if pdfFrom == '':
        return ""
    entry_from.insert(tk.END,pdfFrom)

def set_to():
    entry_to.delete(0,tk.END)
    fTyp = [("", ".pdf")]
    iDir = os.path.abspath(os.path.dirname(sys.argv[0]))
    pdfTo = tkinter.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
    if pdfTo == '':
        return ""
    entry_to.insert(tk.END,pdfTo)

def set_output():
    entry_output.delete(0,tk.END)
    iDir = os.path.abspath(os.path.dirname(sys.argv[0]))
    dirOut = tkinter.filedialog.askdirectory(initialdir=iDir)
    if dirOut == '':
        return ""
    entry_output.insert(tk.END,dirOut)

def merge():
    pdfFrom = entry_from.get()
    pdfTo = entry_to.get()
    pdfOut = entry_output.get() + "/merge.pdf"

    with open(pdfFrom, mode='rb') as f, open(pdfTo, mode='rb') as t, open(pdfOut, mode='wb') as o:
        # マージするConfidential
        read_t = PyPDF2.PdfFileReader(t)
        page_t = read_t.getPage(0)
        # マージ対象のファイル
        read_f = PyPDF2.PdfFileReader(f)
        page_f = read_f.getPage(0)
        page_f.mergePage(page_t)

        writer = PyPDF2.PdfFileWriter()
        writer.addPage(page_f)

        # ファイルへの書き込み
        writer.write(o)
    tkinter.messagebox.showinfo('完了', "合成したファイルを作成しました")

if __name__ == '__main__':
    root = tk.Tk()
    root.title("Merge App")
    root.geometry("550x150")

    font1 = f.Font(family="MSゴシック", size=12)

    # メインフレームの作成と設置
    frame = tk.Frame(root)
    frame.pack(fill = tk.BOTH, pady=10, padx=10)

    # 各種ウィジェットの作成
    label_from = ttk.Label(frame, text="Select PDF 1 :")
    entry_from = ttk.Entry(frame, width=50)
    button_from = ttk.Button(frame, text="参照", command=set_from)

    label_to = ttk.Label(frame, text="Select PDF 2 :")
    entry_to = ttk.Entry(frame, width=50)
    button_to = ttk.Button(frame, text="参照", command=set_to)

    label_output = ttk.Label(frame, text="Output Folder :")
    entry_output = ttk.Entry(frame, width=50)
    button_output = ttk.Button(frame, text="参照", command=set_output)

    label_from["font"] = font1
    label_to["font"] = font1
    label_output["font"] = font1

    button = ttk.Button(frame, text="実行", command=merge)

    label_from.grid(row=0, column=0)
    entry_from.grid(row=0, column=1)
    button_from.grid(row=0, column=2, padx=5)

    label_to.grid(row=1, column=0)
    entry_to.grid(row=1, column=1)
    button_to.grid(row=1, column=2, padx=5)

    label_output.grid(row=2, column=0)
    entry_output.grid(row=2, column=1)
    button_output.grid(row=2, column=2, padx=5)

    button.grid(row=3, column=1, pady=5)

    root.mainloop()

GUIの作成

本アプリケーションは、PythonのTkinterでGUIウィンドウを作成しています。

Tkinterの使い方は以下記事を参考にしてください。

PDFの貼り付け(合成・マージ)

PDF上にPDFを貼り付けるにはmergePageメソッドを使います。

page_f.mergePage(page_t)

ここではpage_f上にpage_tを貼り付けています。

この方法を応用すれば、例えば対象のPDF群に会社ロゴの透かしを入れる等できるようになります。
この場合は透かしをpage_t、透かしを入れるPDFをpage_fにします。

透かしではなく、ページ番号を入れたいという方は、今回紹介しているmergePageでも実現できますが、reportlabでページ番号を記載した方が簡単です。

mergePageで貼り付けた後は必ず対象のPDFを保存してください。

writer = PyPDF2.PdfFileWriter()
writer.addPage(page_f)

# ファイルへの書き込み
writer.write(o)

まとめ

PDF上にPDFを貼る(合成・マージ)アプリ作成はいかがでしたでしょうか。

仕事でPDF上にPDFを貼る必要がある人は、コピペで使えるようにソースコードを公開しているので、どんどん使ってください。

またexeファイルにして、誰でもこのアプリを使えるようにしたい場合は、pyinstallerを使ってexeファイルにしてみてください。

当サイトOffice54では、仕事に使えるアプリケーション作成方法をたくさん載せているので、他の記事もぜひ確認してくださいね。