バージョン 1.1 — 2026年2月
有限会社 パオ・アット・オフィス
https://www.pao.ac/
1.5 デモサイト
3.3 動作確認
4.4 バイト列取得(FFI版のみ)
5.3 リスト表示(商品一覧)
7.21 PDF417
商品のパッケージ、宅配便の送り状、病院の検体ラベル、工場の部品管理タグ——。 私たちの日常には、驚くほど多くのバーコードが存在しています。
Barcode.Flutter C++ Import版 は、そのバーコードを Flutter アプリから簡単に生成 できるライブラリです。
C++で開発された高性能バーコードエンジンを Dart から直接呼び出す仕組みで、1次元・2次元あわせて 全19種 のバーコードを、PNG画像 または SVGベクター で出力できます。
必要なコードは、たった2行。
final bc = Code128();
final result = bc.draw('Hello-2026', 400, 100);
これだけで、400×100ピクセルのバーコードが Base64 PNG画像として手に入ります。
Image.memory() に渡せば、Flutter の画面にそのまま表示できます。
| 特長 | 説明 |
|---|---|
| たった2行で生成 | インスタンス作成 → draw() 呼び出し。それだけ |
| C++譲りの高速描画 | C++で実装されたエンジンが高速にバーコードを生成 |
| 全19種バーコード | 1D・2D・GS1・郵便まで、業務で必要なバーコードを網羅 |
| PNG / SVG 両対応 | 画面表示にはPNG、印刷にはSVGと、用途で使い分け可能 |
| 全プラットフォーム対応 | WASM版1つで Web + Windows + macOS + Linux + iOS + Android すべてに対応 |
| Flutter ネイティブ連携 | Image.memory() に渡すだけで画面に表示できる |
| 豊富なカスタマイズ | 色、テキスト、バー幅調整、均等割付まで細かく制御可能 |
| コンビニバーコード対応 | GS1-128の標準料金代理収納用バーコードにも完全対応 |
| バーコード | クラス名 | どんなところで使われている? |
|---|---|---|
| Code39 | Code39 |
工場の部品ラベル、軍事規格(MIL-STD)にも採用 |
| Code93 | Code93 |
Code39の高密度版。郵便・物流で活用 |
| Code128 | Code128 |
物流の標準。ASCII全文字をエンコード可能 |
| GS1-128 | GS1_128 |
医薬品・物流。ロット番号や有効期限をAIで管理 |
| NW-7 (Codabar) | NW7 |
宅配便の送り状、図書館の貸出管理でおなじみ |
| ITF | ITF |
段ボール箱のインジケーター。物流の現場で毎日活躍 |
| Matrix 2of5 | Matrix2of5 |
工業用途。数字のみのシンプルな構成 |
| NEC 2of5 | NEC2of5 |
日本の工業現場で使われるバリエーション |
| JAN-8 (EAN-8) | Jan8 |
小さな商品用。ガムやキャンディーのパッケージに |
| JAN-13 (EAN-13) | Jan13 |
日本の商品バーコードの標準。スーパーのレジで毎日活躍 |
| UPC-A | UPC_A |
北米の商品コード。12桁 |
| UPC-E | UPC_E |
UPC-Aの短縮版。小さなパッケージに |
| バーコード | クラス名 | どんなところで使われている? |
|---|---|---|
| GS1 DataBar 標準型 | GS1DataBar14 |
スーパーの青果・精肉売り場。重量や価格を直接エンコード |
| GS1 DataBar 限定型 | GS1DataBarLimited |
小型商品向けのコンパクト版 |
| GS1 DataBar 拡張型 | GS1DataBarExpanded |
可変長データ対応。クーポンや特売情報も格納 |
| バーコード | クラス名 | どんなところで使われている? |
|---|---|---|
| 郵便カスタマバーコード | YubinCustomer |
郵便物の住所バーコード。自動区分機で高速仕分け |
| バーコード | クラス名 | どんなところで使われている? |
|---|---|---|
| QRコード | QR |
URL、決済、名刺交換——。日本発、世界で最も普及した2Dコード |
| DataMatrix | DataMatrix |
電子部品の超小型マーキング。GS1ヘルスケアでも標準 |
| PDF417 | PDF417 |
運転免許証、搭乗券。大容量データを1本に集約 |
パオ・アット・オフィスの Flutter バーコードライブラリには、用途に応じた2つの製品があります。
| C++ Import版(本製品) | Pure Dart版 | |
|---|---|---|
| パッケージ | barcode_pao_wasm(Web)barcode_pao(ネイティブ) |
pao_barcode |
| こんな方に | 手軽にバーコード画像を表示したい | PDF帳票やCanvasに直接描画したい |
| 描画方法 | draw() で Base64 / SVG を直接取得 |
CanvasRenderer / PdfRenderer で描画 |
| 出力形式 | PNG(Base64)/ SVG | Canvas直接描画 / PDF直接描画 / PNG / SVG |
| Widget | Image.memory() で表示 |
BarcodeWidget で宣言的に使用 |
| 価格 | 11,000円(税込) | 22,000円(税込) |
C++ Import版(本製品)がおすすめな場面:
- バーコード画像をシンプルに画面に表示したい
- draw() → Image.memory() のパターンで十分
- Flutter Web でバーコードを使いたい
Pure Dart版がおすすめな場面: - PdfRenderer で PDF帳票にバーコードを直接描画したい - CanvasRenderer + CustomPainter でカスタムUIに統合したい - BarcodeWidget でバーコードを宣言的に使いたい - ネイティブ依存なしで全プラットフォームに対応したい
実際の動作をブラウザで確認できるデモサイトを公開しています。全バーコードの生成をお試しいただけます。
draw() メソッドを呼ぶだけで、Base64エンコードされたPNG画像が返ってきます。
Flutter の Image.memory() にデコードして渡すだけで、画面にバーコードが表示されます。
import 'dart:convert';
final bc = Code128();
bc.setShowText(true);
final base64 = bc.draw('Hello-2026', 400, 100);
// Base64をデコードして Image.memory() で表示
final prefix = 'data:image/png;base64,';
final bytes = base64Decode(base64.substring(prefix.length));
Image.memory(bytes, fit: BoxFit.contain);
PNGが向いている場面: - 画面上でのバーコードプレビュー - 商品一覧にバーコードを表示する - ネイティブの画像処理と組み合わせたい場合
出力形式を 'svg' に切り替えるだけで、ベクター形式のSVG文字列が得られます。
どれだけ拡大しても線がぼやけないため、印刷用途に最適です。
final bc = Code128();
bc.setShowText(true);
bc.setOutputFormat('svg');
final svgString = bc.draw('Hello-2026', 400, 100);
// → "<svg xmlns=..."
// flutter_svg パッケージで表示する場合:
// SvgPicture.string(svgString)
SVGが向いている場面: - ラベル印刷(拡大しても劣化しない) - ファイルサイズを小さく抑えたい場合 - flutter_svg でベクター表示したい場合
ヒント: 同じバーコードオブジェクトで
setOutputFormat()を切り替えれば、PNG版とSVG版の両方を生成できます。プレビューはPNG、エクスポートはSVG、という使い分けも簡単です。
前景色(バーの色)と背景色を自由に指定できます。 透明度(アルファ値)にも対応しているので、背景を透明にすることも可能です。
// 紺色のバーにアイボリーの背景
bc.setForegroundColor(0, 0, 128, 255);
bc.setBackgroundColor(255, 255, 240, 255);
// 背景を透明にする(ロゴの上に重ねたいときなどに)
bc.setBackgroundColor(0, 0, 0, 0);
バーコード下部のテキスト(ヒューマンリーダブル)は、表示・非表示だけでなく、サイズや配置まで細かく調整できます。
bc.setShowText(true); // テキストを表示する
bc.setTextFontScale(1.2); // 少し大きめに
bc.setTextGap(0.5); // バーとの隙間を狭く
bc.setTextEvenSpacing(true); // 1文字ずつ均等に配置
ヒント:
setTextEvenSpacing(true)にすると、テキストが各バーの真下に揃って配置されます。見た目がすっきりするので、一般的な1Dバーコードではおすすめです。
実際に印刷すると、インクのにじみで黒バーが太くなることがあります。 バーコードリーダーの読み取り精度が落ちてしまう場合は、この機能で補正しましょう。
bc.setPxAdjustBlack(-1); // 黒バーを1px細く(にじみ対策)
bc.setPxAdjustWhite(1); // 白スペースを1px広く
指定した幅にバーコードをぴったり収めたい場合に使います。
bc.setFitWidth(true); // 小数ピクセルを使って幅ぴったりに
bc.setFitWidth(false); // 整数ピクセルのみ(若干余白が出ることがある)
2つのパッケージがあります。WASM版がおすすめです。
barcode_pao_wasm) — 全プラットフォーム対応(Web + Windows + macOS + Linux + iOS + Android)barcode_pao) — ネイティブのみ(Windows / macOS / Linux / iOS / Android)なぜWASM版がおすすめ? WASM版はバージョン1.1でクロスプラットフォーム対応になりました。Webでは WebAssembly + JS interop、ネイティブでは dart:ffi で動作し、同じAPIで全プラットフォームをカバーします。FFI版は
drawBytes()などの追加機能がありますが、WASM版1つで済むシンプルさが魅力です。
pubspec.yaml に以下を追加します:
dependencies:
barcode_pao_wasm:
path: ../path/to/barcode_pao_wasm
barcode_pao: # ネイティブ実行時に必要
path: ../path/to/barcode_pao
注意:
barcode_pao_wasmは Web 実行時には WebAssembly を使いますが、ネイティブ実行時にはbarcode_paoプラグインの DLL/SO を dart:ffi で呼び出します。そのため、ネイティブプラットフォームで使う場合はbarcode_paoも一緒に追加してください。Flutter Web のみで使う場合はbarcode_pao_wasmだけで動作します。
WASMファイルの配置(Flutter Web の場合のみ):
web/wasm/ ディレクトリに以下の2ファイルを配置してください:
your_project/
├── web/
│ ├── wasm/
│ │ ├── barcode.js ← WASMローダー
│ │ └── barcode.wasm ← WebAssemblyバイナリ
│ └── index.html
└── lib/
└── main.dart
web/index.html の <head> セクションに以下を追加します:
<script src="wasm/barcode.js"></script>
ヒント: ネイティブプラットフォーム(Windows/macOS/Linux等)で実行する場合、WASMファイルの配置は不要です。
barcode_paoプラグインが自動的にネイティブDLLをバンドルします。
要件: Flutter 3.0+, Dart 3.0+
通常は WASM版をお使いください。 FFI版は
drawBytes()やdrawRect()など WASM版にない追加メソッドが必要な場合にのみ直接使います。WASM版はネイティブプラットフォームでも FFI版と同じ C++ エンジンを使用するため、性能差はありません。
pubspec.yaml に以下を追加します:
dependencies:
barcode_pao:
path: ../path/to/barcode_pao
ネイティブライブラリの配置:
プラットフォームに応じて、ビルド済みのネイティブライブラリを配置します:
| プラットフォーム | ファイル | 配置先 |
|---|---|---|
| Windows | barcode_pao.dll |
Flutter プラグインが自動バンドル |
| macOS | libbarcode_pao.dylib |
バンドル内 |
| Linux | libbarcode_pao.so |
LD_LIBRARY_PATH 内 |
| iOS | libbarcode_pao.a |
Xcode プロジェクトにリンク |
| Android | libbarcode_pao.so |
jniLibs/ 内 |
要件: Flutter 3.0+, Dart 3.0+
import 'package:barcode_pao_wasm/barcode_pao_wasm.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initBarcodeWasm(); // 起動時に1回だけ初期化
final bc = Code128();
bc.setShowText(true);
final result = bc.draw('TEST-1234', 400, 100);
print('OK: ${result.substring(0, 50)}...');
}
import 'package:barcode_pao/barcode_pao.dart';
void main() {
final bc = Code128();
try {
bc.setShowText(true);
final result = bc.draw('TEST-1234', 400, 100);
print('OK: ${result.substring(0, 50)}...');
} finally {
bc.dispose(); // ネイティブリソースの解放(必須)
}
}
data:image/png;base64,... で始まる長い文字列が表示されれば成功です。
ヒント: WASM版とFFI版は ほぼ同じAPI です。主な違いは「WASM版は
initBarcodeWasm()が必要」「FFI版はdispose()が必要」の2点だけ。以降のサンプルでは WASM版の import を使用しますが、FFI版でも同様に動きます。
ここでは、コピー&ペーストですぐ動くサンプルを紹介します。
import 'package:barcode_pao_wasm/barcode_pao_wasm.dart';
final bc = Code128();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
final base64 = bc.draw('Hello-2026', 400, 100);
// → "data:image/png;base64,iVBORw0KGgo..."
draw() の戻り値は data:image/png;base64,... 形式の Data URI 文字列です。
final bc = Code128();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
bc.setOutputFormat('svg');
final svgString = bc.draw('Hello-2026', 400, 100);
// → "<svg xmlns=..."
SVGモードでは <svg xmlns="...">...</svg> 形式の文字列が返ります。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:barcode_pao_wasm/barcode_pao_wasm.dart';
class BarcodeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bc = Code128();
bc.setShowText(true);
final base64 = bc.draw('Hello-2026', 400, 100);
// "data:image/png;base64," を除去してデコード
final prefix = 'data:image/png;base64,';
final bytes = base64Decode(base64.substring(prefix.length));
return Image.memory(bytes, fit: BoxFit.contain);
}
}
FFI版では drawBytes() で PNG のバイト列(Uint8List)を直接取得できます。Base64のデコード処理が不要になるため、大量のバーコードを生成する場合に便利です。
import 'package:barcode_pao/barcode_pao.dart';
final bc = Code128();
bc.setShowText(true);
try {
final pngBytes = bc.drawBytes('Hello-2026', 400, 100);
// → Uint8List(PNG バイナリ)
Image.memory(pngBytes, fit: BoxFit.contain);
} finally {
bc.dispose(); // FFI版では必須
}
注意:
drawBytes()は FFI版(barcode_pao)のみで利用可能です。WASM版には含まれません。
最もシンプルな表示方法です。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:barcode_pao_wasm/barcode_pao_wasm.dart';
class SimpleBarcodeWidget extends StatelessWidget {
final String data;
final int width;
final int height;
const SimpleBarcodeWidget({
required this.data,
this.width = 400,
this.height = 100,
super.key,
});
@override
Widget build(BuildContext context) {
final bc = Code128();
bc.setShowText(true);
try {
final base64 = bc.draw(data, width, height);
final prefix = 'data:image/png;base64,';
final bytes = base64Decode(base64.substring(prefix.length));
return Image.memory(bytes, fit: BoxFit.contain);
} catch (e) {
return Text('エラー: $e', style: TextStyle(color: Colors.red));
}
}
}
// 使い方
SimpleBarcodeWidget(data: 'HELLO-2026')
テキストフィールドに入力した文字をリアルタイムでバーコードにする例です。
class BarcodeGeneratorPage extends StatefulWidget {
@override
State<BarcodeGeneratorPage> createState() => _BarcodeGeneratorPageState();
}
class _BarcodeGeneratorPageState extends State<BarcodeGeneratorPage> {
String _code = 'HELLO-2026';
Uint8List? _imageBytes;
String? _error;
void _generate() {
final bc = Code128();
bc.setShowText(true);
try {
final base64 = bc.draw(_code, 400, 100);
final prefix = 'data:image/png;base64,';
setState(() {
_imageBytes = base64Decode(base64.substring(prefix.length));
_error = null;
});
} catch (e) {
setState(() {
_imageBytes = null;
_error = e.toString();
});
}
}
@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
decoration: InputDecoration(labelText: 'バーコードデータ'),
onChanged: (v) => _code = v,
),
SizedBox(height: 8),
ElevatedButton(
onPressed: _generate,
child: Text('生成'),
),
SizedBox(height: 16),
if (_error != null)
Text(_error!, style: TextStyle(color: Colors.red)),
if (_imageBytes != null)
Image.memory(_imageBytes!, fit: BoxFit.contain),
],
);
}
}
商品リストにバーコードを表示する実践的な例です。
class ProductListPage extends StatelessWidget {
final products = [
{'name': 'ミネラルウォーター', 'jan': '4901234567894', 'price': 98},
{'name': 'おにぎり 鮭', 'jan': '4912345678904', 'price': 130},
{'name': 'サンドイッチ', 'jan': '4923456789014', 'price': 248},
];
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
final p = products[index];
final bc = Jan13();
bc.setShowText(true);
bc.setExtendedGuard(true);
final base64 = bc.draw(p['jan'] as String, 250, 100);
final prefix = 'data:image/png;base64,';
final bytes = base64Decode(base64.substring(prefix.length));
return Card(
child: ListTile(
title: Text(p['name'] as String),
subtitle: Text('¥${p['price']}'),
trailing: SizedBox(
width: 150,
child: Image.memory(bytes, fit: BoxFit.contain),
),
),
);
},
);
}
}
ここからは、バーコードの種類ごとに実践的なサンプルを紹介します。 各バーコードが「どんな場面で使われているか」も添えていますので、用途に合ったバーコードを選ぶ参考にしてください。
以降のサンプルでは WASM版の import を使用しますが、FFI版でも同様に動作します(FFI版では dispose() の呼び出しが必要です)。
英数字と一部の記号を表現できます。スタート/ストップコード(*)で囲まれるのが特徴です。
final bc = Code39();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
bc.setShowStartStop(true); // *HELLO-123* と表示
final result = bc.draw('HELLO-123', 400, 100);
入力可能: 数字(0-9)、英大文字(A-Z)、記号(- . $ / + % スペース)
Code39と同じ文字を、より狭いスペースでエンコードできます。さらにASCII全文字に対応。
final bc = Code93();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
final result = bc.draw('Code93-Test', 400, 100);
ASCII全文字に対応し、数字は高密度でエンコードできるため、物流伝票で広く使われています。コードモードは通常 'AUTO' にしておけば、最短幅になるよう自動で最適化されます。
final bc = Code128();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
bc.setCodeMode('AUTO'); // AUTO / A / B / C
final result = bc.draw('Hello-2026', 400, 100);
| コードモード | 説明 |
|---|---|
'AUTO' |
自動で最短幅に最適化(おすすめ) |
'A' |
制御文字 + 数字 + 英大文字 |
'B' |
数字 + 英大文字 + 英小文字 + 記号 |
'C' |
数字のみ(2桁ずつ高密度エンコード) |
ヒント: 制御文字を入力するには
{CR},{LF},{TAB}のように中括弧で囲みます。
先頭と末尾にスタート/ストップコード(A/B/C/D)を付けるのがルールです。
final bc = NW7();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
bc.setShowStartStop(true);
final result = bc.draw('A12345B', 400, 100);
final bc = ITF();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
final result = bc.draw('123456', 400, 100);
入力可能: 数字のみ(0-9)。偶数桁 が必要です。
final m25 = Matrix2of5();
m25.setShowText(true);
m25.setTextEvenSpacing(true);
final result1 = m25.draw('1234567890', 400, 100);
final n25 = NEC2of5();
n25.setShowText(true);
n25.setTextEvenSpacing(true);
final result2 = n25.draw('1234567890', 400, 100);
URL、テキスト、連絡先——なんでも格納できる万能選手です。日本語もそのままエンコードできます。
final qr = QR();
qr.setStringEncoding('UTF-8');
qr.setErrorCorrectionLevel('M'); // L(7%) / M(15%) / Q(25%) / H(30%)
qr.setVersion(0); // 0=自動
final result = qr.draw('https://www.pao.ac/', 300);
| 誤り訂正レベル | 復元能力 | こんなときに |
|---|---|---|
'L' |
約7% | データ量を最優先したい |
'M' |
約15% | 一般的な用途(おすすめ) |
'Q' |
約25% | やや過酷な環境(汚れ・傷) |
'H' |
約30% | ロゴを重ねたい場合にも |
電子部品やヘルスケア製品の超小型マーキングに使われています。小さくても大容量。
final dm = DataMatrix();
dm.setStringEncoding('UTF-8');
dm.setCodeSize('AUTO');
dm.setEncodeScheme('AUTO');
final result = dm.draw('Hello World', 200);
1次元バーコードを積み重ねたような構造で、テキスト・数字・バイナリの大量データを格納できます。
final pdf = PDF417();
pdf.setStringEncoding('UTF-8');
pdf.setErrorLevel(3);
pdf.setColumns(4);
pdf.setAspectRatio(3.0);
pdf.setYHeight(3);
final result = pdf.draw('PDF417 Sample', 400);
ロット番号、有効期限、重量——さまざまな情報をAIコードで構造化して格納します。
final bc = GS1_128();
bc.setShowText(true);
bc.setTextEvenSpacing(true);
final result = bc.draw(
'{FNC1}0100012345678905{AI}10ABC123', 500, 120
);
| 特殊文字 | 意味 |
|---|---|
{FNC1} |
ファンクション1(可変長フィールドの区切り) |
{AI} |
AI括弧表示(テキストでAIを括弧で囲んで表示) |
公共料金の払込票に印字されているあのバーコードです。専用メソッド drawConvenience() で生成します。
final bc = GS1_128();
bc.setShowText(true);
final result = bc.drawConvenience(
'{FNC1}9191234500000000000000452087500401310029500', 500, 150
);
final bc = GS1DataBar14();
bc.setShowText(true);
bc.setSymbolType('NORMAL'); // 標準型
// bc.setSymbolType('STACKED'); // 二層型
// bc.setSymbolType('STACKED_OMNI'); // 標準二層型
final result = bc.draw('4912345678904', 300, 100);
final bc = GS1DataBarLimited();
bc.setShowText(true);
final result = bc.draw('0123456789012', 200, 60);
入力: 13桁の数字。先頭桁は 0 または 1 のみ。
final bc = GS1DataBarExpanded();
bc.setShowText(true);
// 一層型
bc.setSymbolType('NORMAL');
final result1 = bc.draw('0100012345678905{AI}10ABC123', 400, 80);
// 多層型
bc.setSymbolType('STACKED');
bc.setNoOfColumns(4);
final result2 = bc.draw('0100012345678905{AI}10ABC123', 300, 150);
長さの異なる4種類のバー(ロング・セミアッパー・セミロウワー・タイミング)で住所情報を表現します。 幅はバーの本数から自動計算されるため、高さだけを指定します。
final yubin = YubinCustomer();
// 高さのみ指定(幅は自動計算)
final result = yubin.draw('264-0025-1-2-503', 60);
// 幅も指定したい場合
final result2 = yubin.drawWithWidth('264-0025-1-2-503', 400, 60);
入力形式: 郵便番号7桁 + 住所表示番号(ハイフン区切り可)
// JAN-13(日本の標準的な商品バーコード)
final jan13 = Jan13();
jan13.setShowText(true);
jan13.setExtendedGuard(true); // ガードバーを長く伸ばす
jan13.setTextEvenSpacing(false); // セクション別のテキスト配置
final result = jan13.draw('490123456789', 300, 100);
// JAN-8(小型商品向け)
final jan8 = Jan8();
jan8.setShowText(true);
jan8.setExtendedGuard(true);
jan8.setTextEvenSpacing(false);
final result2 = jan8.draw('4901234', 200, 100);
チェックディジットは自動計算されるため、JAN-13なら12桁、JAN-8なら7桁を入力すればOKです。
ヒント: JAN/UPCバーコードでは
setExtendedGuard()とsetTextEvenSpacing()の組み合わせで見た目が変わります。商品バーコードらしい標準的な見た目にするには、extendedGuard=true + textEvenSpacing=false の組み合わせがおすすめです。
// UPC-A(12桁)
final upcA = UPC_A();
upcA.setShowText(true);
upcA.setExtendedGuard(true);
upcA.setTextEvenSpacing(false);
final result = upcA.draw('01234567890', 300, 100);
// UPC-E(8桁、ゼロ圧縮版)
final upcE = UPC_E();
upcE.setShowText(true);
upcE.setExtendedGuard(true);
upcE.setTextEvenSpacing(false);
final result2 = upcE.draw('0123456', 200, 100);
ここからは、全メソッドの詳細なリファレンスです。 各メソッドのパラメータ、戻り値、デフォルト値を網羅しています。
すべてのバーコードクラスで使用できるメソッドです。
出力形式を設定します。
| パラメータ | 型 | 説明 |
|---|---|---|
| format | String | 'png', 'jpg', 'gif', 'svg' |
bc.setOutputFormat('png'); // PNG(Base64)— デフォルト
bc.setOutputFormat('svg'); // SVGベクター
デフォルト: 'png'
前景色(バーの色)を設定します。
| パラメータ | 型 | 説明 |
|---|---|---|
| r | int | 赤(0〜255) |
| g | int | 緑(0〜255) |
| b | int | 青(0〜255) |
| a | int | 透明度(0=透明 〜 255=不透明) |
bc.setForegroundColor(0, 0, 0, 255); // 黒(デフォルト)
bc.setForegroundColor(0, 0, 128, 255); // 紺色
背景色を設定します。
bc.setBackgroundColor(255, 255, 255, 255); // 白(デフォルト)
bc.setBackgroundColor(0, 0, 0, 0); // 透明
引数の形式はバーコードの種類によって異なります:
| カテゴリ | draw |
|---|---|
| 1次元 | draw(String code, int width, int height) → String |
| 2次元 | draw(String code, int size) → String |
| 郵便 | draw(String code, int height) → String |
戻り値:
- PNG/JPEG/GIF: "data:image/png;base64,..." 形式の Data URI 文字列
- SVG: "<svg xmlns=...>...</svg>" 形式の文字列
- エラー時: 空文字列 ""
| メソッド | 戻り値 | 説明 |
|---|---|---|
drawBytes(...) |
Uint8List |
生画像バイト列 |
drawRect(...) |
String |
長方形出力(2Dバーコード) |
getBase64() |
String |
Base64 Data URI 文字列 |
getSvg() |
String |
SVG文字列 |
getImageData() |
Uint8List |
生画像バイト列 |
isSvgOutput() |
bool |
現在のフォーマットがSVGか |
dispose() |
— | ネイティブリソースを解放。必ず呼ぶこと |
なぜ
dispose()が必要? FFI版では、バーコードオブジェクトがC++のメモリを保持しています。Dartのガベージコレクション対象外なので、dispose()を呼ばないとメモリリークの原因になります。try-finallyパターンを推奨します。
1次元バーコード(郵便カスタマバーコードを除く)で共通して使用できるメソッドです。
バーコード下部のテキスト表示を切り替えます。
| パラメータ | 型 | 説明 |
|---|---|---|
| show | bool | true: 表示 / false: 非表示 |
デフォルト: true
テキストのフォントサイズ倍率を設定します。
| パラメータ | 型 | 説明 |
|---|---|---|
| scale | double | 倍率(0.5〜3.0 推奨) |
デフォルト: 1.0
バーコードとテキストの間隔を調整します。
| パラメータ | 型 | 説明 |
|---|---|---|
| gap | double | 倍率(0.0〜3.0 推奨) |
デフォルト: 1.0
テキストの均等割付を設定します。
| パラメータ | 型 | 説明 |
|---|---|---|
| even | bool | true: 均等割付 / false: 中央寄せ |
デフォルト:
- JAN/UPC以外: true(均等割付)
- JAN-8, JAN-13, UPC-A, UPC-E: false(セクション間配置)
使い分けのコツ: 一般的な1Dバーコード(Code39, Code128など)では
true(均等割付)にすると、各文字がバーの真下に揃って読みやすくなります。一方、JAN/UPCバーコードではfalseにしてsetExtendedGuard(true)と組み合わせるのが、商品バーコードとしての標準的な見た目です。
指定した幅にぴったり収めるかどうかを設定します。
デフォルト: false
バー幅の微調整です。印刷時のにじみ補正に使います。
デフォルト: 0
クラス: Code39 — 工業用途の定番バーコード
入力可能文字: 0-9, A-Z, - . $ / + %, スペース
テキスト表示時にスタート/ストップコード(*)を表示するかどうか。
デフォルト: false
クラス: Code93 — Code39の高密度版
入力可能文字: ASCII全文字(0x00〜0x7F)
固有メソッド: なし
クラス: Code128 — 物流の標準バーコード
入力可能文字: ASCII全文字(0x00〜0x7F)。制御文字は {CR}, {LF}, {TAB}, {FNC1} 等で入力。
| モード | 対応文字 |
|---|---|
'AUTO' |
自動で最短幅に最適化(おすすめ) |
'A' |
制御文字 + 数字 + 英大文字 + 一部記号 |
'B' |
数字 + 英大文字 + 英小文字 + 記号 |
'C' |
数字のみ(2桁ずつ高密度エンコード) |
デフォルト: 'AUTO'
クラス: GS1_128 — GS1標準準拠。物流・医療分野で使用
| 特殊文字 | 意味 |
|---|---|
{FNC1} |
ファンクション1(可変長AIの区切り) |
{AI} |
AI括弧表示(テキスト表示時にAIを括弧で囲む) |
標準料金代理収納用(コンビニバーコード)を生成します。
コンビニバーコードのデータ形式:
| 位置 | 桁数 | 内容 |
|---|---|---|
| 1-2 | 2 | AI: 91 固定 |
| 3-8 | 6 | 企業コード |
| 9-43 | 35 | 収納データ(金額・期限等) |
| 44 | 1 | チェックディジット(モジュラス10ウエイト3、自動計算) |
クラス: NW7 — 宅配便・図書館で使用
入力可能文字: 0-9, - $ : / . +, スタート/ストップ: A B C D
デフォルト: false
クラス: ITF — 段ボール箱の物流管理バーコード
入力可能文字: 0-9 のみ。偶数桁 が必要。
固有メソッド: なし
クラス: Matrix2of5 — 工業用の数字専用バーコード
入力可能文字: 0-9 のみ
固有メソッド: なし
クラス: NEC2of5 — 日本の工業用途向け
入力可能文字: 0-9 のみ
固有メソッド: なし
クラス: Jan8 — 小型商品用の8桁バーコード
入力: 数字7桁(チェックディジットは自動計算)
ガードバー(先頭・中央・末尾の区切りバー)を拡張するかどうかを設定します。
true にすると、ガードバーがテキスト領域まで長く伸び、テキストは左右のセクションに分かれて配置されます。商品バーコードとしての標準的な外観になります。
false にすると、全バーが同じ高さのフラットな外観になります。
デフォルト: true
JAN/UPC バーコードでは、setExtendedGuard() と setTextEvenSpacing() の組み合わせで、4種類の見た目を選べます。
| extendedGuard | textEvenSpacing | 見た目 |
|---|---|---|
true |
false |
商品バーコードの標準スタイル。 ガードバーが長く伸び、テキストはセクション別に配置 |
true |
true |
ガードバーが長く伸び、テキストは均等割付 |
false |
false |
フラットバー + テキスト中央寄せ |
false |
true |
フラットバー + テキスト均等割付 |
クラス: Jan13 — 日本の標準的な商品バーコード(13桁)
入力: 数字12桁(チェックディジットは自動計算)
7.11 JAN-8 と同じです。
デフォルト: true
JAN-13の特徴: 拡張ガードバー有効時、先頭1桁がバーコード左側にプレフィックスとして表示されます。日本の商品バーコードの「49」や「45」で始まるおなじみの見た目です。
クラス: UPC_A — 北米の商品コード(12桁)
入力: 数字11桁(チェックディジットは自動計算)
7.11 JAN-8 と同じです。
デフォルト: true
UPC-Aの特徴: 拡張ガードバー有効時、先頭1桁(ナンバーシステム)が左側に、末尾1桁(チェックディジット)が右側に、それぞれ小さく表示されます。
クラス: UPC_E — UPC-Aの短縮版(8桁)。小型商品用
入力: 数字7桁(チェックディジットは自動計算)。UPC-Aのゼロ圧縮形式。
7.11 JAN-8 と同じです。
デフォルト: true
クラス: GS1DataBar14 — 生鮮食品向けのコンパクトバーコード
入力: 数字 8〜13桁(チェックディジットは自動計算)
| 値 | 説明 |
|---|---|
'NORMAL' |
標準型(どの方向からでも読み取り可能) |
'STACKED' |
二層型(省スペース) |
'STACKED_OMNI' |
標準二層型 |
デフォルト: 'NORMAL'
| メソッド | 説明 |
|---|---|
getSymbolType() |
現在のシンボルタイプを取得 |
encode(String content) |
事前エンコード。成功で true |
static calculateCheckDigit(String src) |
チェックディジット計算 |
クラス: GS1DataBarLimited — 先頭桁が0または1に限定されたコンパクト版
入力: 数字 13桁(先頭桁は0または1のみ)
固有メソッド: なし
クラス: GS1DataBarExpanded — 可変長データ対応
入力: AI + データの組み合わせ({FNC1}, {AI} 使用可能)
| 値 | 説明 |
|---|---|
'NORMAL' |
一層型 |
'STACKED' |
多層型 |
デフォルト: 'NORMAL'
多層型のセグメント数(列数)。偶数推奨。 デフォルト: 2
Stacked専用の描画メソッドです。
クラス: YubinCustomer — 日本郵便の住所バーコード
入力: 郵便番号7桁 + 住所表示番号(ハイフン区切り可)
他のバーコードと異なり、幅は自動計算されるため高さのみ指定します。
幅も指定したい場合はこちらを使います。
注意: テキスト関連メソッド(
setShowText(),setTextFontScale(),setTextEvenSpacing()等)は使用できません。setForegroundColor(),setBackgroundColor(),setPxAdjustBlack(),setPxAdjustWhite()は使用可能です。
| 入力データ | 意味 |
|---|---|
'264-0025-1-2-503' |
〒264-0025 1丁目2番地503号 |
'1050001-13-6' |
〒105-0001 13番6号 |
'2750026-3-29-2-401' |
〒275-0026 3丁目29番2号401 |
クラス: QR — 日本発、世界で最も普及している2次元バーコード
入力: 数字、英数字、バイナリ、漢字(Shift-JIS)
| パラメータ | 型 | 説明 |
|---|---|---|
| code | String | エンコードするデータ |
| size | int | 画像サイズ(px、正方形) |
'UTF-8'(デフォルト)または 'Shift_JIS'
| レベル | 復元能力 | こんなときに |
|---|---|---|
'L' |
約7% | データ量優先 |
'M' |
約15% | 一般的な用途(おすすめ) |
'Q' |
約25% | 汚れ・傷への耐性が必要 |
'H' |
約30% | 最高品質。ロゴ重ね時にも |
デフォルト: 'M'
0(自動)〜 40。 デフォルト: 0
| 値 | 説明 |
|---|---|
'AUTO' |
自動選択 |
'NUMERIC' |
数字のみ(最高効率) |
'ALPHANUMERIC' |
英数字 |
'BYTE' |
バイトデータ |
'KANJI' |
漢字(Shift-JIS) |
デフォルト: 'AUTO'
デフォルト: false
| バージョン | モジュール数 | 数字 | 英数字 | バイト |
|---|---|---|---|---|
| 1 | 21x21 | 34 | 20 | 14 |
| 5 | 37x37 | 202 | 122 | 84 |
| 10 | 57x57 | 652 | 395 | 271 |
| 20 | 97x97 | 2,061 | 1,249 | 858 |
| 40 | 177x177 | 7,089 | 4,296 | 2,953 |
クラス: DataMatrix — 超小型マーキングの世界標準
入力: ASCII文字、バイナリデータ、GS1データ({FNC1} で開始)
'UTF-8'(デフォルト)または 'Shift_JIS'
| 主な値 | 説明 |
|---|---|
'AUTO' |
自動(おすすめ) |
'10x10' 〜 '144x144' |
正方形 |
'8x18', '8x32' 等 |
矩形 |
デフォルト: 'AUTO'
| 値 | 説明 |
|---|---|
'AUTO' |
自動選択(おすすめ) |
'ASCII' |
ASCII |
'C40' |
英数字 |
'TEXT' |
テキスト(小文字優先) |
'X12' |
ANSI X12 EDI |
'EDIFACT' |
EDIFACT |
'BASE256' |
バイナリ |
デフォルト: 'AUTO'
デフォルト: false
GS1データを格納する場合は、先頭に {FNC1} を付けます。
dm.draw('{FNC1}0100012345678905{FNC1}10ABC123', 200);
クラス: PDF417 — 大容量2次元バーコード。運転免許証・搭乗券に使用
入力: テキスト、数字、バイナリ
| パラメータ | 型 | 説明 |
|---|---|---|
| code | String | エンコードするデータ |
| width | int | 画像の幅(px)。高さは自動計算 |
'UTF-8'(デフォルト)または 'Shift_JIS'
| レベル | 訂正能力 |
|---|---|
| -1 | 自動(おすすめ) |
| 0 | 最小 |
| 1〜2 | 標準 |
| 3〜8 | 高〜最大 |
デフォルト: -1(自動)
列数。0=自動、1〜30で指定。 デフォルト: 0
行数。0=自動、3〜90で指定。 デフォルト: 0
縦横比。1.0〜10.0。 デフォルト: 3.0
Y方向の高さ係数。1〜10。 デフォルト: 3
デフォルト: false
Barcode.Flutter C++ Import版には WASM版 と FFI版 の2つのパッケージがあります。 バージョン1.1からWASM版が全プラットフォームに対応したため、基本的に WASM版だけでOK です。
| 項目 | WASM版(おすすめ) | FFI版 |
|---|---|---|
| パッケージ名 | barcode_pao_wasm |
barcode_pao |
| 対応プラットフォーム | 全プラットフォーム(Web + ネイティブ) | ネイティブのみ(Windows / macOS / Linux / iOS / Android) |
| Web での技術 | WebAssembly + JS interop | — |
| ネイティブでの技術 | dart:ffi(barcode_pao 経由) |
dart:ffi + C++ DLL/SO |
| 初期化 | Web: await initBarcodeWasm() が必要ネイティブ: 不要 |
不要 |
dispose() |
Web: 不要 ネイティブ: 不要(内部で管理) |
必須(メモリリーク防止) |
drawBytes() |
なし | あり(Uint8List 直接取得) |
drawRect() |
なし | あり(2D長方形出力) |
| 速度 | Web: 高速(最速クラス) ネイティブ: FFI版と同等 |
最高速(C++ 直接実行) |
迷ったらWASM版一択です。
barcode_pao_wasm) — Web でもネイティブでも 同じコードで動く。これ1つで全プラットフォーム対応barcode_pao) — drawBytes() や drawRect() が必要な場合のみ// WASM版(全プラットフォーム — おすすめ)
import 'package:barcode_pao_wasm/barcode_pao_wasm.dart';
// FFI版(drawBytes() 等が必要な場合のみ)
import 'package:barcode_pao/barcode_pao.dart';
技術ノート: WASM版は内部で Conditional Import を使い、プラットフォームに応じて自動的にバックエンドを切り替えます。Webでは WebAssembly + JS interop、ネイティブでは
barcode_paoプラグインの DLL を dart:ffi で呼び出します。ユーザーが意識する必要はなく、import文1つで全プラットフォームで動作します。
Flutter Web で使う場合は、アプリ起動時に 1回だけ initBarcodeWasm() を呼ぶ必要があります。ネイティブプラットフォームでは初期化不要です:
import 'package:flutter/foundation.dart' show kIsWeb;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
if (kIsWeb) {
await initBarcodeWasm(); // Web のみ必要
}
runApp(const MyApp());
}
FFI版を直接使う場合は、C++のメモリを保持しているため、使い終わったら 必ず dispose() を呼んでください:
final bc = Code128();
try {
final result = bc.draw('HELLO', 400, 100);
// ... result を使用 ...
} finally {
bc.dispose();
}
ヒント: WASM版経由でネイティブ実行する場合、
dispose()は内部で管理されるため呼ぶ必要はありません。
| 項目 | 要件 |
|---|---|
| Flutter | 3.0 以上 |
| Dart | 3.0 以上 |
| プラットフォーム | 全プラットフォーム(Web + Windows + macOS + Linux + iOS + Android) |
| Web ブラウザ | WebAssembly 対応ブラウザ(Chrome, Firefox, Safari, Edge) |
| ネイティブ追加依存 | barcode_pao プラグイン(DLL/SO 提供用) |
| 項目 | 要件 |
|---|---|
| Flutter | 3.0 以上 |
| Dart | 3.0 以上 |
| プラットフォーム | Windows / macOS / Linux / iOS / Android |
| ネイティブライブラリ | プラットフォーム毎のビルド済みバイナリが必要 |
| プラットフォーム | WASM版 | FFI版 |
|---|---|---|
| Flutter Web | 対応 | 非対応 |
| Windows | 対応 | 対応 |
| macOS | 対応 | 対応 |
| Linux | 対応 | 対応 |
| iOS | 対応 | 対応 |
| Android | 対応 | 対応 |
注意: WASM版をネイティブプラットフォームで使用する場合、内部的に
barcode_paoプラグインの C++ ネイティブライブラリを使用します。そのため、pubspec.yamlにbarcode_paoも追加してください(3.1節参照)。
Barcode.Flutter の使用について、利用者様と有限会社パオ・アット・オフィス(以下「弊社」)は、以下の各項目に同意するものとします。
1. 使用許諾書
この使用許諾書は、利用者様がお使いのパソコンにおいて Barcode.Flutter を使用する場合に同意しなければならない契約書です。
2. 同意
利用者様が Barcode.Flutter を使用する時点で、本使用許諾書に同意されたものとします。
3. ライセンスの購入
製品版を使用して開発を行う場合、1 台の開発用コンピュータにつき 1 ライセンスの購入が必要です。お客様環境等、開発コンピュータでないマシンでの使用にはライセンスは不要です(ランタイムライセンスフリー)。
4. 著作権
Barcode.Flutter の著作権は、いかなる場合においても弊社に帰属いたします。
5. 免責
Barcode.Flutter の使用によって、直接的または間接的に生じたいかなる損害に対しても、弊社は補償賠償の責任を負わないものとします。
6. 禁止事項
Barcode.Flutter およびその複製物を第三者に譲渡・貸与することはできません。開発ツールとしての再販・再配布を禁止します。ただし、モジュールとして組み込みを行い再販・再配布する場合は問題ございません。
7. 保証の範囲
弊社は Barcode.Flutter の仕様を予告なしに変更することがあります。利用者様への情報提供は弊社 Web サイトにて行います。
8. 適用期間
本使用許諾条件は利用者様が Barcode.Flutter を使用した日より有効です。
Barcode.Flutter C++ Import版は有限会社パオ・アット・オフィスの製品です。
| 項目 | 内容 |
|---|---|
| 1開発ライセンス | 11,000円(税込) / 10,000円(税抜) |
| 必要ライセンス数 | Barcode.Flutter を利用して開発するパソコンの台数分 |
| ランタイムライセンス | 無償(開発環境にのみライセンスが必要) |
| パッケージ共通 | 1ライセンスでWASM版・FFI版の両方を利用可能 |
試用版: 生成されるバーコードに「SAMPLE」の透かしが表示されます。機能制限はありません。すべてのバーコード種類・設定を自由にお試しいただけます。
製品版: 透かしなしでバーコードを生成できます。
有限会社 パオ・アット・オフィス
| Webサイト | https://www.pao.ac/ |
| 製品ページ | https://www.pao.ac/barcode.flutter/ |
| メール | info@pao.ac |
保守・保証につきましては、保守・保証に関する規定をご覧ください。
| 製品 | 対応環境 |
|---|---|
| Barcode.Flutter Pure Dart版 | Flutter / Dart(CanvasRenderer / PdfRenderer 連携) |
| Barcode.Python Pure Python版 (ソースコード付) | Python(ReportLab / Pillow 連携) |
| Barcode.Python C++ Import版 | Python(Native / WASM) |
| Barcode.wasm | JavaScript / TypeScript |
| Barcode.net | .NET(C#, VB.NET) |
| Barcode.jar | Java |
| Barcode.php | PHP |
Barcode.Flutter C++ Import版 ユーザーズマニュアル
バージョン 1.1 — 2026年2月
© 2026 有限会社 パオ・アット・オフィス