記事
· 2023年5月18日 9m read

Python と IRIS で QR コードとバーコードを生成して読み取る

請求、支払いや領収、アイテムの配送や在庫を処理するアプリケーションでは、バーコードや QR コードの使用が必要となるのが一般的です。 単純なバーコードよりも多くの情報を格納できる QR コードは、さらに幅広いシナリオで使用されています。 したがって、バーコードと QR コードを生成する機能、またはそれらに格納されたデータを画像または PDF から読み取る機能が重要となります。 この記事では、Python と無料のライブラリを使用してこれを行う方法を説明します。

Pyzbar ライブラリ

pyzbar ライブラリは、zbar ライブラリを使って、Python 2 と 3 から 1 次元バーコードと QR コードを読み取ります。 以下の特徴が備わっています。

  • 純粋な Python。
  • PIL / Pillow 画像、OpenCV / ImageIO / NumPy ndarray、および raw バイトで動作。
  • バーコードの場所をデコード。
  • zbar ライブラリ以外の依存関係なし。
  • Python 2.7、Python 3.5~3.10 で検証済み。

Zbar ライブラリ

ZBar Bar Code Reader は、動画ストリーム、画像ファイル、および未加工の強度センサといった様々なソースからバーコードを読み取るためのオープンソースのソフトウェアスイートです。 EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、ITF コード、および QR コードがサポートされています。 これらは、ライブラリの Python バインディングです。

Python-barcode ライブラリ

Python-barcode は、Python で簡単にバーコードを作成する方法を提供しています。 SVG ファイルの生成時に、外部依存関係はありません。 画像(PNG など)の生成には Pillow が必要です。 Python 3.7~3.10 をサポートしています。

Pillow ライブラリ

Python Imaging Library(Pillow)は、Python インタープリターに画像処理機能を追加します。 このライブラリは、広範なファイル形式のサポート、有効な内部表現、および強力な画像処理機能を提供します。 コアイメージライブラリは、いくつかの基本的なピクセル形式で格納されたデータに素早くアクセスできるように設計されています。 一般的な画像処理ツールに強固な基盤を提供します。

Opencv-Python ライブラリ

これは、OpenCV(Open Source Computer Vision Library)用の Python のラッパーで、 オープンソースのコンピュータービジョンおよび機械学習ソフトウェアライブラリです。 OpenCV は、コンピュータービジョンアプリケーションに共通のインフラストラクチャを提供し、商用製品での機械認識用途を高速化するために構築されました。 OpenCV は Apache 2 ライセンス製品であるため、コードを簡単に使用したり変更したりすることができます。

Pypdfium2 ライブラリ

これは、PDF の作成、検査、操作、およびレンダリングに使用できる PDFium という強力なリベラルライセンスライブラリへの ABI レベル Python 3 バインディングです。 ctypesgen と外部 PDFium バイナリを使用して構築されています。 そのカスタムセットアップインフラストラクチャにより、シームレスなパッケージングとインストールプロセスが提供されています。 wheel パッケージによって、広範なプラットフォームと Python バージョンがサポートされています。 一般的なユースケースを単純化するヘルパークラスが含まれていますが、未加工の PDFium/ctypes API にもアクセス可能です。

サンプルアプリケーション

これらの Python ライブラリを使用して、バーコードと QR コードを生成し、画像と PDF からそれらを読み取るサンプルアプリケーションを使用できます。
以下の手順を実行してください。

  1. リポジトリを任意のローカルディレクトリに Clone/git pull します。
$ git clone https://github.com/yurimarx/iris-qr-barcode-utils.git
  1. このディレクトリで Docker ターミナルを開き、以下を実行します。
$ docker-compose build
  1. IRIS コンテナを実行します。
$ docker-compose up -d
  1. Postman(または別の REST クライアント)を使用して、バーコードを値に書き込みます。
追記: 必要に応じて、Postman サンプルリクエストを https://github.com/yurimarx/iris-qr-barcode-utils/raw/main/barcode.postm... からインポートできます。

 

Postman を使用して、QR コードを画像に書き込む

バーコードを書き込む

 

Postman を使用してバーコード値を読み取る(EAN 128 を試してください - このプロジェクトのサンプルは project-folder/code128.png です)

バーコードを読み取る

Postman を使用して PDF からバーコード値を読み取る(バーコードと QR コード付きの PDF を試してください - プロジェクトのサンプルは project-folder/product.pdf です)

PDF バーコードを読み取る

#

バーコードを生成するソースコード

/iris-qrbarcode/writeqrbarcodetoimage/ API でバーコードを生成するために、python-barcode ライブラリを使用しました。 このライブラリは、以下のバーコード規格をサポートしています。

  • code 39
  • code 128
  • PZN7(別名 PZN)
  • EAN-13
  • EAN-8
  • JAN
  • ISBN-13
  • ISBN-10
  • ISSN
  • UPC-A
  • EAN14
  • GS1-128

