Parcourir la source

added codabar support

boombuler il y a 12 ans
Parent
commit
987cf1bccc
2 fichiers modifiés avec 88 ajouts et 0 suppressions
  1. 36 0
      codabar/codabarcode.go
  2. 52 0
      codabar/encoder.go

+ 36 - 0
codabar/codabarcode.go

@@ -0,0 +1,36 @@
+package codabar
+
+import (
+	"github.com/boombuler/barcode"
+	"github.com/boombuler/barcode/utils"
+	"image"
+	"image/color"
+)
+
+type codabarcode struct {
+	*utils.BitList
+	content string
+}
+
+func (c *codabarcode) Content() string {
+	return c.content
+}
+
+func (c *codabarcode) Metadata() barcode.Metadata {
+	return barcode.Metadata{"Codabar", 1}
+}
+
+func (c *codabarcode) ColorModel() color.Model {
+	return color.Gray16Model
+}
+
+func (c *codabarcode) Bounds() image.Rectangle {
+	return image.Rect(0, 0, c.Len(), 1)
+}
+
+func (c *codabarcode) At(x, y int) color.Color {
+	if c.GetBit(x) {
+		return color.Black
+	}
+	return color.White
+}

+ 52 - 0
codabar/encoder.go

@@ -0,0 +1,52 @@
+package codabar
+
+import (
+	"fmt"
+	"github.com/boombuler/barcode"
+	"github.com/boombuler/barcode/utils"
+	"regexp"
+)
+
+var encodingTable map[rune][]bool = map[rune][]bool{
+	'0': []bool{true, false, true, false, true, false, false, true, true},
+	'1': []bool{true, false, true, false, true, true, false, false, true},
+	'2': []bool{true, false, true, false, false, true, false, true, true},
+	'3': []bool{true, true, false, false, true, false, true, false, true},
+	'4': []bool{true, false, true, true, false, true, false, false, true},
+	'5': []bool{true, true, false, true, false, true, false, false, true},
+	'6': []bool{true, false, false, true, false, true, false, true, true},
+	'7': []bool{true, false, false, true, false, true, true, false, true},
+	'8': []bool{true, false, false, true, true, false, true, false, true},
+	'9': []bool{true, true, false, true, false, false, true, false, true},
+	'-': []bool{true, false, true, false, false, true, true, false, true},
+	'$': []bool{true, false, true, true, false, false, true, false, true},
+	':': []bool{true, true, false, true, false, true, true, false, true, true},
+	'/': []bool{true, true, false, true, true, false, true, false, true, true},
+	'.': []bool{true, true, false, true, true, false, true, true, false, true},
+	'+': []bool{true, false, true, true, false, false, true, true, false, false, true, true},
+	'A': []bool{true, false, true, true, false, false, true, false, false, true},
+	'B': []bool{true, false, true, false, false, true, false, false, true, true},
+	'C': []bool{true, false, false, true, false, false, true, false, true, true},
+	'D': []bool{true, false, true, false, false, true, true, false, false, true},
+}
+
+func Encode(content string) (barcode.Barcode, error) {
+	checkValid, _ := regexp.Compile(`[ABCD][0123456789\-\$\:/\.\+]*[ABCD]$`)
+	if content == "!" || checkValid.ReplaceAllString(content, "!") != "!" {
+		return nil, fmt.Errorf("can not encode \"%s\"", content)
+	}
+	resBits := new(utils.BitList)
+	for i, r := range content {
+		if i > 0 {
+			resBits.AddBit(false)
+		}
+		bits, ok := encodingTable[r]
+		if !ok {
+			return nil, fmt.Errorf("can not encode \"%s\"", content)
+		}
+		for _, bit := range bits {
+			resBits.AddBit(bit)
+		}
+	}
+	return &codabarcode{resBits, content}, nil
+}