ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

.NetでBarcodeを作成し、印刷まで

目標

フリーパッケージでバーコードを作成し、印刷する。
有料パッケージだと色々便利だが、以前からAccessExcelに組み込まれたバーコードコントロールを使っているお客様には、金を使う気が無いので、却下になっている。

Nugetからパッケージをインストールする。

「barcode」で検索すると色々な候補が出てくるが、ほとんど有料だった。(IronBarcode, Spireなどなど)
結果、「Zen Barcode Rendering Framework」を使う。
種類に制約があるが、今回は問題なし

PM> Install-Package Zen.Barcode.Rendering.Framework -Version 3.1.10729.1

Nuget: https://www.nuget.org/packages/Zen.Barcode.Rendering.Framework/
GitHub: https://github.com/dementeddevil/BarcodeRenderingFramework

使い方

基本生成したバーコードをImage形式に保存する。
そのときに使うBarcodeDrawFactoryを切替ることで、生成されるバーコードも変わる仕組みらしい

using Zen.Barcode;

private Code128BarcodeDraw _barcode;
private Image _img;

public void CreateBarcode(string barcodeText, int barHeight = 50, int scale = 2)
{
    _barcode = BarcodeDrawFactory.Code128WithChecksum;
    _img = _barcode.Draw(barcode_text, barHeight, scale);
}

scaleはデフォルトだと少し小さめだったため、2にしてみた。

印刷用に編集

出来上がったバーコードはまさにバーコードのみだったため、印刷用イメージを作成する。
こんな感じにしたい
f:id:haronoid:20190622214659j:plain

//背景イメージ作成(バーコードイメージの余白になるように大きめにする。)
System.Drawing.Image backImg = new Bitmap(img.Width + 20, img.Height + 40, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(backImg);
Brush b = new SolidBrush(Color.Black);
Font f = new Font("Courier", 13);
StringFormat sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Far };

//背景クリア
g.Clear(Color.White);
g.DrawImage(img, 10, 10);   //バーコードを貼り付け
g.DrawString(bm.BarcodeText, f, b, backImg.Width / 2, backImg.Height, sf);  //バーコード文字を下部に配置

this.picBox.Image = backImg;

印刷

印刷もやり方探すのにかなり苦労したけど、最終的に作ったイメージを印刷で落ち着いた

//PrintDocumentを初期化し、プリントイベントを紐付ける。
var pd = new System.Drawing.Printing.PrintDocument();
pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pd_PrintPage);
pd.Print();
pd.PrintPage -= this.pd_PrintPage;

//PrintDocument.Print();により、以下が実行される。
private void pd_PrintPage(Object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
  //ImageをeのGraphicsに当てたら、印刷された。
  e.Graphics.DrawImage(_img, 0, 0);
}