記事
· 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
}
ObjectScript
ObjectScript

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

from barcode import EAN13
Python
Python

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

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

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

バーコードと 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)
}
ObjectScript
ObjectScript

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)
}
ObjectScript
ObjectScript

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
Python

まとめ

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

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