Pythonを使ったPDF差分比較ツールのソースコードを公開

コーディング

こんにちは,はむんちゅです

  • Pythonを使ってPDFの差分をとって比較したい!
  • PDFを比較することで仕事の効率化を上げたい!

こういった疑問に簡潔にお答えします

この記事には,

  1. Pythonを使ったPDF差分比較ツールのソースコードを公開
  2. PDF差分比較ツールの使用例

これらをまとめております

この記事を書いている僕は

Python経験は,2年ほどで仕事効率化の為にツールを作ったりしてます

簡潔に解説します

目次

Pythonを使ったPDF差分比較ツールのソースコードを公開

ツールの実行結果

いらすとやの「チョッパー」をPDFとして用意します

チョッパーのPDFに記号を付けます

この二つに差分比較ツールを掛けると⇓差分が緑の箱で囲まれます!!!

差分が緑の枠で囲まれた!一目でどこが変わったかわかるね!!

必要なライブラリをインポート

pip install opencv-python
pip install pdf2images
pip install pathlib
pip inatall glob3

ソースコード

import os
from pathlib import Path
from pdf2image import convert_from_path
import glob
import cv2

def add_poppler_path():
    # poppler/binを環境変数PATHに追加する
    poppler_dir = Path(__file__).parent.absolute() / "poppler/bin"
    os.environ["PATH"] += os.pathsep + str(poppler_dir)

def pdf_to_images():
    j = 0
    k = 0
    # PDFファイルのパスを取得し順番に捌いていく
    for x in glob.glob("./pdf_file_before/*.pdf"):
        
        pdf_path = Path(x)

        # pdfから画像に変換
        pages = convert_from_path(str(pdf_path), dpi=150)
        # 画像ファイルを1ページずつ保存
        image_dir = Path("./image_file_before")
        for i, page in enumerate(pages):
            file_name = "{:02d}".format(j + 1) + ".jpeg"
            image_path = image_dir / file_name
            # JPEGで保存
            page.save(str(image_path), "JPEG")
            j = j + 1

    for x in glob.glob("./pdf_file_after/*.pdf"):
        
        pdf_path = Path(x)

        # pdfから画像に変換
        pages = convert_from_path(str(pdf_path), dpi=150)
        # 画像ファイルを1ページずつ保存
        image_dir = Path("./image_file_after")
        for i, page in enumerate(pages):
            file_name = "{:02d}".format(k + 1) + ".jpeg"
            image_path = image_dir / file_name
            # JPEGで保存
            page.save(str(image_path), "JPEG")
            k = k + 1

def find_diff():            
    image_dir = Path("./image_file_after")
    for l in range(sum(os.path.isfile(os.path.join(image_dir, name)) for name in os.listdir(image_dir))):
        #参照画像(img_ref)と比較画像(img_comp)の読み込み
        img_ref  = cv2.imread("./image_file_before/" + "{:02d}".format(l + 1) + ".jpeg", 1)
        img_comp = cv2.imread("./image_file_after/" + "{:02d}".format(l + 1) + ".jpeg", 1)
        temp = img_comp.copy()
        #グレースケース変換
        gray_img_ref  = cv2.cvtColor(img_ref, cv2.COLOR_BGR2GRAY)
        gray_img_comp = cv2.cvtColor(img_comp, cv2.COLOR_BGR2GRAY)
        #単純に画像の引き算
        img_diff = cv2.absdiff(gray_img_ref, gray_img_comp)
        #差分画像の2値化(閾値が50)
        ret, img_bin = cv2.threshold(img_diff, 50, 255, 0)
        #2値画像に存在する輪郭の座標値を得る
        contours, hierarchy = cv2.findContours(img_bin, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        #contoursから一個ずつ輪郭を取り出し、輪郭の位置(x,y)とサイズ(width, height)を得る
        #サイズが 5x5 以上の輪郭を枠で囲う。
        for contour in contours:
            x, y, width, height = cv2.boundingRect(contour)
            if width > 5 or height > 5:
                cv2.rectangle(temp, (x-2, y-2), (x+width+2, y+height+2), (0, 255, 0), 2)
            else:
                continue
        #差分画像を保存
        cv2.imwrite("./diff_image_file/" + "{:02d}".format(l + 1) + ".jpeg",temp)


if __name__ == "__main__":
    add_poppler_path()
    pdf_to_images()
    find_diff()

ディレクトリ構成

以下のディレクトリ構成にしないと動きません

popplerはPCにダウンロードして解凍した後に,以下のように配置しましょう

参考:http://blog.alivate.com.au/poppler-windows/

(latest binaryをダウンロードして以下ように配置します)

PdfDiff
    ∟diff_image_file
    ∟image_file_after
    ∟image_file_before
    ∟pdf_file_after
    ∟pdf_file_before
    ∟poppler
        ∟bin
        ∟include
        ∟lib
        ∟shere
   ∟pdf_diff.py

PDF差分比較ツールの使用例

書類の承認確認

部下から受け取った書類に不備がないかチェックする際に使用すると便利!

昔の書類から少しだけ変わっただけなのに,全てチェックしていませんか?

そういう時は差分ツールでチェックしましょう

図面のチェック

家の図面など,前回からどう変わったかすぐに確認することができます.書類のチェックとメリットは同じです

自分でもツールを作りたいと思ったら

今回はPythonを使ったツールをご紹介しました

Pythonを学ぶには,スクールに通うのが一番ですが,自分で勉強するほうが安上りです

<ゼロからのPython入門>https://www.python.jp/train/index.html 参考リンクを貼りました。

難しそうだ~ スクール通おうかな

ではおやはむ!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次