【研究】列印的條碼為什麼很難刷(掃描)

條碼在我們的世界無處不在,小至發票,大至大型裝置設備都會有它的身影。

每一家有制度化的公司,多少都會需要用到條碼來進行管理,身為開發人員,就很難不會碰到它。

但是我們常常因為不熟悉條碼的規則,而導致作出來的條碼沒辦法被讀取(掃描),也常遇到A設備可以讀取,B設備就無法讀取的奇怪現象,當然讀取設備本身的讀取元件也是有功力上的差別,有些廠商有能力可以調教讀寫元件的設定。

接下來,我就做點實驗給大家知道這個條碼的問題出在哪裡,以便在往後使用條碼時可以更注意到發生的原因。

在這裡我不再重述條碼的來由,這次的比較是使用大家常用的Code39(又稱39碼)來比較。
使用39碼得主要是因為他有字型檔可以使用,可以拿來做比較。

條碼的列印方式分類與優缺:

一、由條碼機(又稱標籤機)內建指令列印
優點:線條清晰,掃描讀取容易、速度快。
            列印特殊紙張(背膠式、連續型.....)
缺點:特殊的指令語言(每一個廠牌都不太一樣),等於換機器就要改寫程式碼。
            有一些貼心的廠商(精聯)會提供比較簡單的統一語言列印工具,減少開發者困擾。
            版面變化較少,沒有視覺化編輯。

二、由Windows Driver列印,或稱普通列印
優點:只要有驅動程式就可以列印,不需要改寫程式(或改寫幅度小)。
           版面彈性比較自由。由於只要有驅動就可以列印,
           所以比較不限定紙張種類,或印表機種類。
缺點:列印線條有很多模糊地帶,沒控制好就會導致無法讀取。
           受到列印裝置解析度限制,匹配沒做好就會失敗。

底下先做出三種情境比較:
雷射印表機:600DPI
條碼印表機(標籤機):203DPI
這裡,我們先比較印表機解析度的列印差異,請忽略機器種類。



(A)、(B)是同一份文件印出,(C)則是下印表機指令列印

你可以在(C)看到,線條完整度相當高,不會忽細乎粗的現象。

(A)跟(B)你可以注意到細線的部分,(A)上的細線幾乎是均勻的,而(B)上的細線偶爾會出現偏粗的現象。為什麼會如此,原因出在解析度的差異上。

我們就(A)、(B)進行檢查發現,其實大部分程式利用Windows Driver在送印表機資料時是以圖型資料形式在列印,雖然文件本身解析度沒有問題,但是送到印表機時,確為了匹配印表機的解析度而進行了縮、放變化,解析度低的印表機在處理高畫質的圖片時就會出現了『模糊空間』。

假設,我們有一個解析度6(較高)的黑白相間圖片,要轉為解析度4(較低)的圖片,會發生甚麼事?

因為解析度4的畫面無法完全程現解析度6的內容,因此必須進行縮小運算,而我們的運算規則是:縮小轉換時,若遇到轉換像素到新像素佔用超過1/2的畫素,就算為該色。

如此,我們看看話轉換出甚麼解果:
完了,完全是悲劇的發生啊!

這如果是普通照片的話,我們的眼睛是不會感到太大的差異的,但是若是給機器判讀的話,0和1本身就是完全不同的資料啊....

如果該圖片不是用在精密處理環境下,那是沒有關係的,但是若用在精密環境下,真的是完全無法使用的。

先瞭解一下條碼字型:
註1:條碼字型,網路上常用的的是 [free 3 of 9] 和 [C39PxxDxTt] 的字型,我個人常使用的是C39P24DhTt字型,因為這類的字型有長寬比可以選擇。

註2:長寬比=細線與寬線的比率,通常的分法為 [C39PxxDxTt] 字型有 [C39P24DhTt]、 [C39P24DmTt]、 [C39P24DlTt]、比率分別為1:2、1:3、1:4   

註3:[C39PxxDxTt] 字型中間有P12、P24、P36、P48、P60、P72,有人說它是指印表機,而我個人認為是指比較適合的字體大小(配合解析度使用),例如P12就是12pt、P24則為24pt。當然,沒有絕對性,若印表機解析度夠高,其實縮小幾號還是可以讀取的。如果名稱中有Hr字樣代表條碼下方有文字顯示。

註4:[free 3 of 9]字型沒有這麼多種類細分


接下來我們就來看看,把條碼字體縮小,然後印到雷射印表機和條碼印表機會發生什麼事情。此案測試使用[free 3 of 9]字型,這是一份相同的文件內容,列印在不同的機器上,上面是雷射印表機,下方是條碼印表機列印。


我前面提到的悲劇發生了,線紋因為解析度不足導致合併現象,這個條碼就保證不能用了。

這種Windows Driver 列印解決的方法很簡單:把字體稍再放大,調整到每一條線都清楚就可以了,但缺點是條碼就有可能又大又長,甚至影響到表單版面。

