こんにちは,はむんちゅです
- Pythonを使ってPDFの差分をとって比較したい!
- PDFを比較することで仕事の効率化を上げたい!
こういった疑問に簡潔にお答えします
この記事には,
- Pythonを使ったPDF差分比較ツールのソースコードを公開
- 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を学ぶには,スクールに通うのが一番ですが,自分で勉強するほうが安上りです。
独学でPythonを学びたい方はこちらをどうぞ!<ゼロからのPython入門>https://www.python.jp/train/index.html 参考リンクを貼りました。



難しそうだ~ スクール通おうかな
ではおやはむ!!