請求、支払いや領収、アイテムの配送や在庫を処理するアプリケーションでは、バーコードや 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/123456789123...(テンプレート: /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
}
ObjectScriptObjectScript
最初のステップは、目的のタイプ(EAN13)に対応するクラスをコードスニペットからインポートすることです。
from barcode import EAN13
PythonPython
その後にクラスコンストラクターを呼び出し、生成する数値と ImageWriter を渡します。
my_code = EAN13(number, writer=ImageWriter())
PythonPython
画像からバーコードを読み取るソースコード
バーコードと 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)
}
ObjectScriptObjectScript
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)
}
ObjectScriptObjectScript
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")
PythonPython
まとめ
組み込み Python を使用すると、REST API の形態であっても、相互運用性本番環境であっても、あらゆるシナリオにおいて IRIS アプリケーションでバーコードと QR コードを簡単に読み取ることができます。 Python でプロシージャを作成し、テーブルからバーコードにデータを変更することも可能です。 IRIS Analytics ダッシュボードの用途も含め、可能性はたくさんありますので、 ぜひ試してみてください!