dc.qrbarcode.QRBarcodeService クラスの WriteBarcodeToImage クラスメソッドには、python-barcode を使用して EAN13 規格(13 桁の数値)のバーコードを生成する例があります。

ClassMethod WriteBarcodeToImage(number, filename) [ Language = python ]
{
    from barcode import EAN13
    from barcode.writer import ImageWriter
    import base64
 
    my_code = EAN13(number, writer=ImageWriter())
    image = my_code.save(filename)
    return image
}

最初のステップは、目的のタイプ(EAN13)に対応するクラスをコードスニペットからインポートすることです。

from barcode import EAN13

その後にクラスコンストラクターを呼び出し、生成する数値と ImageWriter を渡します。

my_code = EAN13(number, writer=ImageWriter())

画像からバーコードを読み取るソースコード

バーコードと QR コードを読み取るために、pyzbar ライブラリを使用しています。 このライブラリは、EAN/UPC、Code 128、Code 39、ITF、および QR コードをサポートしています。 dc.qrbarcode.QRBarcodeService クラスの ReadQRBarcodeFromImage クラスメソッドには、pyzbar を使ってバーコードまたは QR コードを読み取る例があります。

ClassMethod ReadQRBarcodeFromImage(image) [ Language = python ]
{
    import cv2
    from pyzbar.pyzbar import decode
    import json
 
    # Make one method to decode the barcode
    class IrisBarcode:
        def __init__(self, bardata, bartype):
            self.bardata = bardata
            self.bartype = bartype
        
    
    result = []
 
    # read the image in numpy array using cv2
    img = cv2.imread(image)
 
    # Decode the barcode image
    detectedBarcodes = decode(img)
 
    # If not detected then print the message
    if detectedBarcodes:
        for barcodeitem in detectedBarcodes:
            item = IrisBarcode(barcodeitem.data.decode("utf-8"), barcodeitem.type)
            result.append(item)
 
    return json.dumps(result, default=vars)
}

OpenCV(クラス cv2)が、画像を NumPy 配列に変換するために使用されています。 これにより、pyzbar のデコードメソッドで、この配列を読み取り、バーコードを検出することができます。 検出されたバーコードは、バーコードのタイプとデータを含む JSON で返されます。

PDF からバーコードを読み取るソースコード

最初に使用したライブラリは pypdfium2 です。 これは、PDF の各ページを画像に変換してから、pyzbar で、画像に変換された PDF ページのバーコードを読み取るために使用されています。 dc.qrbarcode.QRBarcodeService クラスの ReadQRBarcodeFromPDF クラスメソッドには、pyzbar を使って PDF ファイルからバーコードまたは QR コードを読み取る例があります。
 

ClassMethod ReadQRBarcodeFromPDF(pdfpath) [ Language = python ]
{
    from pyzbar.pyzbar import decode
    import pypdfium2 as pdfium
    import json
 
    class IrisBarcode:
        def __init__(self, bardata, bartype):
            self.bardata = bardata
            self.bartype = bartype
        
    
    pdf = pdfium.PdfDocument(pdfpath)
    result = []
    pages = len(pdf)
    
    for currentPage in range(pages):
            
        page = pdf.get_page(currentPage)
        pil_image = page.render_to(
            pdfium.BitmapConv.pil_image,
        )
 
        # Decode the barcode image
        detectedBarcodes = decode(pil_image)
 
        # If not detected then print the message
        if detectedBarcodes:
            for barcodeitem in detectedBarcodes:
                item = IrisBarcode(barcodeitem.data.decode("utf-8"), barcodeitem.type)
                result.append(item)
 
    return json.dumps(result, default=vars)
}

pdfium.PdfDocument クラスは、PDF を 1 ページずつ読み取って、Pillow 形式の個別の画像に変換するために使用されています。 次に、pyzbar のデコードメソッドによって、Pillow 表現の画像に含まれるバーコードが検出されています。 最後に、検出されたバーコードと QR コードが JSON 形式で返されます。

ボーナスコンテンツ

QR コードを生成する場合は、qrcode-library(https://pypi.org/project/qrcode/)を使用できます。 以下の例を確認してください。

import qrcode
img = qrcode.make('Some data here')
type(img)  # qrcode.image.pil.PilImage
img.save("some_file.png")

まとめ

組み込み Python を使用すると、REST API の形態であっても、相互運用性本番環境であっても、あらゆるシナリオにおいて IRIS アプリケーションでバーコードと QR コードを簡単に読み取ることができます。 Python でプロシージャを作成し、テーブルからバーコードにデータを変更することも可能です。 IRIS Analytics ダッシュボードの用途も含め、可能性はたくさんありますので、 ぜひ試してみてください!

@Yuri Marxさんが書いた元の記事へ
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください