pao_barcode

Pure Python バーコード生成ライブラリ ユーザーズマニュアル

pip install ひとつで、PDF帳票にも画像にもSVGにも。19種のバーコードを Pure Python で。


バージョン 1.1

2026年2月


有限会社 パオ・アット・オフィス

https://www.pao.ac/


目次

  1. はじめに — pao_barcode の世界へようこそ
  2. 1.1 pao_barcodeとは
  3. 1.2 できること
  4. 1.3 対応バーコード一覧(19種)
  5. 1.4 3つの出力方式
  6. 1.5 他のBarcode.Python製品との違い
  7. 1.6 デモサイト

  8. インストール — 3行で準備完了

  9. 2.1 基本インストール
  10. 2.2 オプション依存パッケージ
  11. 2.3 動作確認

  12. クイックスタート — 最初の1本を生成しよう

  13. 3.1 エンコーダーとレンダラー
  14. 3.2 Pillowで画像出力
  15. 3.3 ReportLabでPDF出力
  16. 3.4 SVGベクター出力(レンダラー不要)

  17. ReportLab帳票ガイド — PDFにバーコードを直接描こう

  18. 4.1 ReportLabRendererの基本
  19. 4.2 実例1: 納品書
  20. 4.3 実例2: 商品ラベル一括印刷
  21. 4.4 実例3: コンビニ払込票
  22. 4.5 実例4: 配送伝票(QR + 1D複合)
  23. 4.6 実例5: 在庫管理帳票
  24. 4.7 座標系とサイズ
  25. 4.8 日本語フォント

  26. Pillow画像出力ガイド — PNG・JPEG・透明背景まで

  27. 5.1 PillowRendererの基本
  28. 5.2 ファイル出力(PNG / JPEG / BMP)
  29. 5.3 Base64出力(Webアプリ向け)
  30. 5.4 既存画像への描画
  31. 5.5 透明背景のバーコード
  32. 5.6 色のカスタマイズ

  33. サンプルコード集 — 全19種を動かそう

  34. 6.1 1次元バーコード
  35. 6.2 2次元バーコード
  36. 6.3 GS1系バーコード
  37. 6.4 郵便カスタマバーコード
  38. 6.5 Webフレームワーク連携

  39. APIリファレンス

  40. 7.1 共通メソッド(全バーコード)
  41. 7.2 1次元バーコード共通メソッド
  42. 7.3 〜 7.18 各バーコードタイプ
  43. 7.19 〜 7.21 2次元バーコード
  44. 7.22 ReportLabRenderer
  45. 7.23 PillowRenderer

  46. 動作環境

  47. ライセンス・お問い合わせ

  48. 9.1 使用許諾
  49. 9.2 ライセンス

1. はじめに — pao_barcode の世界へようこそ

1.1 pao_barcodeとは

pao_barcode は、Pure Python で書かれたバーコード生成ライブラリです。

C++で開発された高性能バーコードエンジンを Python に忠実に移植。全19種類のバーコードに対応し、PDF帳票への直接描画PNG/JPEG画像出力SVGベクター出力の3つの出力方式をサポートしています。

Pure Python だから、C拡張のコンパイルもNode.jsのインストールも不要。pip install ひとつで、Windows でも macOS でも Linux でも、すぐに使い始められます。

# たったこれだけで、バーコード入りのPDFが完成します
from reportlab.pdfgen import canvas
from pao_barcode import Code128
from pao_barcode.renderers import ReportLabRenderer

c = canvas.Canvas("hello_barcode.pdf")
renderer = ReportLabRenderer(c)
renderer.draw(Code128(), "Hello-2024", x=50, y=700, width=200, height=50)
c.save()

1.2 できること

pao_barcode を使うと、こんなことができます:

やりたいこと 方法 必要なもの
PDF帳票にバーコードを直接描画 ReportLabRenderer + reportlab
PNG/JPEG画像ファイルを生成 PillowRenderer + Pillow
Base64文字列でWebに表示 PillowRenderer + Pillow
SVGベクター画像を生成 エンコーダー内蔵 追加パッケージ不要
既存のPIL画像にバーコードを合成 PillowRenderer.draw() + Pillow
バーコードのパターンデータだけ取得 encode() / get_pattern() 追加パッケージ不要

ヒント: エンコーダーだけなら外部依存ゼロ。SVG出力もエンコーダーに内蔵されているので、pao_barcode 単体で動きます。ReportLab や Pillow は、PDF描画や画像出力が必要なときだけ追加すればOKです。

1.3 対応バーコード一覧(19種)

1次元バーコード(11種類)

バーコード クラス名 どんなところで使われている?
Code39 Code39 工場の部品ラベル、米軍の物資管理
Code93 Code93 郵便局の仕分け、高密度が必要な場面
Code128 Code128 物流ラベル、医療現場、あらゆる業種で
GS1-128 GS1_128 医薬品のトレーサビリティ、コンビニ払込票
NW-7 (Codabar) NW7 宅配便の送り状、図書館の貸出カード
ITF ITF 段ボール箱の物流管理(集合包装)
Matrix 2of5 Matrix2of5 航空貨物、工業用途
NEC 2of5 NEC2of5 日本国内の工業用途
JAN-8 (EAN-8) JAN8 小さなお菓子、リップクリーム
JAN-13 (EAN-13) JAN13 コンビニ・スーパーの商品コード
UPC-A UPCA 北米のスーパーマーケットで毎日数十億回

UPCバーコード(1種類)

バーコード クラス名 どんなところで使われている?
UPC-E UPCE 小型商品(UPC-Aのゼロ圧縮版)

GS1 DataBar(3種類)

バーコード クラス名 どんなところで使われている?
GS1 DataBar 標準型 GS1DataBar14 青果・精肉の量り売りラベル
GS1 DataBar 限定型 GS1DataBarLimited 小さな医薬品パッケージ
GS1 DataBar 拡張型 GS1DataBarExpanded クーポン、有効期限付き商品

2次元バーコード(3種類)

バーコード クラス名 どんなところで使われている?
QRコード QR スマホ決済、Webサイト誘導、名刺
DataMatrix DataMatrix 電子部品の刻印、手術器具のマーキング
PDF417 PDF417 運転免許証、航空券の搭乗券

特殊バーコード(1種類)

バーコード クラス名 どんなところで使われている?
郵便カスタマバーコード YubinCustomer DMハガキの住所仕分け自動化

ヒント: 「どのバーコードを使えばいいかわからない」という方へ。迷ったらまず Code128(1D)か QRコード(2D)から始めてみてください。この2つでほとんどのユースケースをカバーできます。

1.4 3つの出力方式

pao_barcode は「エンコーダー」と「レンダラー」が分離された設計です。エンコーダーがバーコードデータを計算し、レンダラーがそれを可視化します。

出力方式 レンダラー 出力形式 主な用途
PDF帳票 ReportLabRenderer PDF(ReportLabキャンバスに直接描画) 納品書、請求書、ラベル印刷
画像 PillowRenderer PNG / JPEG / BMP / Base64 Webアプリ、画像ファイル
SVG エンコーダー内蔵 SVGベクター画像 高品質印刷、Web表示

ヒント: PDF帳票に直接描画できる ReportLabRenderer は、pao_barcode の最大の強み。「画像をPDFに貼り付ける」のではなく、ベクターデータとして直接描画するため、どんな解像度でもくっきり。しかも、テキスト選択も可能です。

1.5 他のBarcode.Python製品との違い

パオ・アット・オフィスの Python バーコードライブラリには3種類あります:

比較項目 Pure Python版 (ソースコード付) (本製品) C++ Import WASM版 C++ Import Native版
パッケージ名 pao_barcode barcode-pao-wasm barcode-pao-native
実装 Pure Python C++ → WebAssembly C++ → pybind11
環境依存 なし Node.js必要 C++ビルド環境必要
PDF帳票描画 ReportLabRenderer -- --
Pillow連携 PillowRenderer -- --
SVG出力 エンコーダー内蔵 あり あり
ソースコード 付属 なし なし
バーコード種類 19種 18種 18種
価格(税込) 22,000円 11,000円 11,000円

Pure Python版を選ぶ理由:

ヒント: 「PDF帳票にバーコードを入れたい」なら Pure Python版 (pao_barcode) 一択です。ReportLab のキャンバスに直接描画できるのは、この製品だけ。納品書、請求書、ラベル、コンビニ払込票 — あらゆる業務帳票に対応します。

1.6 デモサイト

実際の動作をブラウザで確認できるデモサイトを公開しています:

全19種のバーコード生成、PDF帳票出力、画像出力をお試しいただけます。


2. インストール — 3行で準備完了

2.1 基本インストール

pip install pao_barcode

これだけです。Pure Python なので、プラットフォーム固有のビルドは不要。

要件: - Python 3.8 以上 - Windows / macOS / Linux

2.2 オプション依存パッケージ

用途に応じて追加インストールしてください:

ReportLab(PDF帳票出力に必要)

pip install reportlab

PDF帳票のキャンバスにバーコードを直接描画する ReportLabRenderer を使うために必要です。

Pillow(画像出力に必要)

pip install Pillow

PNG/JPEG/BMP画像を出力する PillowRenderer を使うために必要です。

全部入りインストール

pip install pao_barcode reportlab Pillow

ヒント: エンコーダー(encode() / get_pattern())とSVG出力だけなら、pao_barcode 単体で動きます。ReportLab や Pillow は必要になったときに追加すれば大丈夫。

2.3 動作確認

import pao_barcode
print(pao_barcode.__version__)  # '1.0.0'

# エンコーダーの動作確認(外部依存なし)
from pao_barcode import Code128
bc = Code128()
pattern = bc.encode("TEST1234")
print(f"Code128 パターン: {len(pattern)} 要素")
# → Code128 パターン: 33 要素

# QRコードの動作確認
from pao_barcode import QR
qr = QR()
matrix = qr.get_pattern("Hello World")
print(f"QRコード: {len(matrix)}x{len(matrix[0])} モジュール")
# → QRコード: 25x25 モジュール

3. クイックスタート — 最初の1本を生成しよう

3.1 エンコーダーとレンダラー

pao_barcode は エンコーダー(バーコードデータの計算)と レンダラー(描画)を分離した設計です。エンコーダーが「バーの並び」を計算し、レンダラーがそれを「目に見える画像やPDF」にします。

from pao_barcode import Code128, QR, JAN13

# --- 1Dバーコード ---
# encode() → バーとスペースの幅が交互に並んだリスト
bc = Code128()
pattern = bc.encode("Hello-2024")
# pattern = [2, 1, 1, 2, 3, 2, ...]  ← bar幅, space幅, bar幅, ... の交互

# --- 2Dバーコード ---
# get_pattern() → 2Dブーリアン行列
qr = QR()
matrix = qr.get_pattern("https://www.pao.ac/")
# matrix[row][col] = True(黒) or False(白)

# --- JAN/UPCバーコード ---
jan = JAN13()
pattern = jan.encode("4901234567894")

エンコーダーの出力は数値データだけ。描画には ReportLabRenderer(PDF用)か PillowRenderer(画像用)を使います。

ヒント: エンコーダーの出力を独自のレンダラーで描画することも可能です。たとえば encode() の結果を使って、自前のCanvasやSVG描画ロジックに組み込めます。

3.2 Pillowで画像出力

from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()
bc = Code128()

# PIL Image を生成
img = renderer.render(bc, "Hello-2024", width=400, height=100)
img.show()  # 画像ビューアーで表示

# PNG ファイルに保存
renderer.render_to_file(bc, "Hello-2024", "barcode.png", 400, 100)

# Base64 文字列(Webアプリ向け)
data_uri = renderer.render_to_base64(bc, "Hello-2024", 400, 100)
html = f'<img src="{data_uri}">'

3.3 ReportLabでPDF出力

from reportlab.pdfgen import canvas
from pao_barcode import Code128
from pao_barcode.renderers import ReportLabRenderer

# ReportLab キャンバスを作成
c = canvas.Canvas("barcode.pdf")

# レンダラーを作成し、キャンバスに紐付ける
renderer = ReportLabRenderer(c)

# バーコードをPDF上に描画
bc = Code128()
renderer.draw(bc, "Hello-2024", x=50, y=700, width=200, height=50)

# PDFを保存
c.save()

ヒント: ReportLabRenderer は PDF のキャンバスにベクターデータとして直接描画します。画像を貼り付けるのとは違い、拡大してもくっきり、ファイルサイズも小さい。業務帳票にバーコードを入れるなら、これがベストプラクティスです。

3.4 SVGベクター出力(レンダラー不要)

SVG出力はエンコーダー単体で行えます。レンダラーは不要です。

from pao_barcode import Code128

bc = Code128()
bc.set_output_format("svg")    # SVGモードに切り替え
bc.set_show_text(True)

# 描画実行 → SVG文字列を取得
bc.draw("Hello-2024", 0, 0, 400, 100)
svg_string = bc.get_svg()

# ファイルに保存
with open("barcode.svg", "w", encoding="utf-8") as f:
    f.write(svg_string)

ヒント: SVG出力は追加パッケージ不要。Webページへの埋め込みや、Illustratorでの編集など、ベクターデータが欲しいときに便利です。


4. ReportLab帳票ガイド — PDFにバーコードを直接描こう

pao_barcode の最大の強み、それは ReportLab で作成するPDF帳票にバーコードを直接描画できること。このセクションでは、実際の業務帳票を想定した5つの実践コードを紹介します。

4.1 ReportLabRendererの基本

from reportlab.pdfgen import canvas
from pao_barcode import Code128
from pao_barcode.renderers import ReportLabRenderer

# 1. ReportLab のキャンバスを作成
c = canvas.Canvas("output.pdf")

# 2. ReportLabRenderer を作成(キャンバスを渡す)
renderer = ReportLabRenderer(c)

# 3. バーコードエンコーダーを用意
bc = Code128()

# 4. 描画: draw(エンコーダー, データ, x, y, 幅, 高さ)
renderer.draw(bc, "1234567890", x=50, y=700, width=200, height=50)

# 5. 複数のバーコードを同じページに描画できる
from pao_barcode import QR
qr = QR()
renderer.draw(qr, "https://www.pao.ac/", x=50, y=600, width=80, height=80)

# 6. PDFを保存
c.save()

座標系について: - ReportLab の座標系は 原点が左下Y軸が上向き です - (x, y) はバーコード描画領域の 左下隅 を指定します - 単位は ポイント(1ポイント = 1/72インチ) - A4用紙は 595 x 842 ポイント

ReportLabRendererのオプション:

renderer = ReportLabRenderer(
    c,
    fore_color=(0, 0, 0),        # 前景色 (R,G,B) 0-255。デフォルト: 黒
    back_color=(255, 255, 255),   # 背景色 (R,G,B) or None(透明)。デフォルト: 白
    show_text=True,               # テキスト表示。デフォルト: True
    font_name='Helvetica',        # フォント名。デフォルト: 'Helvetica'
    font_size=8,                  # フォントサイズ(pt)。デフォルト: 8
    quiet_zone=0.05,              # クワイエットゾーン比率。デフォルト: 0.05 (5%)
)

ヒント: 1つの ReportLabRenderer インスタンスで、同じページに何種類ものバーコードを描画できます。エンコーダーを切り替えるだけ。

4.2 実例1: 納品書

注文番号のバーコードとQRコードを含む納品書PDFです。Code128で注文番号を、QRコードで問い合わせURLを埋め込みます。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from pao_barcode import Code128, QR
from pao_barcode.renderers import ReportLabRenderer

def create_delivery_note(file_path, order_no, items):
    """納品書PDFを生成する"""
    page_w, page_h = A4
    c = canvas.Canvas(file_path, pagesize=A4)
    renderer = ReportLabRenderer(c, font_size=7)

    # --- ヘッダー ---
    c.setFont("Helvetica-Bold", 18)
    c.drawCentredString(page_w / 2, page_h - 40, "納 品 書")

    c.setFont("Helvetica", 10)
    c.drawString(50, page_h - 70, f"注文番号: {order_no}")
    c.drawString(50, page_h - 85, "発行日: 2026-02-05")

    # --- 注文番号のバーコード(右上に配置)---
    bc = Code128()
    renderer.draw(bc, order_no,
                  x=page_w - 220, y=page_h - 100,
                  width=180, height=45)

    # --- 明細テーブル ---
    y = page_h - 130
    c.setFont("Helvetica-Bold", 9)
    c.drawString(50, y, "商品コード")
    c.drawString(200, y, "商品名")
    c.drawString(400, y, "数量")
    c.drawString(470, y, "単価")
    c.line(50, y - 5, 545, y - 5)

    c.setFont("Helvetica", 9)
    y -= 20
    total = 0
    for code, name, qty, price in items:
        c.drawString(50, y, code)
        c.drawString(200, y, name)
        c.drawString(400, y, str(qty))
        c.drawString(470, y, f"¥{price:,}")
        total += qty * price
        y -= 15

    c.line(50, y, 545, y)
    y -= 20
    c.setFont("Helvetica-Bold", 11)
    c.drawString(400, y, f"合計: ¥{total:,}")

    # --- QRコード(問い合わせ用URL)---
    qr = QR()
    renderer.draw(qr, f"https://www.example.com/orders/{order_no}",
                  x=50, y=50, width=60, height=60)
    c.setFont("Helvetica", 7)
    c.drawString(50, 40, "問い合わせはこちら")

    c.save()

# 使用例
items = [
    ("4901234567894", "商品A", 3, 1500),
    ("4912345678904", "商品B", 1, 2800),
    ("4923456789014", "商品C", 5, 680),
]
create_delivery_note("delivery_note.pdf", "ORD-2026-00123", items)

4.3 実例2: 商品ラベル一括印刷

複数の JAN コードラベルを1枚のA4用紙に並べて印刷します。ラベルシートへの印刷に最適。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from pao_barcode import JAN13
from pao_barcode.renderers import ReportLabRenderer

def create_product_labels(file_path, products, cols=3, rows=8):
    """商品ラベルをA4用紙に一括印刷する"""
    page_w, page_h = A4
    c = canvas.Canvas(file_path, pagesize=A4)
    renderer = ReportLabRenderer(c, font_size=6, quiet_zone=0.03)

    jan = JAN13()

    # ラベルサイズの計算
    margin_x, margin_y = 15 * mm, 15 * mm
    label_w = (page_w - 2 * margin_x) / cols
    label_h = (page_h - 2 * margin_y) / rows

    for i, (jan_code, product_name, price) in enumerate(products):
        # ページ送り
        page_idx = i // (cols * rows)
        idx_in_page = i % (cols * rows)
        if idx_in_page == 0 and i > 0:
            c.showPage()

        col = idx_in_page % cols
        row = idx_in_page // cols

        # ラベル左下座標
        lx = margin_x + col * label_w
        ly = page_h - margin_y - (row + 1) * label_h

        # 商品名
        c.setFont("Helvetica", 7)
        c.drawString(lx + 5, ly + label_h - 12, product_name)

        # 価格
        c.setFont("Helvetica-Bold", 9)
        c.drawString(lx + 5, ly + label_h - 24, f"¥{price:,}")

        # JANバーコード
        renderer.draw(jan, jan_code,
                      x=lx + 5, y=ly + 3,
                      width=label_w - 10, height=30)

    c.save()

# 使用例
products = [
    ("4901234567894", "ミネラルウォーター 500ml", 98),
    ("4912345678904", "おにぎり 鮭", 130),
    ("4923456789014", "サンドイッチ ハム", 248),
    ("4934567890124", "牛乳 1L", 198),
    ("4945678901234", "食パン 6枚切", 158),
    ("4956789012344", "ヨーグルト 400g", 148),
    # ... 必要なだけ追加
]
create_product_labels("product_labels.pdf", products)

ヒント: colsrows を変えるだけで、ラベルシートのレイアウトを自由に調整できます。市販のラベル用紙(エーワン等)のサイズに合わせてカスタマイズしてみてください。

4.4 実例3: コンビニ払込票

GS1-128 コンビニバーコードを含む払込票です。draw_gs1_128_convenience メソッドを使うと、2行テキスト(金額情報行 + 企業コード行)を自動生成します。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from pao_barcode import GS1_128
from pao_barcode.renderers import ReportLabRenderer

def create_convenience_slip(file_path, payment_data):
    """コンビニ払込票PDFを生成する"""
    page_w, page_h = A4
    c = canvas.Canvas(file_path, pagesize=A4)
    renderer = ReportLabRenderer(c, font_size=7)

    # --- 帳票タイトル ---
    c.setFont("Helvetica-Bold", 14)
    c.drawCentredString(page_w / 2, page_h - 50, "払込取扱票")

    # --- 払込先情報 ---
    y = page_h - 90
    c.setFont("Helvetica", 10)
    c.drawString(50, y, f"払込先: {payment_data['payee']}")
    c.drawString(50, y - 18, f"金額: ¥{payment_data['amount']:,}")
    c.drawString(50, y - 36, f"支払期限: {payment_data['due_date']}")

    # --- コンビニバーコード ---
    gs1 = GS1_128()
    barcode_data = payment_data['barcode_data']

    # draw_gs1_128_convenience で2行テキスト付きのコンビニバーコードを描画
    renderer.draw_gs1_128_convenience(
        gs1, barcode_data,
        x=50, y=page_h - 220,
        width=page_w - 100, height=80
    )

    # --- 切り取り線 ---
    c.setDash(3, 3)
    c.line(30, page_h - 250, page_w - 30, page_h - 250)
    c.setDash()

    c.save()

# 使用例
payment_data = {
    'payee': '○○株式会社',
    'amount': 12500,
    'due_date': '2026-03-31',
    'barcode_data': '{FNC1}9191234500000000000000452087500401310029500',
}
create_convenience_slip("convenience_slip.pdf", payment_data)

ヒント: コンビニバーコードのデータは {FNC1} + 43桁の数字です。44桁目のチェックディジットは自動計算されます。44桁すべてを渡しても構いません。

4.5 実例4: 配送伝票(QR + 1D複合)

1つの帳票にQRコードとCode128を組み合わせた配送伝票。追跡番号をCode128で、追跡URLをQRコードで表現します。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from pao_barcode import Code128, QR
from pao_barcode.renderers import ReportLabRenderer

def create_shipping_label(file_path, shipment):
    """配送伝票PDFを生成する"""
    page_w, page_h = A4
    c = canvas.Canvas(file_path, pagesize=A4)
    renderer = ReportLabRenderer(c)

    # --- 伝票枠 ---
    c.rect(40, page_h - 350, page_w - 80, 310)

    # --- タイトル ---
    c.setFont("Helvetica-Bold", 14)
    c.drawString(50, page_h - 60, "配送伝票")

    # --- 送り先 ---
    c.setFont("Helvetica", 10)
    y = page_h - 90
    c.drawString(50, y, f"送り先: {shipment['to_name']}")
    c.drawString(50, y - 15, f"住所: {shipment['to_address']}")
    c.drawString(50, y - 30, f"TEL: {shipment['to_tel']}")

    # --- 依頼主 ---
    y -= 55
    c.drawString(50, y, f"依頼主: {shipment['from_name']}")
    c.drawString(50, y - 15, f"住所: {shipment['from_address']}")

    # --- 配送番号バーコード(Code128)---
    bc = Code128()
    renderer.draw(bc, shipment['tracking_no'],
                  x=50, y=page_h - 270,
                  width=280, height=50)

    # --- QRコード(追跡URL)---
    qr = QR()
    track_url = f"https://track.example.com/{shipment['tracking_no']}"
    renderer.draw(qr, track_url,
                  x=page_w - 150, y=page_h - 280,
                  width=100, height=100)

    c.setFont("Helvetica", 6)
    c.drawCentredString(page_w - 100, page_h - 290, "追跡はこちら")

    # --- 日付 ---
    c.setFont("Helvetica", 8)
    c.drawString(50, page_h - 330, f"発送日: {shipment['ship_date']}")

    c.save()

# 使用例
shipment = {
    'tracking_no': '1234-5678-9012',
    'to_name': '山田太郎',
    'to_address': '東京都千代田区丸の内1-1-1',
    'to_tel': '03-1234-5678',
    'from_name': '佐藤商事株式会社',
    'from_address': '大阪府大阪市北区梅田2-2-2',
    'ship_date': '2026-02-05',
}
create_shipping_label("shipping_label.pdf", shipment)

4.6 実例5: 在庫管理帳票

DataMatrix と Code128 を組み合わせた在庫管理帳票。管理番号をCode128で、GS1コードをDataMatrixで表現します。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from pao_barcode import Code128, DataMatrix
from pao_barcode.renderers import ReportLabRenderer

def create_inventory_report(file_path, inventory_items):
    """在庫管理帳票PDFを生成する"""
    page_w, page_h = A4
    c = canvas.Canvas(file_path, pagesize=A4)
    renderer = ReportLabRenderer(c, font_size=6)

    bc = Code128()
    dm = DataMatrix()

    # --- タイトル ---
    c.setFont("Helvetica-Bold", 14)
    c.drawCentredString(page_w / 2, page_h - 40, "在庫管理表")
    c.setFont("Helvetica", 8)
    c.drawString(page_w - 150, page_h - 40, "2026-02-05 現在")

    # --- テーブルヘッダー ---
    y = page_h - 75
    c.setFont("Helvetica-Bold", 8)
    headers = [
        (50, "管理番号"),
        (130, "バーコード"),
        (270, "GS1コード"),
        (355, "品名"),
        (460, "数量"),
        (510, "棚番"),
    ]
    for hx, label in headers:
        c.drawString(hx, y, label)
    c.line(45, y - 5, 555, y - 5)

    # --- 明細行 ---
    c.setFont("Helvetica", 7)
    y -= 8
    row_h = 35

    for item_no, gs1_code, name, qty, location in inventory_items:
        y -= row_h

        # 管理番号テキスト
        c.drawString(50, y + 18, item_no)

        # Code128 バーコード
        renderer.draw(bc, item_no,
                      x=125, y=y + 2, width=130, height=28,
                      show_text=False)

        # DataMatrix(GS1コード埋め込み)
        renderer.draw(dm, gs1_code,
                      x=270, y=y + 2, width=28, height=28)

        # 品名・数量・棚番
        c.drawString(355, y + 18, name)
        c.drawString(460, y + 18, str(qty))
        c.drawString(510, y + 18, location)

        c.line(45, y - 2, 555, y - 2)

    c.save()

# 使用例
inventory = [
    ("INV-001", "01049012345678941021ABC", "ミネラルウォーター 500ml", 240, "A-1-3"),
    ("INV-002", "01049123456789041021DEF", "おにぎり 鮭", 80, "B-2-1"),
    ("INV-003", "01049234567890141021GHI", "サンドイッチ ハム", 45, "B-2-2"),
    ("INV-004", "01049345678901241021JKL", "牛乳 1L", 120, "C-1-1"),
]
create_inventory_report("inventory_report.pdf", inventory)

ヒント: show_text=Falsedraw() に渡すと、バーコード下のテキストを一時的に非表示にできます。テーブル内など、スペースが限られている場面で便利。

4.7 座標系とサイズ

ReportLab の座標系:

(0, 842) ─────────────────── (595, 842)    ← A4用紙の上端
    │                              │
    │     (50, 700)                │
    │     ┌──────────────┐         │
    │     │  バーコード    │         │     ← draw(bc, data, 50, 700, 200, 50)
    │     │              │         │        バーコードの左下隅 = (50, 700)
    │     └──────────────┘         │        幅200pt, 高さ50pt
    │     (50, 750)                │
    │                              │
(0, 0) ─────────────────── (595, 0)      ← A4用紙の下端(原点)

よく使うページサイズ:

サイズ ポイント mm換算
A4 595 x 842 210 x 297
A3 842 x 1190 297 x 420
B5 516 x 729 182 x 257
Letter 612 x 792 216 x 279

mm → ポイント変換:

from reportlab.lib.units import mm
x = 20 * mm   # 20mm → 約56.7ポイント

4.8 日本語フォント

ReportLab で日本語テキストを表示するには、フォントの登録が必要です。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# 日本語フォントを登録(例: MS ゴシック)
pdfmetrics.registerFont(TTFont('MSGothic', 'msgothic.ttc'))

c = canvas.Canvas("japanese.pdf")
c.setFont("MSGothic", 12)
c.drawString(50, 700, "日本語テキストの例")

# バーコードのテキスト表示にも日本語フォントを使う場合
from pao_barcode import Code128
from pao_barcode.renderers import ReportLabRenderer

renderer = ReportLabRenderer(c, font_name='MSGothic', font_size=8)
bc = Code128()
renderer.draw(bc, "ABC-123", x=50, y=600, width=200, height=50)

c.save()

5. Pillow画像出力ガイド — PNG・JPEG・透明背景まで

5.1 PillowRendererの基本

from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()
bc = Code128()

# PIL Image として生成
img = renderer.render(bc, "Hello-2024", width=400, height=100)
img.show()   # 表示
img.save("barcode.png")  # 保存(PIL標準メソッド)

PillowRendererのオプション:

renderer = PillowRenderer(
    fore_color=(0, 0, 0),        # 前景色 (R,G,B) 0-255。デフォルト: 黒
    back_color=(255, 255, 255),   # 背景色 (R,G,B) or None(透明)。デフォルト: 白
    show_text=True,               # テキスト表示。デフォルト: True
    font_path=None,               # TrueTypeフォントパス。デフォルト: 自動検索
    font_size=14,                 # フォントサイズ(px)。デフォルト: 14
    quiet_zone=0.05,              # クワイエットゾーン比率。デフォルト: 0.05 (5%)
)

座標系: Pillow は原点が左上、Y軸は下向きです。

5.2 ファイル出力(PNG / JPEG / BMP)

from pao_barcode import QR
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()
qr = QR()

# PNG (デフォルト)
renderer.render_to_file(qr, "https://www.pao.ac/", "qr.png", 300, 300)

# JPEG
renderer.render_to_file(qr, "https://www.pao.ac/", "qr.jpg", 300, 300, format='JPEG')

# BMP
renderer.render_to_file(qr, "https://www.pao.ac/", "qr.bmp", 300, 300, format='BMP')

5.3 Base64出力(Webアプリ向け)

from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()
bc = Code128()

# data:URI 形式の Base64 文字列
data_uri = renderer.render_to_base64(bc, "HELLO-123", 400, 100)
# → "data:image/png;base64,iVBORw0KGgo..."

# HTMLに埋め込み
html = f'<img src="{data_uri}" alt="barcode">'

# バイト列として取得
png_bytes = renderer.render_to_bytes(bc, "HELLO-123", 400, 100)
# → b'\x89PNG\r\n\x1a\n...'

# JPEG バイト列
jpeg_bytes = renderer.render_to_bytes(bc, "HELLO-123", 400, 100, format='JPEG')

ヒント: Flask や FastAPI で <img> タグに直接埋め込むなら render_to_base64()Response で画像を返すなら render_to_bytes() が便利です。

5.4 既存画像への描画

draw() メソッドを使うと、既存の PIL Image にバーコードを描画できます。

from PIL import Image
from pao_barcode import Code128, QR
from pao_barcode.renderers import PillowRenderer

# 既存画像を開く(またはキャンバスを作成)
canvas = Image.new('RGB', (800, 600), (255, 255, 255))

renderer = PillowRenderer()

# 複数のバーコードを1つの画像に配置
bc = Code128()
renderer.draw(canvas, bc, "ITEM-001", x=50, y=50, width=300, height=80)
renderer.draw(canvas, bc, "ITEM-002", x=50, y=160, width=300, height=80)

qr = QR()
renderer.draw(canvas, qr, "https://www.pao.ac/", x=500, y=50, width=200, height=200)

canvas.save("multi_barcode.png")

5.5 透明背景のバーコード

back_color=None で、RGBA モードの透明背景画像を生成します。

from pao_barcode import QR
from pao_barcode.renderers import PillowRenderer

# 透明背景
renderer = PillowRenderer(back_color=None)
qr = QR()

img = renderer.render(qr, "Hello", 200, 200)
# img.mode == 'RGBA'

# PNG で保存(透明度を保持)
img.save("qr_transparent.png")

# 他の画像に合成
from PIL import Image
background = Image.open("background.jpg").convert("RGBA")
background.paste(img, (100, 100), img)  # 第3引数がアルファマスク
background.save("composited.png")

ヒント: 透明背景のバーコードは、名刺やポスターのデザインに重ねるときに便利。背景色を気にせず合成できます。

5.6 色のカスタマイズ

from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

# 紺色のバー + アイボリーの背景
renderer = PillowRenderer(
    fore_color=(0, 0, 128),
    back_color=(255, 255, 240),
)
bc = Code128()
img = renderer.render(bc, "COLOR-TEST", 400, 100)
img.save("color_barcode.png")

# 赤いバー + 透明背景
renderer = PillowRenderer(
    fore_color=(200, 0, 0),
    back_color=None,
)
img = renderer.render(bc, "RED-BARCODE", 400, 100)
img.save("red_barcode.png")

6. サンプルコード集 — 全19種を動かそう

6.1 1次元バーコード

Code39

from pao_barcode import Code39
from pao_barcode.renderers import PillowRenderer

bc = Code39()
bc.show_start_stop = True  # スタート/ストップ文字(*)表示

renderer = PillowRenderer()
renderer.render_to_file(bc, "HELLO-123", "code39.png", 400, 100)

入力可能文字: 数字(0-9)、英大文字(A-Z)、記号(- . $ / + % スペース)

Code93

from pao_barcode import Code93
from pao_barcode.renderers import PillowRenderer

bc = Code93()

renderer = PillowRenderer()
renderer.render_to_file(bc, "Hello123", "code93.png", 400, 100)

入力可能文字: ASCII全文字

Code128

from pao_barcode import Code128, CodeSet128
from pao_barcode.renderers import PillowRenderer

bc = Code128()

# コードモード設定
bc.code_mode = CodeSet128.AUTO    # 自動選択(最短幅、デフォルト)
# bc.code_mode = CodeSet128.CODE_A  # 制御文字 + 数字 + 英大文字
# bc.code_mode = CodeSet128.CODE_B  # 数字 + 英大文字 + 英小文字 + 記号
# bc.code_mode = CodeSet128.CODE_C  # 数字のみ(2桁ずつ高密度)

renderer = PillowRenderer()
renderer.render_to_file(bc, "Hello-2024", "code128.png", 400, 100)

コードモード:

モード 説明
AUTO 自動選択(最短幅になるよう動的計画法で最適化)
CODE_A 制御文字 + 数字 + 英大文字
CODE_B 数字 + 英大文字 + 英小文字 + 記号
CODE_C 数字のみ(2桁ずつの高密度エンコード)

制御文字の入力: {CR}, {LF}, {TAB}, {NUL} など

ヒント: Code128 の AUTO モードは動的計画法で最短幅に最適化します。数字が続く部分は自動的に CODE-C(2桁ペア)に切り替わるので、手動でモード指定する必要はほとんどありません。

NW-7 (Codabar)

from pao_barcode import NW7
from pao_barcode.renderers import PillowRenderer

bc = NW7()
bc.show_start_stop = True  # スタート/ストップコード表示

renderer = PillowRenderer()
renderer.render_to_file(bc, "A1234567A", "nw7.png", 400, 100)

スタート/ストップコード: A, B, C, D

ITF

from pao_barcode import ITF
from pao_barcode.renderers import PillowRenderer

bc = ITF()

renderer = PillowRenderer()
renderer.render_to_file(bc, "1234567890", "itf.png", 400, 100)

入力: 偶数桁の数字のみ。奇数桁の場合は先頭に0が付加されます。

JAN-13 (EAN-13) / JAN-8 (EAN-8)

from pao_barcode import JAN13, JAN8
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()

