Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 18 additions & 11 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,31 @@

- 日本向けのライブラリなので、ユーザーとのやり取り・ドキュメント(README、CLAUDE.md など)・コードコメント・XML ドキュメントコメント・コミットメッセージはすべて日本語で書く。

## ビルド
## 構成・ビルド

- プロジェクトは旧形式(非 SDK スタイル)の csproj で、ターゲットは .NET Framework 4.0(`LibExecuter` は 4.0 Client Profile)。`dotnet build` ではビルドできないため、Visual Studio の MSBuild を使う:
`"/c/Program Files/Microsoft Visual Studio/2022/Community/MSBuild/Current/Bin/MSBuild.exe" ZipConvertCustomerBarCode.sln -nologo -v:m`
- 現在この環境では .NET Framework 4.0 の参照アセンブリ(Developer Pack)がないため、MSB3644 でビルドが失敗する。その場合はエラーを報告し、ユーザーの指示なしに `TargetFrameworkVersion` を変更しない。
- コードは .NET Framework 4.0 の API の範囲で書く(`IReadOnlyList` や `Task.Run` などは使えない)。
- ライブラリは 3 つ、すべて `netstandard2.0`(SDK スタイル)。ビルドは `dotnet build ZipConvertCustomerBarCode.sln`。
- `ZipConvertCustomerBarCode`: コア。外部依存を追加しない(描画ライブラリに依存させないのが分割の目的)。
- `ZipConvertCustomerBarCode.Drawing`: System.Drawing.Common による描画(Windows のみ)。
- `ZipConvertCustomerBarCode.SkiaSharp`: SkiaSharp による描画。名前空間は `SkiaSharp` との衝突を避けるため `ZipConvertCustomerBarCode.Skia`。
- `netstandard2.0` の既定 C# は 7.3。`record` や null 許容参照型など新しい構文は使わない。
- バージョン・著作権表示は `Directory.Build.props` にまとめている。
- 公開メンバーには XML ドキュメントコメントを付ける(`GenerateDocumentationFile` 有効のため、ないと警告になる)。

## テスト

- テストプロジェクトはない。`LibExecuter` はサンプル住所で `BarCode.CreateImage` を呼ぶだけのコンソールアプリで、結果は手動で確認する。
- `dotnet test` で実行(xUnit v3、net10.0)。`global.json` で Microsoft.Testing.Platform を指定しているため、`Microsoft.NET.Test.Sdk` や `xunit.runner.visualstudio` は追加しない。
- `TestData/cases.tsv` と `v1-*.png` は 1.x(.NET Framework 版)の出力で、シンボル列と画像がこれとピクセル単位で一致することを確認している。出力が変わる修正をした場合は、意図した変更か確認してから期待値を更新する。
- `cases.tsv` はタブ区切り(郵便番号・住所・シンボル列・画像ファイル名)。住所が空の行があるので、シェルで加工するときは連続するタブがまとめられないよう注意する。
- System.Drawing のテストは Windows 以外ではスキップされる。

## コード規約

- `.cs` ファイルは UTF-8(BOM 付き)・CRLF 改行。どちらも維持する。
- `.cs` ファイルは UTF-8(BOM 付き)・CRLF 改行。どちらも維持する(新規ファイルにも BOM を付ける)。

## バーコード処理(`ZipConvertCustomerBarCode/BarCode.cs`)
## バーコード処理

