npm package: @pao-at-office/barcode-wasm
Description: Barcode generation library using WebAssembly (Emscripten)
Author: Pao@Office
Latest version: 1.0.0

# @pao-at-office/barcode-wasm

WebAssembly バーコード生成ライブラリ


## クイックスタート

### 1. プロジェクト作成
```bash
mkdir my-barcode-app
cd my-barcode-app
npm init -y
npm install @pao-at-office/barcode-wasm
npm install -D vite
```

### 2. WASMファイルをコピー
```bash
mkdir public
cp node_modules/@pao-at-office/barcode-wasm/wasm/barcode.wasm public/
```

### 3. ファイル作成

**index.html**
```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Barcode Test</title>
</head>
<body>
  <h1>Barcode WASM Test</h1>
  <div id="status">Loading...</div>
  <img id="barcode" />
  <script type="module" src="/main.js"></script>
</body>
</html>
```

**main.js**
```javascript
import { initBarcodeModule } from '@pao-at-office/barcode-wasm';

async function main() {
  try {
    document.getElementById('status').textContent = 'Loading WASM...';
    
    const module = await initBarcodeModule({ wasmPath: '/barcode.wasm' });
    
    const barcode = new module.Code39();
    barcode.setShowText(true);
    const base64 = barcode.draw('HELLO123', 400, 100);
    document.getElementById('barcode').src = base64;
    barcode.delete();
    
    document.getElementById('status').textContent = 'Success!';
  } catch (e) {
    document.getElementById('status').textContent = 'Error: ' + e.message;
    console.error(e);
  }
}

main();
```

### 4. 起動
```bash
npx vite --open
```

## インストール

```bash
npm install @pao-at-office/barcode-wasm
```

## セットアップ

### 1. WASMファイルをpublicフォルダにコピー

```bash
cp node_modules/@pao-at-office/barcode-wasm/wasm/barcode.wasm public/
```

### 2. 初期化してバーコードを生成

```javascript
import { initBarcodeModule } from '@pao-at-office/barcode-wasm';

const module = await initBarcodeModule({ wasmPath: '/barcode.wasm' });

const barcode = new module.Code39();
barcode.setShowText(true);
const base64 = barcode.draw('HELLO', 400, 100);
document.getElementById('img').src = base64;
barcode.delete();  // メモリ解放（必須）
```

### CDNを使う場合

WASMファイルをコピーせずにCDNから読み込むこともできます。

```javascript
import { initBarcodeModule } from '@pao-at-office/barcode-wasm';

const module = await initBarcodeModule({ 
  wasmPath: 'https://unpkg.com/@pao-at-office/barcode-wasm@latest/wasm/barcode.wasm'
});
```

## 対応バーコード

### 1次元バーコード

| クラス名 | バーコード種類 |
|---------|--------------|
| `Code39` | Code39 |
| `Code93` | Code93 |
| `Code128` | Code128 |
| `GS1_128` | GS1-128 (EAN-128) |
| `NW7` | NW-7 (Codabar) |
| `Matrix2of5` | Matrix 2of5 |
| `NEC2of5` | NEC 2of5 |
| `Jan8` | JAN-8 (EAN-8) |
| `Jan13` | JAN-13 (EAN-13) |
| `UPC_A` | UPC-A |
| `UPC_E` | UPC-E |
| `GS1DataBar14` | GS1 DataBar 標準型 |
| `GS1DataBarLimited` | GS1 DataBar 限定型 |
| `GS1DataBarExpanded` | GS1 DataBar 拡張型 |
| `YubinCustomer` | 郵便カスタマバーコード |

### 2次元バーコード

| クラス名 | バーコード種類 |
|---------|--------------|
| `QR` | QRコード |
| `DataMatrix` | DataMatrix (GS1対応) |
| `PDF417` | PDF417 |

## API リファレンス

### initBarcodeModule(options)

WASMモジュールを初期化します。

```javascript
const module = await initBarcodeModule({ wasmPath: '/barcode.wasm' });
```

| パラメータ | 型 | 説明 |
|-----------|-----|------|
| `options.wasmPath` | string | WASMファイルのパス（必須） |

### 1次元バーコード共通メソッド

```javascript
const barcode = new module.Code39();

// バーコード生成（Base64画像またはSVG文字列を返す）
const result = barcode.draw(data, width, height);

// 出力形式設定
barcode.setOutputFormat('png');        // 'png' または 'svg'

// 色設定（RGB値、0-255）
barcode.setForegroundColor(0, 0, 0, 255);       // バーの色（黒）
barcode.setBackgroundColor(255, 255, 255, 255); // 背景色（白）

// バー幅調整（印刷補正用）
barcode.setPxAdjustBlack(0);           // 黒バーの幅調整
barcode.setPxAdjustWhite(0);           // 白バーの幅調整

// テキスト設定
barcode.setShowText(true);             // テキスト表示 ON/OFF
barcode.setTextGap(0.1);               // テキストとバーの間隔（高さに対する比率）
barcode.setTextFontScale(1.0);         // フォントサイズ倍率

// その他
barcode.setFitWidth(true);             // 幅にフィットさせる

// メモリ解放（必須）
barcode.delete();
```

### バーコード固有メソッド

#### Code39, NW7
```javascript
barcode.setShowStartStop(true);  // スタート/ストップコードの表示
```