# JAN-13(12桁指定 → チェックディジット自動計算)
jan13 = JAN13()
renderer.render_to_file(jan13, "490123456789", "jan13.png", 300, 100)

# JAN-8(7桁指定 → チェックディジット自動計算)
jan8 = JAN8()
renderer.render_to_file(jan8, "4901234", "jan8.png", 200, 100)

UPC-A / UPC-E

from pao_barcode import UPCA, UPCE
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()

# UPC-A(11桁指定 → チェックディジット自動計算)
upc_a = UPCA()
renderer.render_to_file(upc_a, "01234567890", "upc_a.png", 300, 100)

# UPC-E(7桁指定 → チェックディジット自動計算)
upc_e = UPCE()
renderer.render_to_file(upc_e, "0425261", "upc_e.png", 200, 100)

6.2 2次元バーコード

QRコード

from pao_barcode import QR
from pao_barcode.renderers import PillowRenderer

qr = QR()
qr.set_error_correction_level("M")  # L/M/Q/H
qr.set_version(0)                    # 0=自動
# qr.set_encode_mode("AUTO")         # AUTO/NUMERIC/ALPHANUMERIC/BYTE/KANJI

renderer = PillowRenderer()
renderer.render_to_file(qr, "https://www.pao.ac/", "qr.png", 300, 300)

誤り訂正レベル:

レベル 復元能力 用途
L 約7% データ量優先
M 約15% 標準(推奨)
Q 約25% 品質重視
H 約30% 最高品質(ロゴ埋め込み等)

バージョン: 1〜40。0を指定するとデータに応じて自動選択。

DataMatrix

from pao_barcode import DataMatrix
from pao_barcode.renderers import PillowRenderer

dm = DataMatrix()
dm.set_code_size("AUTO")         # AUTO / 10x10 / ... / 144x144
dm.set_encode_scheme("AUTO")     # AUTO / ASCII / C40 / TEXT / X12 / EDIFACT / BASE256

renderer = PillowRenderer()
renderer.render_to_file(dm, "Hello World 123", "datamatrix.png", 200, 200)

コードサイズ: - 正方形: 10x10, 12x12, 14x14, 16x16, 18x18, 20x20, 22x22, 24x24, 26x26, 32x32, 36x36, 40x40, 44x44, 48x48, 52x52, 64x64, 72x72, 80x80, 88x88, 96x96, 104x104, 120x120, 132x132, 144x144 - 長方形: 8x18, 8x32, 12x26, 12x36, 16x36, 16x48

PDF417

from pao_barcode import PDF417
from pao_barcode.renderers import PillowRenderer

pdf = PDF417()
pdf.set_error_level(2)        # 0〜8 (-1=自動)
pdf.set_columns(4)            # 列数
pdf.set_rows(0)               # 行数 (0=自動)
pdf.set_aspect_ratio(3.0)     # 縦横比
pdf.set_y_height(3)           # Y方向の高さ

renderer = PillowRenderer()
renderer.render_to_file(pdf, "PDF417 Sample Data", "pdf417.png", 400, 150)

6.3 GS1系バーコード

GS1-128

from pao_barcode import GS1_128
from pao_barcode.renderers import PillowRenderer

gs1 = GS1_128()
renderer = PillowRenderer()

# 通常描画({FNC1} と {AI} を使用)
data = "{FNC1}0100012345678905{AI}10ABC123"
renderer.render_to_file(gs1, data, "gs1_128.png", 500, 120)

特殊文字:

記法 意味
{FNC1} ファンクション1(可変長フィールドの区切り)
{AI} AI括弧表示(テキスト表示のみ、エンコードには影響しない)

GS1-128 コンビニバーコード

from pao_barcode import GS1_128
from pao_barcode.renderers import PillowRenderer

gs1 = GS1_128()
renderer = PillowRenderer()

# コンビニバーコード専用メソッド
# {FNC1} + 43桁(44桁目のチェックディジットは自動計算)
data = "{FNC1}9191234500000000000000452087500401310029500"
renderer.draw_gs1_128_convenience(
    renderer.render(gs1, data, 500, 120),  # 一旦画像を生成
    gs1, data,
    x=0, y=0, width=500, height=120
)

# ReportLab で直接描画する場合はより簡単:
from reportlab.pdfgen import canvas
from pao_barcode.renderers import ReportLabRenderer

c = canvas.Canvas("convenience.pdf")
rl_renderer = ReportLabRenderer(c, font_size=7)
rl_renderer.draw_gs1_128_convenience(
    gs1, data, x=50, y=700, width=400, height=80
)
c.save()

GS1 DataBar 標準型

from pao_barcode import GS1DataBar14, DataBar14SymbolType
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()

# OMNIDIRECTIONAL(標準型)
db = GS1DataBar14(symbol_type=DataBar14SymbolType.OMNIDIRECTIONAL)
renderer.render_to_file(db, "1234567890128", "databar14_omni.png", 200, 80)

# STACKED(二層型)
db = GS1DataBar14(symbol_type=DataBar14SymbolType.STACKED)
renderer.render_to_file(db, "1234567890128", "databar14_stacked.png", 200, 80)

# STACKED_OMNIDIRECTIONAL(標準二層型)
db = GS1DataBar14(symbol_type=DataBar14SymbolType.STACKED_OMNIDIRECTIONAL)
renderer.render_to_file(db, "1234567890128", "databar14_stacked_omni.png", 200, 80)

GS1 DataBar 限定型

from pao_barcode import GS1DataBarLimited
from pao_barcode.renderers import PillowRenderer

db = GS1DataBarLimited()
renderer = PillowRenderer()

# 先頭ディジットは 0 または 1 のみ
renderer.render_to_file(db, "0123456789012", "databar_limited.png", 200, 80)

GS1 DataBar 拡張型

from pao_barcode import GS1DataBarExpanded, ExpandedSymbolType
from pao_barcode.renderers import PillowRenderer

renderer = PillowRenderer()

# 一層型(UNSTACKED)
db = GS1DataBarExpanded(symbol_type=ExpandedSymbolType.UNSTACKED)
renderer.render_to_file(
    db, "0100012345678905{AI}10ABC123",
    "databar_expanded.png", 500, 80
)

# 多層型(STACKED)
db = GS1DataBarExpanded(
    symbol_type=ExpandedSymbolType.STACKED,
    num_columns=4
)
renderer.render_to_file(
    db, "0100012345678905{AI}10ABC123",
    "databar_expanded_stacked.png", 300, 120
)

6.4 郵便カスタマバーコード

from pao_barcode import YubinCustomer
from pao_barcode.renderers import PillowRenderer

yubin = YubinCustomer()
renderer = PillowRenderer(show_text=False)

# 郵便番号 + 住所表示番号(ハイフン区切り可)
renderer.render_to_file(yubin, "264-0025-1-2-503", "yubin.png", 400, 60)

入力形式: 郵便番号7桁 + 住所表示番号 注意: 郵便カスタマバーコードにはテキスト表示機能はありません(4-state バーのみ)。

6.5 Webフレームワーク連携

Flask

from flask import Flask, Response, jsonify
from pao_barcode import Code128, QR
from pao_barcode.renderers import PillowRenderer

app = Flask(__name__)

@app.route("/barcode/<code>")
def barcode_png(code):
    """Code128バーコードをPNG画像として返す"""
    renderer = PillowRenderer()
    bc = Code128()
    png_bytes = renderer.render_to_bytes(bc, code, 400, 100)
    return Response(png_bytes, mimetype="image/png")

@app.route("/qr/<data>")
def qr_png(data):
    """QRコードをPNG画像として返す"""
    renderer = PillowRenderer()
    qr = QR()
    qr.set_error_correction_level("M")
    png_bytes = renderer.render_to_bytes(qr, data, 300, 300)
    return Response(png_bytes, mimetype="image/png")

@app.route("/barcode-base64/<code>")
def barcode_base64(code):
    """Base64文字列をJSON APIとして返す"""
    renderer = PillowRenderer()
    bc = Code128()
    data_uri = renderer.render_to_base64(bc, code, 400, 100)
    return jsonify({"barcode": data_uri})

if __name__ == "__main__":
    app.run()

Django

# views.py
from django.http import HttpResponse
from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

def barcode_view(request, code):
    renderer = PillowRenderer()
    bc = Code128()
    png_bytes = renderer.render_to_bytes(bc, code, 400, 100)
    return HttpResponse(png_bytes, content_type="image/png")

FastAPI

from fastapi import FastAPI
from fastapi.responses import Response
from pao_barcode import Code128
from pao_barcode.renderers import PillowRenderer

app = FastAPI()

@app.get("/barcode/{code}")
def barcode(code: str):
    renderer = PillowRenderer()
    bc = Code128()
    png_bytes = renderer.render_to_bytes(bc, code, 400, 100)
    return Response(content=png_bytes, media_type="image/png")

ヒント: Web API として公開する場合、PillowRenderer のインスタンスはリクエストごとに作成するのが安全です。スレッドセーフを気にする必要がありません。


7. APIリファレンス

7.1 共通メソッド(全バーコード)

全てのバーコードクラス(BarcodeBase を継承するクラス)で使用できるメソッドです。

set_output_format(format)