- 住所の変換は日本郵便のバーコードマニュアル(http://www.post.japanpost.jp/zipcode/zipmanual/p19.html)に従う。コード中の番号付きコメント(1.〜6.)はマニュアルの手順番号に対応している。
- バーコードは常に 23 シンボル: スタート + 郵便番号 7 桁 + 住所表示番号 13 枠(不足分は `CC4` で埋める)+ チェックデジット + ストップ。各シンボルは幅 12px の GIF なので画像サイズは 276×12。シンボル数を変える場合は `new Bitmap(276, 12)` も合わせて変更する。
- シンボル画像は `ZipConvertCustomerBarCode/Resources/*.gif`。`ImageKeyDic` が各シンボルをリソース名(`Num0`、`Hyphen`、`CC1`、`Start`、`End` など)に対応付けている。リソース名はファイル名ではなく `Properties/Resources.resx` と `Resources.Designer.cs` で定義されているため、画像を追加するときは両方を更新する。
- 住所の変換(`BarCode.cs`)は日本郵便のバーコードマニュアル(http://www.post.japanpost.jp/zipcode/zipmanual/p19.html)に従う。コード中の番号付きコメント(1.〜6.)はマニュアルの手順番号に対応している。
- バーコードは常に 23 シンボル: スタート + 郵便番号 7 桁 + 住所表示番号 13 枠(不足分は `CC4` で埋める)+ チェックデジット + ストップ。
- バーの形は `CustomerBarCode.cs` の `BarPatternDic` で定義(1 シンボル = 幅 12px に 3 本、x=0/4/8、幅 2px、上・中・下段 各 4px)。この表は旧バージョンの GIF 画像とピクセル単位で一致することを確認済みなので、変更するときは既存出力と比較する。
- 描画パッケージは `GetBars()` の矩形を白地に黒で塗るだけにし、バーコードのロジックはコアに置く。
- 住所中の漢数字には未対応(README に記載の既知の制限)。
10 changes: 10 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project>

<PropertyGroup>
<Version>2.0.0</Version>
<Company>Toshiba</Company>
<Product>ZipConvertCustomerBarCode</Product>
<Copyright>Copyright © Toshiba 2015</Copyright>
</PropertyGroup>

</Project>
64 changes: 0 additions & 64 deletions LibExecuter/LibExecuter.csproj

This file was deleted.

14 changes: 0 additions & 14 deletions LibExecuter/Program.cs

This file was deleted.

36 changes: 0 additions & 36 deletions LibExecuter/Properties/AssemblyInfo.cs

This file was deleted.

65 changes: 56 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,67 @@

[郵便局 - 郵便番号・バーコードマニュアル](http://www.post.japanpost.jp/zipcode/zipmanual/index.html)

## 機能
### Export
指定したパスにカスタマバーコードを出力する。
## 構成
すべて .NET Standard 2.0 のライブラリです。描画方法に合わせてパッケージを選んでください。

| プロジェクト | 依存 | 用途 |
| --- | --- | --- |
| `ZipConvertCustomerBarCode` | なし | バーコード生成、バー配置の取得、SVG 出力 |
| `ZipConvertCustomerBarCode.Drawing` | System.Drawing.Common | `Bitmap` として描画(Windows のみ) |
| `ZipConvertCustomerBarCode.SkiaSharp` | SkiaSharp | `SKBitmap` / PNG として描画(クロスプラットフォーム) |

SkiaSharp を Linux で使う場合は、利用側で `SkiaSharp.NativeAssets.Linux` パッケージも参照してください。

## 使い方
### バーコード生成
```csharp
// 郵便番号,住所,出力先
BarCode.Export("01234567", "とある県とある市とある町 1丁目1の1",@"c:\test.gif");
using ZipConvertCustomerBarCode;

// 郵便番号,住所
CustomerBarCode code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1");
```
### CreateImage
カスタマバーコードのイメージを返す
郵便番号が7桁の数値でない場合は `ArgumentException` になります。

### SVG(依存ライブラリなし)
```csharp
// 郵便番号,住所
Bitmap img = BarCode.CreateImage("01234567", "とある県とある市とある町 1丁目1の1");
string svg = code.ToSvg();
```

### System.Drawing
```csharp
using ZipConvertCustomerBarCode.Drawing;

Bitmap img = code.ToBitmap();
code.Save(@"c:\test.gif", ImageFormat.Gif);
```

### SkiaSharp
```csharp
using ZipConvertCustomerBarCode.Skia;

SKBitmap img = code.ToSKBitmap();
byte[] png = code.ToPng();
code.SavePng(@"c:\test.png");
```

### 独自に描画する
`GetBars()` でバーの位置と大きさ(ピクセル単位)が取れるので、任意の描画ライブラリで白地に黒の矩形を描いてください。

```csharp
foreach (var bar in code.GetBars())
{
// bar.X, bar.Y, bar.Width, bar.Height
}
```

いずれのメソッドも `scale` 引数で拡大できます(1 のとき 276×12 ピクセル)。

## 1.x からの移行
| 1.x | 2.x |
| --- | --- |
| `BarCode.CreateImage(zip, address)` | `BarCode.Create(zip, address).ToBitmap()`(Drawing) |
| `BarCode.Export(zip, address, path)` | `BarCode.Create(zip, address).Save(path, ImageFormat.Gif)`(Drawing) |

## 備考
* 漢数字未対応
* 住所→郵便番号変換辞書検討中(郵便番号の入力が不要に)
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace ZipConvertCustomerBarCode.Drawing
{
/// <summary>
/// System.Drawing によるカスタマバーコードの描画
/// </summary>
public static class CustomerBarCodeDrawingExtensions
{
/// <summary>
/// カスタマバーコードのイメージを返す
/// </summary>
/// <param name="code">カスタマバーコード</param>
/// <param name="scale">拡大率(1で1シンボル12ピクセル)</param>
/// <returns>バーコードイメージ</returns>
public static Bitmap ToBitmap(this CustomerBarCode code, int scale = 1)
{
if (code == null) throw new ArgumentNullException(nameof(code));

var img = new Bitmap(code.GetWidth(scale), code.GetHeight(scale));
using (var gr = Graphics.FromImage(img))
{
gr.Clear(Color.White);
foreach (var bar in code.GetBars(scale))
{
gr.FillRectangle(Brushes.Black, bar.X, bar.Y, bar.Width, bar.Height);
}
}
return img;
}

/// <summary>
/// 指定したパスにカスタマバーコードを出力する
/// </summary>
/// <param name="code">カスタマバーコード</param>
/// <param name="outputPath">出力先</param>
/// <param name="format">画像形式</param>
/// <param name="scale">拡大率(1で1シンボル12ピクセル)</param>
public static void Save(this CustomerBarCode code, string outputPath, ImageFormat format, int scale = 1)
{
using (var img = code.ToBitmap(scale))
{
img.Save(outputPath, format);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Description>カスタマバーコードを System.Drawing の Bitmap として描画する(Windows のみ)</Description>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="10.0.14" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ZipConvertCustomerBarCode\ZipConvertCustomerBarCode.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System;
using System.IO;
using SkiaSharp;

namespace ZipConvertCustomerBarCode.Skia
{
/// <summary>
/// SkiaSharp によるカスタマバーコードの描画
/// </summary>
public static class CustomerBarCodeSkiaExtensions
{
/// <summary>
/// カスタマバーコードのイメージを返す
/// </summary>
/// <param name="code">カスタマバーコード</param>
/// <param name="scale">拡大率(1で1シンボル12ピクセル)</param>
/// <returns>バーコードイメージ</returns>
public static SKBitmap ToSKBitmap(this CustomerBarCode code, int scale = 1)
{
if (code == null) throw new ArgumentNullException(nameof(code));

var img = new SKBitmap(code.GetWidth(scale), code.GetHeight(scale));
using (var canvas = new SKCanvas(img))
using (var paint = new SKPaint { Color = SKColors.Black, IsAntialias = false })
{
canvas.Clear(SKColors.White);
foreach (var bar in code.GetBars(scale))
{
canvas.DrawRect(SKRect.Create(bar.X, bar.Y, bar.Width, bar.Height), paint);
}
}
return img;
}

/// <summary>
/// カスタマバーコードをPNG形式のバイト列で返す
/// </summary>
/// <param name="code">カスタマバーコード</param>
/// <param name="scale">拡大率(1で1シンボル12ピクセル)</param>
/// <returns>PNGデータ</returns>
public static byte[] ToPng(this CustomerBarCode code, int scale = 1)
{
using (var img = code.ToSKBitmap(scale))
using (var data = img.Encode(SKEncodedImageFormat.Png, 100))
{
return data.ToArray();
}
}

/// <summary>
/// 指定したパスにカスタマバーコードをPNG形式で出力する
/// </summary>
/// <param name="code">カスタマバーコード</param>
/// <param name="outputPath">出力先</param>
/// <param name="scale">拡大率(1で1シンボル12ピクセル)</param>
public static void SavePng(this CustomerBarCode code, string outputPath, int scale = 1)
{
File.WriteAllBytes(outputPath, code.ToPng(scale));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>ZipConvertCustomerBarCode.Skia</RootNamespace>
<Description>カスタマバーコードを SkiaSharp で描画する(クロスプラットフォーム)</Description>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="SkiaSharp" Version="4.154.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ZipConvertCustomerBarCode\ZipConvertCustomerBarCode.csproj" />
</ItemGroup>

</Project>
Loading