2021SC@SDUSC Zxing开源代码(十五)PDF417二维码(一)
2021SC@SDUSC
目錄
- 一、PDF417概述
- 1.1 簡介
- 1.2 PDF417二維條碼的結構
- 1.3 PDF417二維條碼的尺寸
- 1.4 PDF417二維條碼的錯誤糾正能力
- 1.5 PDF417的特性
- 二、PDF417Writer
- 三、class PDF417
- 參考資料:
前言:本篇博客簡單介紹了PDF417二維碼的相關知識,以及編碼步驟過程。
一、PDF417概述
1.1 簡介
PDF417是美國符號科技(Symbol Technologies, Inc.)發明的二維條碼,是一種堆疊式二維條碼。PDF(Portable Data File)意思是“便攜數據文件”,組成條碼的每一個條碼字符由4個條和4個空共17個模塊構成,故稱為PDF417條碼。 PDF417條碼需要有417解碼功能的條碼閱讀器才能識別。發明人是臺灣赴美學人王寅君博士,王博士于1984年畢業于國立交通大學資訊系,獲得紐約州立大學石溪分校(University of New York at Stony Brook)電腦碩士和博士學位后,在1988年進入符號科技進行二維條碼的研發工作,于1992年底推出PDF417,并于1989年至1992年間領導世界第一部二維條碼雷射讀碼系統的開發。1993年3月作者正式將PDF417引進臺灣,交由祥記資訊推廣及研發相關套裝軟體(黃慶祥,1995)。
目前PDF417、Maxicode、Datamatrix同被美國國家標準協會 (American National Standards Institute, ANSI) MH10 SBC-8委員會選為二維條碼國際標準制定范圍,其中PDF417主要是預備應用于運輸包裹與商品資料標簽(Burnell, 1995)。PDF417不僅具有錯誤偵測能力,且可從受損的條碼中讀回完整的資料(Moore, 1994),亦即「錯誤復原能力」,其錯誤復原率最高可達50%。
PDF417條碼是一種高密度、高信息含量的便攜式數據文件,是實現證件及卡片等大容量、高可靠性信息自動存儲、攜帶并可用機器自動識讀的理想手段。
PDF417二維碼可應用在:證件管理、執照年檢、報表管理、機電產品的生產和組配線、銀行票據管理及行包、貨物的運輸和郵遞。PDF417條碼最大的優勢在于其龐大的數據容量和極強的糾錯能力。
1.2 PDF417二維條碼的結構
由于PDF417二維條碼的容量較大,除了可將人的姓名、單位、地址、電話等基本資料進行編碼外,還可將人體的特徵如指紋、視網膜掃瞄、及照片等個人紀錄儲存在條碼中,這樣不但可以實現證件資料的自動輸入,而且可以防止證件的偽造,減少犯罪。PDF417已在美國、加拿大、紐西蘭的交通部門的執照年審、車輛違規登記、罰款及定期檢驗上開始應用。美國并同時將PDF417應用在身分證、駕照、軍人證上。此外墨西哥也將PDF417應用在報關單據與證件上,從而防止了仿造及犯罪。
PDF417是一個公開碼,任何人皆可用其演算法而不必付費,因此是一個開放的條碼系統。PDF417的PDF為可攜性資料檔(Portable Data File)的縮寫,取其條碼類似一個資料檔,可儲存較多資料,且可隨身攜帶或隨產品走而得名(Paclidis, 1992)。正如其名,每一個PDF碼的儲存量可高達1,108個文數字(Bytes),若將數字壓縮則可存放至2,729Bytes。
每一個PDF417碼是由3~90橫列堆疊而成,而為了掃瞄方便,其四周皆有靜空區,靜空區分為水平靜空區與垂直靜空區,至少應為0.020寸,如圖:
其中每一層都包括下列五個部份:
起始碼。
左標區:在起始碼后面,為一指示符號字元。
資料區:可容納1~30個資料字元。
右標區: 在資料區的后面,為一指示符號字元。
結束碼:在橫列之最右邊。
除了起始碼和結束碼外,左標區、資料區和右標區的組成字元皆可稱為字碼 (Codeword),每一個字碼由17個模組(Modules)所構成,每一個字碼又可分成4線條(或黑線)及4空白(或白線),每個線條至多不能超過6個模組寬。每個417碼因資料大小不同,其行數及每行的資料模組數與字碼數都可以從1至30不等。字碼的組成如圖:
1.3 PDF417二維條碼的尺寸
也因為符號的組合較有彈性,每一個PDF417二維條碼可因應不同的實體設備印成不同的長寬比例與密度,以適應印刷條件及掃瞄條件的要求。其中每個模組寬X是PDF417碼中最重要的尺寸之一,X值的最小限制為0.0075英寸(約0.191mm),在同一個條碼符號中,X的值是固定不變的。
PDF417的最小高度與長度可由下列算式算出:
W= (17C+69)X+ 2Q
H = R ×Y+ 2Q
其中:
W= 條碼寬度,H=條碼高度,X=條碼模組寬,Y=層數
C=每層符號字元的總數(含左右標區),R=層高,Q=靜空區大小
1.4 PDF417二維條碼的錯誤糾正能力
PDF417二維條碼的一個重要特性是其自動糾正錯誤的能力較高,不過PDF417的錯誤糾正能力與每個條碼可存放的資料量有關,PDF417碼將錯誤復原分為9個等級,其值從0到8,級數愈高,錯誤糾正能力愈強,但可存放資料量就愈少,一般建議編入至少10%的檢查字碼。資料存放量與錯誤糾正等級的關系如下表所示:
| 自動設定 | 64 | 1024 |
| 0 | 2 | 1108 |
| 1 | 4 | 1106 |
| 2 | 8 | 1101 |
| 3 | 16 | 1092 |
| 4 | 32 | 1072 |
| 5 | 64 | 1024 |
| 6 | 128 | 957 |
| 7 | 256 | 804 |
| 8 | 512 | 496 |
下表建議不同的字數所適用的錯誤糾正等級;
| 1~40 | 2 |
| 40~160 | 3 |
| 161~320 | 4 |
| 321~863 | 5 |
如前所述,錯誤糾正等級涉及拒讀錯誤(E錯誤)與替代錯誤(T錯誤)兩種錯誤類型。無論使用哪一種條碼機都有一定的精密度極限,造成線條和空白的寬度與理想寬度間必有偏差存在,條碼掃瞄設備能夠讀出解碼演算法所允許范圍內的不精確條碼符號,目前標準中規定X的值最小為0.0075英寸(約0.191mm),此一限制同時反映出目前標準設備的技術現狀。
1.5 PDF417的特性
綜合本節所討論,PDF417的特性如下表所示:
| 可編碼字元集 | 8位二進制資料,多達811800種不同的字元集或解釋 |
| 類型 | 連續型,多層 |
| 字元自我檢查 | 有 |
| 尺寸 | 可變高:390層寬:130欄 |
| 讀碼方式 | 雙向可讀 |
| 錯誤糾正字碼數 | 2~512個 |
| 最大資料容量 | 安全等級為0, 每個符號可表示1108個位元 |
二、PDF417Writer
與之前介紹的二維碼類似,PDF417Writer類繼承了父類Writer。
PDF417Writer有兩個靜態變量:
分別表示代碼周圍的默認空白(邊距)和默認錯誤更正級別。
private static final int WHITE_SPACE = 30;private static final int DEFAULT_ERROR_CORRECTION_LEVEL = 2;PDF 417的值是由一個數組來保存的。
input 是一個信息字節數組,0為黑色,1為白色;
margin 是條形碼周圍的邊距邊框;
返回輸入的位矩陣。
除此之外,還有函數rotateArray(),獲取PDF417二維碼數組并將其旋轉90度。
這使得旋轉屏幕時二維碼在屏幕上的方向一致。
三、class PDF417
PDF417實現的邏輯部分的頂級類。
有兩個靜態變量,分別表示啟動模式(17位)和停止模式(18位)。
private static final int START_PATTERN = 0x1fea8;private static final int STOP_PATTERN = 0x3fa29;接下來介紹幾種set方法:
setDimensions(int maxCols, int minCols, int maxRows, int minRows) 用來設置最大/最小行/列值,其參數分別表示允許的最大列數、允許的最小列數、允許的最大行數、允許的最小行數。
setCompaction(Compaction compaction)設置要使用的壓縮模式。
setCompact(boolean compact)如果compact為真,則啟用壓縮。
setEncoding(Charset encoding)設置要使用的字符編碼。
public void setDimensions(int maxCols, int minCols, int maxRows, int minRows) {this.maxCols = maxCols;this.minCols = minCols;this.maxRows = maxRows;this.minRows = minRows;}public void setCompaction(Compaction compaction) {this.compaction = compaction;}public void setCompact(boolean compact) {this.compact = compact;}public void setEncoding(Charset encoding) {this.encoding = encoding;}determineDimensions(int sourceCodeWords, int errorCorrectionCodeWords)用來確定指定碼字數的最佳列和行。
其中,sourceCodeWords 為代碼字數,errorCorrectionCodeWords 為糾錯碼字數,該函數返回維度對象包含列作為寬度和行作為高度。
參考資料:
PDF417二維條碼詳解
總結
以上是生活随笔為你收集整理的2021SC@SDUSC Zxing开源代码(十五)PDF417二维码(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: treelistview 所有节点失去焦
- 下一篇: 机器学习中qa测试_如何对机器学习做单元