出力形式を設定します(SVGモードの場合に使用)。

パラメータ 説明
format str "png" または "svg"
bc.set_output_format("svg")

デフォルト: "png"


set_foreground_color(r, g, b, a=255)

前景色(バーの色)を設定します。

パラメータ 説明
r int 赤成分(0-255)
g int 緑成分(0-255)
b int 青成分(0-255)
a int 透明度(0-255、255=不透明)。デフォルト: 255
bc.set_foreground_color(0, 0, 128, 255)  # 紺色

デフォルト: (0, 0, 0, 255) (黒)


set_background_color(r, g, b, a=255)

背景色を設定します。

パラメータ 説明
r int 赤成分(0-255)
g int 緑成分(0-255)
b int 青成分(0-255)
a int 透明度(0-255、255=不透明)。デフォルト: 255
bc.set_background_color(255, 255, 240, 255)  # アイボリー

デフォルト: (255, 255, 255, 255) (白)


set_fit_width(fit)

指定幅にフィットさせるかどうかを設定します。

パラメータ 説明
fit bool True: フィットさせる, False: させない
bc.set_fit_width(True)

デフォルト: False


set_px_adjust_black(adjust) / set_px_adjust_white(adjust)

黒バー/白バーのピクセル調整値を設定します。印刷時のにじみ補正に使用します。

パラメータ 説明
adjust int ピクセル調整値
bc.set_px_adjust_black(1)   # 黒バーを1ピクセル太く
bc.set_px_adjust_white(-1)  # 白バーを1ピクセル細く

デフォルト: 0

ヒント: インクジェットプリンターで印刷するとバーがにじんで太くなりがちです。set_px_adjust_black(-1) で微調整すると、スキャナの読み取り精度が上がることがあります。


draw(code, x, y, width, height)

SVGモードでバーコードを描画します。描画結果は get_svg() で取得します。

パラメータ 説明
code str バーコードデータ
x int X座標
y int Y座標
width int 幅(ピクセル)
height int 高さ(ピクセル)
bc.set_output_format("svg")
bc.draw("1234567890", 0, 0, 400, 100)
svg = bc.get_svg()

戻り値: bool


get_svg()

SVGモードで描画した結果をSVG文字列として取得します。

svg_string = bc.get_svg()

戻り値: str (SVG XML文字列)

注意: set_output_format("svg") を設定した後、draw() を呼んでから使用してください。


get_image_base64()

PNGモードで描画した結果をBase64データURI文字列として取得します。

bc.draw("1234567890", 0, 0, 400, 100)
data_uri = bc.get_image_base64()
# → "data:image/png;base64,..."

戻り値: str (data:URI 形式)


7.2 1次元バーコード共通メソッド

1次元バーコードクラス(BarcodeBase1D を継承するクラス)で使用できるメソッドです。

encode(code)

バーコードデータをエンコードし、バー/スペース幅のパターンを返します。

パラメータ 説明
code str バーコードデータ
pattern = bc.encode("1234567890")
# → [2, 1, 1, 2, 3, 2, ...]  ← bar幅, space幅, bar幅, ... の交互

戻り値: List[int] — バーとスペースの幅が交互に並んだリスト(barから開始)


get_pattern(code)

encode() のエイリアスです。同じ結果を返します。


set_show_text(show)

バーコード下の人間可読テキストの表示/非表示を設定します(SVGモード時)。

パラメータ 説明
show bool True: 表示, False: 非表示
bc.set_show_text(True)

デフォルト: True


set_text_font_scale(scale)

テキストのフォントサイズ倍率を設定します。

パラメータ 説明
scale float 倍率(0.5〜2.0等)
bc.set_text_font_scale(1.2)  # 20%拡大

デフォルト: 1.0


set_text_even_spacing(even_spacing)

テキストの均等割り付けを設定します。

パラメータ 説明
even_spacing bool True: 均等割り付け / False: センタリング
bc.set_text_even_spacing(True)   # 均等割り付け
bc.set_text_even_spacing(False)  # センタリング

デフォルト: - JAN/UPC以外の1Dバーコード: True(均等割り付け) - JAN-8, JAN-13, UPC-A, UPC-E: False(ガードバー間配置)

GS1-128 コンビニバーコード(2行テキスト)の場合: - True: 1行目を均等割り付けし、その文字間隔を2行目にも適用 - False: 左寄せで詰めて表示

JAN/UPC での extended_guard との組み合わせ:

extended_guard text_even_spacing 動作
True False 標準表示。ロングバー+セクション間テキスト(デフォルト)
True True ロングバー+セクション間テキストを均等割り付け
False False フラットバー+テキストをセンタリング
False True フラットバー+テキストを均等割り付け

7.3 Code39

クラス: Code39

インポート:

from pao_barcode import Code39

入力可能文字: 数字(0-9)、英大文字(A-Z)、記号(- . $ / + % スペース)

固有属性:

属性 説明 デフォルト
show_start_stop bool スタート/ストップ文字(*)の表示 True

使用例

bc = Code39()
bc.show_start_stop = False  # *を非表示

pattern = bc.encode("HELLO-123")

7.4 Code93

クラス: Code93

インポート:

from pao_barcode import Code93

入力可能文字: ASCII全文字(0x00〜0x7F)

使用例

bc = Code93()
pattern = bc.encode("Hello123")

7.5 Code128

クラス: Code128

インポート:

from pao_barcode import Code128, CodeSet128

入力可能文字: ASCII全文字

固有属性:

属性 説明 デフォルト
code_mode CodeSet128 コードセットモード CodeSet128.AUTO

CodeSet128 列挙値:

説明
CodeSet128.AUTO 自動選択(動的計画法で最短幅に最適化)
CodeSet128.CODE_A 制御文字 + 数字 + 英大文字
CodeSet128.CODE_B 数字 + 英大文字 + 英小文字 + 記号
CodeSet128.CODE_C 数字のみ(2桁ずつの高密度エンコード)

制御文字:

記法 意味
{CR} キャリッジリターン
{LF} ラインフィード
{TAB} タブ
{NUL} NULL

使用例

bc = Code128()
bc.code_mode = CodeSet128.AUTO  # 自動最適化

# 通常の文字列
pattern = bc.encode("Hello-2024")

# 数字のみの場合、AUTO は CODE-C を自動選択(高密度)
pattern = bc.encode("1234567890")

7.6 GS1-128

クラス: GS1_128

インポート:

from pao_barcode import GS1_128

encode(code)

通常のGS1-128バーコードをエンコードします。

パラメータ 説明
code str {FNC1}{AI} を含むデータ文字列

戻り値: List[int]

encode_convenience(code)

コンビニ収納代行用バーコードをエンコードします。

パラメータ 説明
code str {FNC1} + 43桁の数字(44桁目のCDは自動計算)、または {FNC1} + 44桁の数字

戻り値: Tuple[List[int], str] — (パターン, 44桁のデータ文字列)

build_convenience_text_lines(data44)

コンビニバーコードの2行テキストを生成します。

パラメータ 説明
data44 str 44桁のデータ文字列(encode_convenience の戻り値)

戻り値: Tuple[str, str] — (1行目, 2行目)

calc_check_digit_mod10w3(digits) ※staticmethod

モジュラス10ウェイト3のチェックディジットを計算します。

パラメータ 説明
digits str 数字文字列

戻り値: int — チェックディジット(0-9)

特殊文字:

記法 意味
{FNC1} ファンクション1(Code128 の特殊コード 102)
{AI} AI括弧表示用マーカー(テキスト表示のみ)

使用例

gs1 = GS1_128()

# 通常のGS1-128
pattern = gs1.encode("{FNC1}0100012345678905{AI}10ABC123")

# コンビニバーコード
pattern, data44 = gs1.encode_convenience(
    "{FNC1}9191234500000000000000452087500401310029500"
)
line1, line2 = gs1.build_convenience_text_lines(data44)

7.7 NW-7(Codabar)

クラス: NW7

インポート:

from pao_barcode import NW7

入力可能文字: 数字(0-9)、記号(- $ : / . +)、スタート/ストップ(A, B, C, D)

固有属性:

属性 説明 デフォルト
show_start_stop bool スタート/ストップコードの表示 True

使用例

bc = NW7()
bc.show_start_stop = True
pattern = bc.encode("A1234567A")

7.8 ITF

クラス: ITF

インポート:

from pao_barcode import ITF

入力可能文字: 数字(0-9)のみ。偶数桁が必要(奇数桁の場合は先頭に0を付加)。

使用例

bc = ITF()
pattern = bc.encode("1234567890")

7.9 Matrix 2of5

クラス: Matrix2of5

インポート:

from pao_barcode import Matrix2of5

入力可能文字: 数字(0-9)のみ

使用例

bc = Matrix2of5()
pattern = bc.encode("1234567890")

7.10 NEC 2of5

クラス: NEC2of5

インポート:

from pao_barcode import NEC2of5

入力可能文字: 数字(0-9)のみ

使用例

bc = NEC2of5()
pattern = bc.encode("1234567890")

7.11 JAN-8(EAN-8)

クラス: JAN8

インポート:

