2015年3月20日金曜日

バーコード印刷は、Imageではなく、Rectangleの集合で

バーコード印刷で、はまりました。

WriteableBitmapを使い、Imageにバーコードの画像をセットします。

それを印刷すれば、完璧なバーコードのエコシステムが出来上がるはずでした。

しかし、実機のバーコードリーダーでは読み取ることができません。

バーの並びというか、配列が変化し、変質しているのです!

試しに、PDFプリンターに印刷したらどうかと思い、試しました所、再現しました。変質しています。

結局、バーコードのビットマップを印刷するのはやめて、Canvasの中にRectangleを詰め込むようにしたら、いけました。

zxingを使ったサンプル。ご利用の際は、自己責任で:

    public class Code39Printer : Viewbox {
        public static DependencyProperty TextProperty = DependencyProperty.Register(
            "Text", typeof(String), typeof(Code39Printer), new PropertyMetadata(
                TextChangedCallback
                )
            );

        public String Text { get { return (String)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }

        static void TextChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            var self = (Code39Printer)d;

            var wr = new Code39Writer();
            bool[] bin = wr.encode(("" + e.NewValue + "").Trim('*').ToUpperInvariant());

            int cx = bin.Length;

            Canvas cv = new Canvas();
            int BW = 1;
            int BH = 20;
            int MH = 3;
            int MW = 10;
            cv.Height = MH + BH + MH;
            cv.Width = MW + cx * BW + MW;
            for (int x = 0; x < cx; x++) {
                if (bin[x]) {
                    Rectangle r = new Rectangle();
                    r.Fill = Brushes.Black;
                    Canvas.SetTop(r, MH);
                    Canvas.SetLeft(r, MW + BW * x);
                    r.Width = BW;
                    r.Height = BH;
                    cv.Children.Add(r);
                }
            }
            self.Child = cv;
        }
    }

使い方、例:

  <MY:Code39Printer Text="{Binding bacord}" xmlns:MY="clr-namespace:YOURNAMESPACE" />

0 件のコメント:

コメントを投稿