#### JAN-8, JAN-13, UPC-A, UPC-E
```javascript
barcode.setExtendedGuard(true);  // ガードバー延長
```

#### GS1-128（コンビニバーコード）
```javascript
// 標準料金代理収納用バーコード
const result = barcode.drawConvenience(data, width, height);
```

#### GS1 DataBar 標準型 (GS1DataBar14)
```javascript
barcode.setSymbolType(type);     // 0: Omni, 1: Stacked
barcode.getSymbolType();         // 現在のシンボルタイプを取得
barcode.encode(data);            // データをエンコード
GS1DataBar14.calculateCheckDigit(data);  // チェックディジット計算（静的メソッド）
```

#### GS1 DataBar 拡張型
```javascript
barcode.setSymbolType(0);        // 0: 標準, 1: 積層
barcode.setNoOfColumns(4);       // 積層時の列数
const result = barcode.drawStacked(data, width, height);
```

#### 郵便カスタマバーコード
```javascript
// 高さのみ指定（幅は自動計算）
const result = barcode.draw(data, height);

// 幅・高さ両方指定
const result = barcode.drawWithWidth(data, width, height);
```

### 2次元バーコード

#### QRコード
```javascript
const qr = new module.QR();

qr.setOutputFormat('png');                    // 'png' または 'svg'
qr.setForegroundColor(0, 0, 0, 255);          // 前景色
qr.setBackgroundColor(255, 255, 255, 255);    // 背景色
qr.setStringEncoding('UTF-8');                // 文字エンコーディング
qr.setErrorCorrectionLevel('M');              // 'L', 'M', 'Q', 'H'
qr.setVersion(0);                             // 0: 自動, 1-40: バージョン指定
qr.setEncodeMode('AUTO');                     // 'AUTO', 'NUMERIC', 'ALPHANUMERIC', 'BYTE', 'KANJI'
qr.setFitWidth(true);                         // 幅にフィットさせる

const result = qr.draw(data, size);
qr.delete();
```

#### DataMatrix
```javascript
const dm = new module.DataMatrix();

dm.setOutputFormat('png');
dm.setForegroundColor(0, 0, 0, 255);
dm.setBackgroundColor(255, 255, 255, 255);
dm.setStringEncoding('UTF-8');
dm.setCodeSize('AUTO');                       // 'AUTO': 自動, '10x10'～'144x144', '8x18'等の矩形も可
dm.setEncodeScheme('AUTO');                   // 'AUTO', 'ASCII', 'C40', 'TEXT', 'X12', 'EDIFACT', 'BASE256'
dm.setFitWidth(true);                         // 幅にフィットさせる

const result = dm.draw(data, size);
dm.delete();
```

#### PDF417
```javascript
const pdf = new module.PDF417();

pdf.setOutputFormat('png');
pdf.setForegroundColor(0, 0, 0, 255);
pdf.setBackgroundColor(255, 255, 255, 255);
pdf.setStringEncoding('UTF-8');
pdf.setErrorLevel(-1);                        // -1: 自動, 0-8: 手動指定
pdf.setColumns(0);                            // 0: 自動
pdf.setRows(0);                               // 0: 自動, 3-90: 手動指定
pdf.setAspectRatio(0.5);                      // アスペクト比
pdf.setYHeight(3);                            // Y方向の高さ係数（1-10）
pdf.setFitWidth(true);                        // 幅にフィットさせる

const result = pdf.draw(data, size);
pdf.delete();
```

## 使用例

### 複数のバーコードを生成

```javascript
import { initBarcodeModule } from '@pao-at-office/barcode-wasm';

async function generateBarcodes() {
  const module = await initBarcodeModule({ wasmPath: '/barcode.wasm' });

  // Code128
  const code128 = new module.Code128();
  code128.setShowText(true);
  document.getElementById('code128').src = code128.draw('ABC-12345', 300, 80);
  code128.delete();

  // QRコード
  const qr = new module.QR();
  qr.setErrorCorrectionLevel('M');
  document.getElementById('qr').src = qr.draw('https://example.com', 200);
  qr.delete();

  // JAN-13
  const jan = new module.Jan13();
  jan.setShowText(true);
  jan.setExtendedGuard(true);
  document.getElementById('jan').src = jan.draw('4912345678901', 200, 80);
  jan.delete();
}

generateBarcodes();
```

### SVG出力

```javascript
const barcode = new module.Code39();
barcode.setOutputFormat('svg');
barcode.setShowText(true);

const svgString = barcode.draw('HELLO', 400, 100);
document.getElementById('container').innerHTML = svgString;

barcode.delete();
```

## 重要な注意事項

### メモリ解放

WASMはガベージコレクションがないため、使用後は必ず `delete()` を呼んでください。

```javascript
const barcode = new module.Code39();
const base64 = barcode.draw('HELLO', 400, 100);
barcode.delete();  // ← 必須！
```

### Vite使用時の設定

Viteを使用する場合、`vite.config.js` に以下を追加すると安定します。

```javascript
export default defineConfig({
  optimizeDeps: {
    exclude: ['@pao-at-office/barcode-wasm']
  }
});
```

## ライセンス

試用版は「SAMPLE」の透かしが表示されます。
製品版ライセンスについては https://www.pao.ac/ をご覧ください。

## 発行元

有限会社パオ・アット・オフィス  
https://www.pao.ac/