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 からそれらを読み取るサンプルアプリケーションを使用できます。
以下の手順を実行してください。
- リポジトリを任意のローカルディレクトリに Clone/git pull します。
$ git clone https://github.com/yurimarx/iris-qr-barcode-utils.git
- このディレクトリで Docker ターミナルを開き、以下を実行します。
$ docker-compose build
- IRIS コンテナを実行します。
$ docker-compose up -d
- Postman(または別の REST クライアント)を使用して、バーコードを値に書き込みます。
Postman を使用して、QR コードを画像に書き込む
- Method: GET
- URL: http://localhost:52773/iris-qrbarcode/writeqrbarcodetoimage/1234567891234/test(テンプレート: /writeqrbarcodetoimage/<バーコード番号>/<画像名>)
Postman を使用してバーコード値を読み取る(EAN 128 を試してください - このプロジェクトのサンプルは project-folder/code128.png です)
- Method: POST
- URL:http://localhost:52773/iris-qrbarcode/qrbarcodefromimage
- Body: form-data
- Key: file
- Value: コンピュータ上のファイルを選択します。
Postman を使用して PDF からバーコード値を読み取る(バーコードと QR コード付きの PDF を試してください - プロジェクトのサンプルは project-folder/product.pdf です)
- Method: POST
- URL:http://localhost:52773/iris-qrbarcode/qrbarcodefrompdf
- Body: form-data
- Key: file
- Value: コンピュータ上のファイルを選択します(project-folder/product.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 ダッシュボードの用途も含め、可能性はたくさんありますので、 ぜひ試してみてください!