from pao_barcode import JAN8

入力: 7桁の数字(チェックディジット自動計算)、または8桁(CD含む)

固有属性:

属性 説明 デフォルト
extended_guard bool ガードバー延長(ロングバー+セクション間テキスト) True
text_even_spacing bool テキスト均等割り付け False

使用例

bc = JAN8()
# デフォルト: extended_guard=True, text_even_spacing=False
# → ロングバー付き、セクション間にテキスト配置(標準的なJANバーコード表示)
pattern = bc.encode("4901234")    # 7桁 → CD自動計算
pattern = bc.encode("49012348")   # 8桁(CD含む)

# ガードバーをフラットにする
bc.extended_guard = False

# 均等割り付けに切り替える
bc.text_even_spacing = True

7.12 JAN-13(EAN-13)

クラス: JAN13

インポート:

from pao_barcode import JAN13

入力: 12桁の数字(チェックディジット自動計算)、または13桁(CD含む)

固有属性:

属性 説明 デフォルト
extended_guard bool ガードバー延長(ロングバー+セクション間テキスト) True
text_even_spacing bool テキスト均等割り付け False

使用例

bc = JAN13()
# デフォルト: extended_guard=True, text_even_spacing=False
# → 先頭1桁 + 左6桁 + 右6桁のセクション配置(標準的な商品コード表示)
pattern = bc.encode("490123456789")    # 12桁 → CD自動計算
pattern = bc.encode("4901234567894")   # 13桁(CD含む)

7.13 UPC-A

クラス: UPCA

インポート:

from pao_barcode import UPCA

入力: 11桁の数字(チェックディジット自動計算)、または12桁(CD含む)

固有属性:

属性 説明 デフォルト
extended_guard bool ガードバー延長(ロングバー+セクション間テキスト) True
text_even_spacing bool テキスト均等割り付け False

使用例

bc = UPCA()
# デフォルト: extended_guard=True, text_even_spacing=False
# → 先頭1桁 + 左5桁 + 右5桁 + 末尾1桁のセクション配置
pattern = bc.encode("01234567890")   # 11桁 → CD自動計算

7.14 UPC-E

クラス: UPCE

インポート:

from pao_barcode import UPCE

入力: 7桁または8桁の数字。UPC-Aからのゼロ圧縮形式。

固有属性:

属性 説明 デフォルト
extended_guard bool ガードバー延長(ロングバー+セクション間テキスト) True
text_even_spacing bool テキスト均等割り付け False

使用例

bc = UPCE()
# デフォルト: extended_guard=True, text_even_spacing=False
pattern = bc.encode("0425261")

7.15 GS1 DataBar 標準型

クラス: GS1DataBar14

インポート:

from pao_barcode import GS1DataBar14, DataBar14SymbolType

入力: 13桁のGTIN(チェックディジット含む)または12桁(CD自動計算)

コンストラクタ引数:

パラメータ 説明 デフォルト
symbol_type DataBar14SymbolType シンボルタイプ OMNIDIRECTIONAL

DataBar14SymbolType 列挙値:

説明
OMNIDIRECTIONAL 全方向型(1行)
STACKED 二層型
STACKED_OMNIDIRECTIONAL 全方向二層型

encode(code)

バーコードをエンコードします。STACKED系の場合、patterns および row_heights プロパティに行ごとのパターン情報が格納されます。

戻り値: List[int]

get_human_readable()

人間可読テキスト(GTIN-14形式)を取得します。

戻り値: str

使用例

db = GS1DataBar14(symbol_type=DataBar14SymbolType.OMNIDIRECTIONAL)
elements = db.encode("1234567890128")
text = db.get_human_readable()  # "(01)01234567890128"

7.16 GS1 DataBar 限定型

クラス: GS1DataBarLimited

インポート:

from pao_barcode import GS1DataBarLimited

入力: 先頭ディジットが 0 または 1 のみ。13桁のGTIN。

encode(code)

戻り値: List[int]

get_human_readable()

戻り値: str

使用例

db = GS1DataBarLimited()
elements = db.encode("0123456789012")
text = db.get_human_readable()  # "(01)00123456789012"

7.17 GS1 DataBar 拡張型

クラス: GS1DataBarExpanded

インポート:

from pao_barcode import GS1DataBarExpanded, ExpandedSymbolType

入力: AI付きのデータ文字列

コンストラクタ引数:

パラメータ 説明 デフォルト
symbol_type ExpandedSymbolType シンボルタイプ UNSTACKED
num_columns int 列数(STACKED時) 2

ExpandedSymbolType 列挙値:

説明
UNSTACKED 一層型
STACKED 多層型

encode(code)

バーコードをエンコードします。STACKED の場合、patterns および row_heights プロパティに行ごとのパターン情報が格納されます。

戻り値: List[int]

get_human_readable()

人間可読テキストを取得します。

戻り値: str

使用例

db = GS1DataBarExpanded(
    symbol_type=ExpandedSymbolType.STACKED,
    num_columns=4
)
elements = db.encode("0100012345678905{AI}10ABC123")
text = db.get_human_readable()

7.18 郵便カスタマバーコード

クラス: YubinCustomer

インポート:

from pao_barcode import YubinCustomer

入力形式: 郵便番号7桁(ハイフン可) + 住所表示番号(ハイフン区切り)

encode(code)

4-state バーの配列を返します。

パラメータ 説明
code str 住所データ

戻り値: List[int] — バータイプの配列(67本固定)

バータイプ 意味
1 Long(全高)
2 Semi-long upper(上2/3)
3 Semi-long lower(下2/3)
4 Timing bar(中央1/3)

使用例

yubin = YubinCustomer()
bars = yubin.encode("264-0025-1-2-503")
# bars = [2, 1, 4, 3, ...]  ← 67本の4-stateバー

注意: 郵便カスタマバーコードでは set_show_text, set_text_font_scale はサポートされていません。


7.19 QRコード

クラス: QR

インポート:

from pao_barcode import QR

set_error_correction_level(level)

誤り訂正レベルを設定します。

パラメータ 説明
level str or QRErrorCorrectionLevel "L", "M", "Q", "H"
レベル 復元能力 用途
L 約7% データ量優先
M 約15% 標準(推奨)
Q 約25% 品質重視
H 約30% 最高品質

デフォルト: "M"


set_version(version)

QRコードのバージョン(サイズ)を設定します。

パラメータ 説明
version int 0〜40(0=自動)

デフォルト: 0(自動)


set_encode_mode(mode)

エンコードモードを設定します。

パラメータ 説明
mode str or QREncodeMode "AUTO", "NUMERIC", "ALPHANUMERIC", "BYTE", "KANJI"

デフォルト: "AUTO"


get_pattern(code)

QRコードの2Dパターンを取得します。

パラメータ 説明
code str or bytes データ

戻り値: List[List[bool]] — 2Dブーリアン行列。True = 黒モジュール。


get_pattern_string(code)

QRコードパターンを文字列形式で取得します(デバッグ用)。

戻り値: str"1" = 黒、"0" = 白の文字列

使用例

qr = QR()
qr.set_error_correction_level("M")
qr.set_version(0)  # 自動

# パターン取得
matrix = qr.get_pattern("https://www.pao.ac/")
print(f"サイズ: {len(matrix)}x{len(matrix[0])}")

# 日本語データ(バイト列を渡す)
matrix = qr.get_pattern("こんにちは".encode("utf-8"))

7.20 DataMatrix

クラス: DataMatrix

インポート:

from pao_barcode import DataMatrix

set_code_size(size)

シンボルサイズを設定します。

パラメータ 説明
size str or DxCodeSize "AUTO", "10x10""144x144", "8x18"

デフォルト: "AUTO"

正方形: 10x10, 12x12, 14x14, 16x16, 18x18, 20x20, 22x22, 24x24, 26x26, 32x32, 36x36, 40x40, 44x44, 48x48, 52x52, 64x64, 72x72, 80x80, 88x88, 96x96, 104x104, 120x120, 132x132, 144x144

長方形: 8x18, 8x32, 12x26, 12x36, 16x36, 16x48


set_encode_scheme(scheme)

エンコードスキームを設定します。

パラメータ 説明
scheme str or DxScheme "AUTO", "ASCII", "C40", "TEXT", "X12", "EDIFACT", "BASE256"

デフォルト: "AUTO"


get_pattern(code)

DataMatrix の2Dパターンを取得します。

パラメータ 説明
code str or bytes データ

戻り値: List[List[bool]]

使用例

dm = DataMatrix()
dm.set_code_size("AUTO")
dm.set_encode_scheme("AUTO")
matrix = dm.get_pattern("Hello World 123")

7.21 PDF417

クラス: PDF417

インポート:

from pao_barcode import PDF417

set_error_level(level)

誤り訂正レベルを設定します。

パラメータ 説明
level int or PDF417ErrorLevel -1〜8(-1=自動)
レベル 訂正能力
0 最小
1
2 標準(推奨)
3〜8 高〜最大

デフォルト: -1(自動)


set_columns(columns)

列数を設定します。

パラメータ 説明
columns int 1〜30(0=自動)

デフォルト: 0(自動)


