【Python】スキャンしたQRコードを解析し、しおり付きのPDFを作成する(OpenCV+img2pdf+PyPDF)

Python

スキャン画像に含まれるQRコードを解析し、しおり付きのPDFファイルを自動的に作成するプログラムをPythonで作成しましたので、ご紹介します。

当プログラムを活用することで、あらかじめQRコードを仕込んでおいた書類をスキャンしたときに、しおり付きのPDFを自動的に作成することができます。大量の書類や伝票などを一気にスキャンした際でも、しおりが自動的に作成されることで、すぐに目的のページにジャンプすることが可能となります。

スポンサーリンク

できること

  • スキャンした画像ファイルに含まれるQRコードを解析
  • 画像にQRコードが含まれていると、そのページにジャンプするしおりがPDFに作成される
  • しおりのタイトルはQRコードに含まれている文字列が設定される

当記事ではしおりを付与するサンプルをご紹介していますが、コードをカスタマイズすることで、タグ付きPDFを生成したり、QRコードのあるページでファイルを分割したりするようなこともできます。

スポンサーリンク

実際に動かしてみよう!

さっそくサンプルをご紹介します。

プログラムとサンプルファイル一式をダウンロードできます。

Pythonスクリプトと同じ階層にフォルダ(ここではimages)を作成し、スキャンした画像ファイルを配置しておきます。

画像ファイルにはしおりを作成したいページにQRコードを含めておきます。QRコードはネット上にある各種無料ツールを使って作成できますが、解析に使用しているOpenCVのQRCodeDecoderはUTF-8にしか対応していないため、日本語や全角文字を含める場合はUTF-8でエンコードされている必要があります。

【みんなの知識 ちょっと便利帳】QRコード作成ツール - QR Code Generator
QRコード作成ツールです。QRコードを簡単に作成することができます。『みんなの知識 ちょっと便利帳』の一部です。

コードがつぶれていなければ、かなり小さくでも認識できるようですので、じゃまにならない程度のサイズで入れておけばOKです。位置は自由です。

以下のスクリプト(Python)を実行すると、しおり付きのPDFが生成されます。

import os
import sys
import glob
import cv2
import img2pdf
from PyPDF2 import PdfFileWriter, PdfFileReader

# 画像ファイルがあるフォルダを指定する

folderPath = "images"

# フォルダに存在する画像ファイルのリストを取得する
images = glob.glob(os.path.join(folderPath, "*.*"))
print(images)

# しおりのデータ
bookmarks = []

# QRコードを認識する
for i in range(len(images)):
    # 画像ファイルリストを表示する
    print(images[i])
    # 画像ファイルを開く
    image = cv2.imread(images[i])
    # QRコードを認識する
    qrDetector = cv2.QRCodeDetector()
    data, bbox, rectifiedImage = qrDetector.detectAndDecode(image)
    # 画像をプレビュー
    # cv2.imshow("Rectified QRCode", images[i])
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
    print(data)
    # しおりデータを追加
    if data!="":
        bookmarks.append([i, data])

# 画像をPDFファイルに変換する
with open("temp.pdf", "wb") as f:
    f.write(img2pdf.convert(images))

# PyPDF2でPDFファイルを開く
input = PdfFileReader('temp.pdf')

# PdfFileWriterのインスタンスを作成
output = PdfFileWriter()

# オリジナルのPDFをPdfFileWriterにコピーする
output.cloneDocumentFromReader(input)

# しおりを追加する
for i in range(len(bookmarks)):
    output.addBookmark(bookmarks[i][1], bookmarks[i][0])

# PDFを出力する
with open(os.path.basename(folderPath)+".pdf", 'wb') as o:
    output.write(o)

生成されたPDFはこんな感じです。「サンプルQRコード」という文字列を含むQRコードを画像に貼り付けて、上記スクリプトでPDFを生成しました。しおりペインを開いてもらうと、QRコードからしおりが作成されていることが確認できます。

なお、本スクリプトを実行するには、以下のライブラリが必要となります。あらかじめpipでインストールしておいてください。

しくみ

処理内容としては以下のような流れとなります。

  1. フォルダに含まれている画像ファイルのリストを取得
  2. 各画像ファイルをOpenCVで解析
    OpenCVで各画像を解析し、QRコードが存在している画像のインデックスとデータを配列に格納します。
  3. img2pdfで画像ファイルをPDFに変換
    img2pdfで画像ファイルからしおりなしのPDFファイルを生成しておきます。
  4. QRコードのデータをもとにPyPDF2でしおりを作成する
    PyPDF2で変換したPDFを開き、配列に格納されているQRコードのデータをもとにしおりを作成します。

指定されたフォルダ(サンプルではimages)に含まれている画像ファイルを逐次解析し、QRコードがあるページのインデックスとQRコードに含まれる文字列を取得しています。取得されたデータは配列に格納しておき、img2pdfで画像ファイルをPDFにしたあと、PyPDF2でしおりを追加しています。

サンプルの注意点
  • 画像のファイル名・フォルダパスは英数字のみである必要があります(OpenCVが日本語のパスに対応していないため)
  • QRコードに日本語を含める場合は、UTF-8でエンコードされている必要があります。

まとめ

QRコードを活用し、Pythonでスキャン画像からしおり付きのPDFを生成するサンプルを紹介しました。

今回のサンプルを応用することにより、QRコードで管理されている帳票や文書を自動的に仕分けたり、さまざまな利用法が考えられます。業務システムに組み込めば、紙文書の電子化も効率的に行えそうですね。

なお、すでにPDFファイル化されている場合でも、pdf2imgなどのライブラリを組み合わせることで同様のことが実現できます。機会があれば、すでにPDF化されているファイルのQRコード解析についても公開したいと思います。

コメント

タイトルとURLをコピーしました