2017年2月25日 星期六

由 Code 128 Font 建立 BarCode (含規則)

建立 barcode 其實不難,網路上有很多的 js-Lib 都可以產生各式各樣的 barcode,但由於這次要透過 FileMaker 製作 BarCode 過程相當繁複 (要透過 WebViewer + Windows Only Trick),因此想到是否可以透過 BarCode font 直接製作,於是稍微找了一下 barcode font , 也順便研究了一下關於 barcode 的建立規則。

Code 128 免費字體下載 (ttf):Fonts2U (GNU/GPL)

原本很開心的下載好字體檔,然後打了幾個字,卻發現手機的 Barcode Scanner 完全無法讀取,原來這是因為 barcode 是有固定格式的,因此使用 barcode font 製作 barcode 不能只打幾個字,格式必須要按照 Code 128 的規範才行。

先來了解 Code 128 的格式,共有 5 + 2(頭尾Quiet Zone) 個區域,但這裡可以先不用了解這麼系,簡單來說我們依序需要:  開始內容驗證碼結束 四個不同的區塊,產生出來的 barcode 必須符合這個格式才能被 Reader 讀取。

※ 底下會用到這個表格,請一起參考,提醒:後方的 Character 有部分僅是針對此字體。


Code 128 一共有三種字元集,分別是 Set A~C ,每個 Set 都有自己適合使用的內容,這三種 Set 分別為:
  • Set A:大寫英文、數字、符號、控制字元
  • Set B:大寫英文、數字、符號、小寫英文
  • Set C:連續兩個數字,從 00~99 (較為特別,最後再說明)

每個 Set 都有適合使用的地方,例如:需要產生小寫英文字的 barcode,就必須使用 Set B。

假設現在要產生一個 Code 128 的條碼: XYZ,底下將一步一步描述該如何建立。


※ 挑選字元集 
由於這裡只需要大寫英文,所以可以選擇使用 Set A 或 Set B,底下以 Set A 為例子。


※ 選擇開始碼
看到表格最下方,可以看到三個開始碼,分別為 Start A~C , value 為 103~105。代表字元則是:Ë , Ì , Í。

開始碼也就宣告了我們要使用哪種字元集,假設我們要使用 Set A , 這裡就要選擇 value 為 103 的 Ë

這邊要特別注意,表格中所有這類(Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï)的文字並非絕對,而是根據 barcode font 提供的文字而定,所以使用不同人製作的 barcode font 都要確定這些 value 他使用那些符號來表示。


※ 填寫內容
選好開始碼之後,接著就是填寫內容,由於我們用 Set A,因此先看表格中 Set A 的部分,找到我們要的 X、Y、Z,對到後方 Character,剛好也就是 X,Y,Z。
PS : 通常 barcode font 實作的都會按照 X 就是 X 這種方式處理

因此我們現在的字碼有:ËXYZ

註:若內容中有用到特殊字元,如 value 為 99 的 "Code C" 等,這也算在條碼內容裡面。


※ 計算驗證碼
這是最麻煩的部分,我們要在內容後方加上一個驗證碼,計算規則如下:
  1. 內容的部分找出他的 value (如: X=56 , Y=57 , Z=58)
  2. 分別乘上自己的於內容中所在順位 (如: X=56*1 , Y=57*2 , Z=58*3)
  3. 將上面算出來的數值全部相加 (如: 56+114+174 = 344 )
  4. 加上開始碼的 value (如: 344+103 = 447)
  5. 將最後結果對 103 取餘數, PS : 103 是固定數值,和我們選的 Start A 無關
  6. 找出 value 為該餘數的字元,這就是驗證碼
以這裡的例子,最後就是 447 % 103 = 35,
value 為 35 的 Character是 C,因此 C 就是驗證碼


所以我們現在的字碼為:ËXYZC


※ 加上結束碼
沒甚麼好說,就是將代表結束的 Stop 字碼放在最後面 ( value 106 , char Î )。
所以最後就是:ËXYZCÎ

這個就是用這個 font 要產生出正確的 Code 128 所需要的文字了。

底下為使用此字體產生 XYZ 的範例,大多數主流瀏覽器應該都支援,
可以試著用 Barcode Scanner 掃描,以及滑鼠選取條碼複製,貼到
別的地方看看內容:





※ Set C 雙數字用法
Code 128 提供,連續兩個數字從 00~99 的組合,若條碼內容以數字為主的時候,可以使用此字元集來進行資料長度的縮減。假設今天要產生條碼是 20170226:

使用 Set A 的字串為 Ë20170226aÎ ;而使用 Set C 的字串為 Í41":_Î,條碼:

可以注意到,使用 Set C 的條碼較短,使用的內容文字是 41": 也短上許多。

我們直接參考對照表,分別找出「4」、「1」、「"」、「:」的部分:

可以看到,Character 4 在 Set C 中代表 "20" ; Character 1 代表 17.... 依此類推。
因此 41": 用在 Set C 時,所代表的內容是 20170226

如此可以達到資料縮減的目的。

不過使用 Set C 縮減資料時,有一定的規則,只有在合乎此規則的情況下才可以有效縮短條碼長度,否則可能不但沒有縮減,反而還增加長度。

更詳細的介紹可以參考下一篇《Code 128-C 最佳化規則及轉碼 》。

沒有留言:

張貼留言