set_rows(rows)

行数を設定します。

パラメータ 説明
rows int 3〜90(0=自動)

デフォルト: 0(自動)


set_aspect_ratio(ratio)

縦横比を設定します。

パラメータ 説明
ratio float 縦横比(1.0〜10.0)

デフォルト: 3.0


set_y_height(height)

Y方向(縦)の高さ係数を設定します。

パラメータ 説明
height int 高さ係数(1〜10)

デフォルト: 3


get_pattern(data)

PDF417の2Dパターンを取得します。

パラメータ 説明
data str or bytes データ

戻り値: List[List[bool]]

使用例

pdf = PDF417()
pdf.set_error_level(2)
pdf.set_columns(4)
pdf.set_rows(0)
pdf.set_aspect_ratio(3.0)
pdf.set_y_height(3)

matrix = pdf.get_pattern("PDF417 Sample Data")
print(f"サイズ: {len(matrix)}行 x {len(matrix[0])}列")

7.22 ReportLabRenderer

クラス: ReportLabRenderer

PDF帳票のキャンバスにバーコードを直接描画するレンダラーです。

インポート:

from pao_barcode.renderers import ReportLabRenderer

必要パッケージ: reportlab

コンストラクタ

ReportLabRenderer(canvas, **kwargs)
パラメータ 説明 デフォルト
canvas reportlab.pdfgen.canvas.Canvas ReportLabのキャンバス (必須)
fore_color Tuple[int,int,int] 前景色 (R,G,B) 0-255 (0, 0, 0)
back_color Tuple[int,int,int] or None 背景色。Noneで透明 (255, 255, 255)
show_text bool テキスト表示 True
font_name str フォント名 'Helvetica'
font_size float フォントサイズ(pt) 8
quiet_zone float クワイエットゾーン比率 0.05

draw(barcode, data, x, y, width, height, **kwargs)

バーコードを描画します。全19タイプに対応。

パラメータ 説明
barcode BarcodeBase pao_barcodeのエンコーダーインスタンス
data str バーコードデータ
x float 左端X座標(ポイント)
y float 下端Y座標(ポイント)
width float 幅(ポイント)
height float 高さ(ポイント)

kwargs オプション:

キー 説明
show_text bool コンストラクタ設定の一時上書き
font_size float コンストラクタ設定の一時上書き

draw_gs1_128_convenience(barcode, data, x, y, width, height, **kwargs)

GS1-128コンビニバーコードを2行テキスト付きで描画します。

パラメータ 説明
barcode GS1_128 GS1_128インスタンス
data str {FNC1} + 43 or 44桁の数字
x, y, width, height float 描画位置・サイズ

render_to_pdf(barcode, data, file_path, width=200, height=60, **kwargs) ※staticmethod

バーコードを単体PDFファイルとして出力します。1行で完結する便利メソッド。

パラメータ 説明
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
file_path str 出力ファイルパス
width float 幅(ポイント)。デフォルト: 200
height float 高さ(ポイント)。デフォルト: 60
**kwargs ReportLabRendererコンストラクタに渡すオプション
# 簡易PDF出力(1行で完結)
from pao_barcode import Code128
from pao_barcode.renderers import ReportLabRenderer

ReportLabRenderer.render_to_pdf(Code128(), "1234567890", "barcode.pdf")

ヒント: とりあえずバーコードをPDFにしたいだけなら、この render_to_pdf() 一行で十分。帳票レイアウトは後から考えましょう。


7.23 PillowRenderer

クラス: PillowRenderer

PIL Image としてバーコードを描画するレンダラーです。

インポート:

from pao_barcode.renderers import PillowRenderer

必要パッケージ: Pillow

コンストラクタ

PillowRenderer(**kwargs)
パラメータ 説明 デフォルト
fore_color Tuple[int,int,int] 前景色 (R,G,B) 0-255 (0, 0, 0)
back_color Tuple[int,int,int] or None 背景色。Noneで透明(RGBA) (255, 255, 255)
show_text bool テキスト表示 True
font_path str or None TrueTypeフォントパス None (自動検索)
font_size int フォントサイズ(px) 14
quiet_zone float クワイエットゾーン比率 0.05

render(barcode, data, width, height, **kwargs)

バーコードを新しい PIL Image として生成します。

パラメータ 説明
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
width int 画像幅(ピクセル)
height int 画像高さ(ピクセル)

戻り値: PIL.Image.Image


render_to_file(barcode, data, file_path, width, height, format=None, **kwargs)

バーコードを画像ファイルとして保存します。

パラメータ 説明
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
file_path str 出力ファイルパス
width int 画像幅(ピクセル)
height int 画像高さ(ピクセル)
format str or None 出力形式('PNG', 'JPEG', 'BMP'等)。Noneで拡張子から推定

render_to_bytes(barcode, data, width, height, format='PNG', **kwargs)

バーコードをバイト列として取得します。

パラメータ 説明
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
width int 画像幅(ピクセル)
height int 画像高さ(ピクセル)
format str 出力形式。デフォルト: 'PNG'

戻り値: bytes


render_to_base64(barcode, data, width, height, format='PNG', **kwargs)

バーコードを Base64 データURI文字列として取得します。

パラメータ 説明
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
width int 画像幅(ピクセル)
height int 画像高さ(ピクセル)
format str 出力形式。デフォルト: 'PNG'

戻り値: str"data:image/png;base64,..." 形式


draw(image, barcode, data, x, y, width, height, **kwargs)

既存の PIL Image にバーコードを描画します。

パラメータ 説明
image PIL.Image.Image 描画先の画像
barcode BarcodeBase エンコーダーインスタンス
data str バーコードデータ
x int 左端X座標(ピクセル)
y int 上端Y座標(ピクセル)
width int 幅(ピクセル)
height int 高さ(ピクセル)

draw_gs1_128_convenience(image, barcode, data, x, y, width, height, **kwargs)

GS1-128コンビニバーコードを2行テキスト付きで既存画像に描画します。

パラメータ 説明
image PIL.Image.Image 描画先の画像
barcode GS1_128 GS1_128インスタンス
data str {FNC1} + 43 or 44桁の数字
x, y, width, height int 描画位置・サイズ

8. 動作環境

必須環境

項目 要件
Python 3.8 以上
OS Windows / macOS / Linux

オプション依存パッケージ

パッケージ バージョン 用途
reportlab 3.5 以上 PDF帳票出力(ReportLabRenderer)
Pillow 9.0 以上 画像出力(PillowRenderer)

ヒント: エンコーダー(encode() / get_pattern())とSVG出力だけなら、外部依存パッケージは不要です。pao_barcode 単体で動きます。


9. ライセンス・お問い合わせ

使用許諾

pao_barcode の使用について、利用者様と有限会社パオ・アット・オフィス(以下「弊社」)は、以下の各項目に同意するものとします。

1. 使用許諾書

この使用許諾書は、利用者様がお使いのパソコンにおいて pao_barcode を使用する場合に同意しなければならない契約書です。

2. 同意

利用者様が pao_barcode を使用する時点で、本使用許諾書に同意されたものとします。

3. ライセンスの購入

製品版を使用して開発を行う場合、1 台の開発用コンピュータにつき 1 ライセンスの購入が必要です。お客様環境等、開発コンピュータでないマシンでの使用にはライセンスは不要です(ランタイムライセンスフリー)。

4. 著作権

pao_barcode の著作権は、いかなる場合においても弊社に帰属いたします。

5. 免責

pao_barcode の使用によって、直接的または間接的に生じたいかなる損害に対しても、弊社は補償賠償の責任を負わないものとします。

6. 禁止事項

pao_barcode およびその複製物を第三者に譲渡・貸与することはできません。開発ツールとしての再販・再配布を禁止します。ただし、モジュールとして組み込みを行い再販・再配布する場合は問題ございません。

7. 保証の範囲

弊社は pao_barcode の仕様を予告なしに変更することがあります。利用者様への情報提供は弊社 Web サイトにて行います。

8. 適用期間

本使用許諾条件は利用者様が pao_barcode を使用した日より有効です。


ライセンス

pao_barcode は有限会社パオ・アット・オフィスの製品です。

試用版について: - 生成されるバーコードに「SAMPLE」の透かしが表示されます - 機能制限はありません — すべてのバーコードタイプ・レンダラーを試用できます

製品版について: - 透かしなしでバーコードを生成できます - ライセンスの詳細は弊社Webサイトをご確認ください

お問い合わせ

有限会社 パオ・アット・オフィス

保守・保証につきましては、保守・保証に関する規定をご覧ください。

関連製品

製品 特徴
Barcode.Python C++ Import WASM版 WebAssembly経由。Node.js環境で高速処理
Barcode.Python C++ Import Native版 C++ pybind11 バインディング。最速の処理速度
Barcode.wasm ブラウザ用 WebAssembly バーコードライブラリ
Barcode.net .NET用バーコードライブラリ
Barcode.jar Java用バーコードライブラリ
Barcode.php PHP用バーコードライブラリ

pao_barcode ユーザーズマニュアル

バージョン 1.1

© 2026 有限会社 パオ・アット・オフィス