那為什麼條碼印表機指令列印的條碼沒有這個問題?
因為條碼印表機指令直接控制列印點的位置,而且機器控制最小就是1pt(1點),沒有模糊空間。

利用字型列印,會受到字型本身縮放比、印表機縮放比雙重問題影響。

底下我用條碼印表機印出1pt 1:2的條碼,和印表機的比較:

其實字型列印的大小以經縮到11pt,開始出現模糊現象(其實這條碼已經掃不出來了)

因此,如果要使用字型條碼的設計師,就要不斷的調整併測試列印,以確認該字型設定能與列印機器的解析度匹配起來,才能順利進行開發。

有一陣子,很多人會在網路上列印有條碼的繳款單,但是到了便利商店之後,就一直刷不出來,這個問題我個人也遇過,原因出在『印表機』。

一般多數家庭使用的印表機大多是『噴墨式』印表機,這種印表機使用的是墨水列印,但是各位知道嗎?
墨水是液體,而紙張是由眾多紙張纖維組合而成的『平面』,這些纖維交疊之處就會出現所謂的『虹吸效應』(毛細管現象),也就是當墨汁的一個『點』噴上去紙張時,這滴墨汁會在紙張上的毛細處流動,它的方向不是往下就是往旁邊移動,當往下無法完全吸收時,就會往旁邊移動。因此我們都統稱為『滲墨』、『拓墨』。

下面我用放大鏡來檢視噴墨的滲墨現象,左手邊可以看到文字邊緣出現很多的毛邊,而紙張背面則有時候會看到些微的墨汁滲透。

接下來看看雷射印表機的列印效果,文字邊的毛邊沒有了,取而代之的是週圍偶爾會有非常細微的碳粉顆粒在四周圍(但是不明顯)

再讓我們看看條碼印表機的列印效果,基本上不會有上述兩種現象,很明顯的黑、白,但是解析度看得出來不是很好(文字都是階梯狀)

條碼印表機列印的感覺像是點陣式印表機,但不同的是對於『直線』的描述能力比較強,下面一張就是點陣式的列印效果,點陣式可以感覺出來文字是由『圓點』組合出來的,其實點陣式印表機的色帶是帶有『油墨』的,所以打到紙張上也會些微出現毛邊。


因此當條碼兩條最細的線用噴墨列表機列印在紙上時,兩條線中間的『白』可能會變成『灰』,而在條碼機讀取時就很容易出錯,而導致無讀取。

噴墨印表機的解決方式,很多人會使用磅數較重的紙張,為什麼用磅數較重的紙張可以改善?因為磅數重代表同一個面積下的紙張纖維變厚、變多,當墨汁滴下去時,可以快速被吸收減少『表面流動』的『虹吸』、也就減少表面的『滲墨』、『拓墨』。

另外也有人會用『噴墨印表機專用紙』來解決,因為這種紙的特性是,向下快速吸收,兩側滲墨少的優點,但是缺點是價格比一般影印用紙貴。


其他方面也有人提過一個想法:那條碼印表機(標籤機)的解析度可否調高,我想這跟匹配的條碼讀取器有關係的,也許你可以(或廠商有做)買到解析度(300DPI)的條碼印表機(標籤機),但是用它列印出來最小的條碼標籤,但是有多少條碼讀取器可以解析出來的?

別忘了,條碼讀取器也有解析度(解析力)的問題存在,太細的現條誤判率極高,而且就算有也價格不斐吧,畢竟是特規的。

關於條碼讀取器的種類,下一次有空再介紹吧。
http://radio-idea.blogspot.tw/2016/07/blog-post.html

留言

匿名表示…
爬文爬到此篇文章,感謝解救。
WILDOX寫道…
Re: 匿名 <7527976563817228662>

對您有所幫助,深感榮幸
Teresa寫道…
謝謝你, 我用字型free 3 of 9製作的條碼, 怎樣都讀不到, 有可能就是您文章中提到的原因.
WILDOX寫道…
Re: Teresa <908958714315030722>

不客氣,如果是用噴墨或是雷射印表機列印,盡量使用 100% scale 不要使用 fill fit(fill paper)可以減少條碼變形導致無法讀取喔
Teresa寫道…
我用實際尺寸列印還是讀不到, 放棄了, 想找外面廠商幫忙製作, 謝謝你快速的回覆.
WILDOX寫道…
Re: Teresa <7331581869977121289>

可以看看『職人工廠』介紹的列印標籤機,挺方便的→→ https://www.youtube.com/watch?v=nTY7XzMOyfA
試試看
虹雨寫道…
一直調不好調到眼睛都要脫窗了,看完之後恍然大悟 Q_Q

拯救了我的時間,感謝~
WILDOX寫道…
Re: Teresa , 虹雨

不客氣優

這個網誌中的熱門文章

C# 使用 Process.Start 執行外部程式

統一發票列印小程式