日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021SC@SDUSC Zxing开源代码(十五)PDF417二维码(一)

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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%的檢查字碼。資料存放量與錯誤糾正等級的關系如下表所示:

錯誤糾正等級糾正碼數可存資料量(位元)
自動設定641024
021108
141106
281101
3161092
4321072
5641024
6128957
7256804
8512496

下表建議不同的字數所適用的錯誤糾正等級;

資料字碼數錯誤糾正等級
1~402
40~1603
161~3204
321~8635

如前所述,錯誤糾正等級涉及拒讀錯誤(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 是條形碼周圍的邊距邊框;
返回輸入的位矩陣。

private static BitMatrix bitMatrixFromBitArray(byte[][] input, int margin) {// 創建帶有額外空格的位矩陣BitMatrix output = new BitMatrix(input[0].length + 2 * margin, input.length + 2 * margin);output.clear();for (int y = 0, yOutput = output.getHeight() - margin - 1; y < input.length; y++, yOutput--) {byte[] inputY = input[y];for (int x = 0; x < input[0].length; x++) {// 零在字節矩陣中為白色if (inputY[x] == 1) {output.set(x + margin, yOutput);}}}return output;}

除此之外,還有函數rotateArray(),獲取PDF417二維碼數組并將其旋轉90度。
這使得旋轉屏幕時二維碼在屏幕上的方向一致。

private static byte[][] rotateArray(byte[][] bitarray) {byte[][] temp = new byte[bitarray[0].length][bitarray.length];for (int ii = 0; ii < bitarray.length; ii++) {int inverseii = bitarray.length - ii - 1;for (int jj = 0; jj < bitarray[0].length; jj++) {temp[jj][inverseii] = bitarray[ii][jj];}}return temp;}

三、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 為糾錯碼字數,該函數返回維度對象包含列作為寬度和行作為高度。

private int[] determineDimensions(int sourceCodeWords, int errorCorrectionCodeWords) throws WriterException {float ratio = 0.0f;int[] dimension = null;for (int cols = minCols; cols <= maxCols; cols++) {int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);if (rows < minRows) {break;}if (rows > maxRows) {continue;}float newRatio = ((float) (17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT);// 如果以前的比率更接近首選比率,則忽略if (dimension != null && Math.abs(newRatio - PREFERRED_RATIO) > Math.abs(ratio - PREFERRED_RATIO)) {continue;}ratio = newRatio;dimension = new int[] {cols, rows};}// 處理最小值大于必要值時的情況if (dimension == null) {int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, minCols);if (rows < minRows) {dimension = new int[]{minCols, minRows};}}if (dimension == null) {throw new WriterException("Unable to fit message in columns");}return dimension;}

參考資料:

PDF417二維條碼詳解

總結

以上是生活随笔為你收集整理的2021SC@SDUSC Zxing开源代码(十五)PDF417二维码(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。