最近一個需求是建立電子收據的Barcode和OCR。關于建立OCR字元的文章在國内很少出現,大部分内容都是關于列印機出錯,需導入ocr.ttf字型。但是目前我面臨的問題是顯示ocr.ttf字型在pdf上,是以這裡總結最近實作這個功能的過程。
一、OCR擴充
1.1 前言
OCR技術是光學字元識别的縮寫(Optical Character Recognition),是通過掃描等光學輸入方式将各種票據、報刊、書籍、文稿及其它印刷品的文字轉化為圖像資訊,再利用文字識别技術将圖像資訊轉化為可以使用的計算機輸入技術。“OCR”位代表“光學字元識别”。“A”是字母表中的第一個字母;這告訴您,奧爾- a是第一個為OCR目的定制開發的字型。(oc - b是第二個!)
光學字元識别與磁讀非常不同!圖像掃描器(或檢查閱讀器)捕捉紙質文檔的圖像(或檢查)——我們稱之為“掃描”。在這一點上,被掃描的圖像隻不過是一個無意義的密集點雲在一個更輕的背景上。OCR軟體從圖像中“提取”文本,識别形狀并配置設定字元。是以,紙質文檔無需重新輸入就可以轉換成計算機資料! OCR-a程式字型是根據ANSI INCITS 17-1981 (R2002)(前身為ANSI X3.17-1981 (R2000))建立的。USPS相容性是通過使用9pt IDAutomationOCRa字型實作。歐元銀行和德國的銀行支票可以用歐元-a程式字型列印,這種字型包括用于列印歐洲銀行支票的椅子、叉、鈎和歐元等特殊符号。大小為1的IDAutomationOCRa字型(支票schriften)應該用于列印德國銀行支票。
下表列出了這些獨特字元的位置:
1.2 安裝及導出OCR字型
1.2.1 Windows安裝OCR
下載下傳網址:https://www.wfonts.com/font/ocr-a
下載下傳完後拖住OCRAExtended.ttf檔案到C:\Windows\Fonts,會自動安裝。
點選"查找字元",找到需要的字型Unicode碼,Unicode碼可直接于Jaspersoft中使用。
1.2.2 Jaspersoft安裝OCR
OCR字型依賴于ttf檔案,考慮到java代碼開發,需生成一個jar包導入lib中建立依賴包。
①選擇Window-》Preperences
②導入ttf檔案
③點選Export導出為jar檔案
④Java項目導入OCRAExtended.jar
⑤添加OCRAExtended.jar到Build Path中
右鍵jar包-》Build Path-》Add to Build Path
⑥導入barcode開發包
1.3 JasperSoft引用OCR字型
“222B"代表的是unicode碼,如果要想顯示字元,需在前面加上”\u",即"\u222B"。
Font需指定OCRAExtended字型。
二、Jaspersoft Studio 開發
2.1 前言
JasperReport是一個強大、靈活的報表生成工具,能夠展示豐富的頁面内容,并将之轉換成PDF,HTML,或者XML格式。該庫完全由Java寫成,可以用于在各種Java應用程式,包括J2EE,Web應用程式中生成動态内容。JasperReport是開源的,對于開發者來說是個不錯的選擇。
2.2 安裝Jaspersoft studio
下載下傳 Library Jar包和模闆設計器Jaspersoft studio。并安裝Jaspersoft studio。
官網位址下載下傳:https://community.jaspersoft.com/community-download
選擇電腦安裝所需版本:
2.3 Jaspersoft 介紹
2.3.1 介紹
1)它可以PDF,HTML,XML等多種形式産生報表或動态報表,在新版本還支援CSV,XLS,RTF等格式的報表;
2)它按預定義的XML文檔來組織資料,來源多(如:關系資料庫,Java容器對象(collection,arrays)等);
報表的填充過程:
先産生報表設計對象->序列化該對象->存儲在磁盤或網絡->産生XML檔案(表格資料)。
表單的設計過程就是用定義于XML檔案中的Java表達式來實作報表的設計。
3)它帶資料一緻性驗證;
4)報表引擎必須先接受資料(通過參數等多種形式)來産生報表,更多的是來自資料源,引擎直接接收用于填充表格的資料源對象,或者通過自身提供的JDBC連接配接對象來處理資料庫的資料;
5)報表最終要産生一個新的對象來進行填充操作,進而産生列印文檔對象,這也是存儲在磁盤或網絡傳輸媒體的序列化對象;
6)内置浏覽器能直接檢視結果,以PDF,HTML,XML導出;
7)重要的類:
net.sf.jasperreports.engine.design.JasperDesign
其執行個體是用于報表産生的原始類;
net.sf.jasperreports.engine.design.JasperReport
表現了報表設計對象,是作為報表的編譯過程的結果而被執行個體化,是向報表中填充資料的準備。
2.3.2 結構
JasperReports用XML檔案來定義,約定用jrxml作為檔案的字尾名。
1)主要元素:
根元素
報表的标題 頁眉 正文 頁腳 定義報表部件,以上所有元素都包含一個band元素作為其唯一子元素。 除了根元素,其餘元素是可選的。 2)以JasperReports6.1.0版本為例,一個JasperReports項目需要如下jar包: 包名 說明 jasperreports-6.1.0.jar JasperReports API Jasperreports-fonts-6.1.0.jar JasperReports Fonts API commons-beanutils-1.9.2.jar JavaBeans Utility classes commons-collections-3.2.1.jar Collections framework extension classes commons-digester-1.7.jar classes for processing XML documents commons-logging-1.2.jar Logging classes poi-2.0-final-20040126.jar Jarkarta POI API to generate an Excel Document
2.3.3 報表
1)報表檔案格式
設計模闆時可以以HTML,PDF,XML方式預覽,用它生成的檔案有.jrxml和.jasper兩種檔案。
.jrxml:是可視化編輯的xml檔案;
.jasper:經編譯後生成的類檔案,即報表模闆檔案。
2)報表的輸出格式
其預覽輸出格式有:PDF,HTML,CSV。JAVA2D,EXCEL,純文字,JRView。
注意:JRViewer是直接以C/S方式作為報表的輸出格式,在JFrame架構下輸出。
3)報表的動态對象變量、參數、字段
字段Fields:是從資料庫抽取出來的,在報表中出現的資料庫内容。$F
參數Parameters:你寫的應用需要提供給報表的入口。 $P
變量Variables:報表中一些邏輯運算的表現。 $V
每個對象的定義格式如下: $V{variablesName}
4)運作時需要.jasper檔案;編譯:把.jrxml->.jasper檔案。
靜态運作:靜态文本來運作,和資料源無關;
動态運作:帶資料源運作。
5)報表的結構
title、pageHeader、columnHeader、detail、columnFooter、pageFooter、summary、groupHeader、groupfooter。
6)在Jaspersoft中建立資料庫連接配接
(1)菜單DourceSource -> Connections/DataSources -> …new ->
(2)菜單Build -> Set active connection -> 選擇 -> … -> OK
2.4 Jaspersoft使用
2.4.1 建立jrxml檔案
①選擇File-》New-》Jasper Report
②選擇Blank A4
③選擇儲存的路徑并重命名,一直點選下一步即可。
④進入到資料源頁面
資料源是填充報表的關鍵,我們必須制定一個資料擴充卡(Data Adapter),此時我們有三種選擇:
選擇“OneEmpty Record - Empty rows”,這樣我們就可以專注于報表的設計,而暫時不指定資料源,建立完報表之後,我們随時可以制定别的資料源。
選擇“SampleDB - Database JBDC Connection”,這是Jaspersoft Studio安裝時提供的一個示例資料庫。
這是Eclipse工作區經典的布局視圖,中間部分是報表設計視圖,右側的調色闆(Palette)包含了一些報表元素,我們可以友善地把它們拖拽到設計視圖中的報表模闆上,然後根據需要調整元素的大小、位置和配置資訊等。本例中我們将添加一個3D餅狀圖,這是一個Chart元素,具體方法将在下文介紹。
左下角的大綱(Outline)視圖包含了目前編輯的報表的所有基礎資訊,包括一些固定區域的樣式(Style)、報表參數(Parameters)、字段(Fields)等,我們可以友善地檢視和修改。大綱視圖中還包括報表的一些固定面闆的直接連結,比如标頭(Title)面闆,細節(Detail)面闆等。點選一個面闆的連結之後,我們可以在右側的屬性視圖(Properties)中檢視和修改該面闆對應的一些基本屬性,如高度、布局。
注意:從大綱視圖中我們發現,一個報表包含很多固定的面闆。在每一個報表中标題和彙總(summary)面闆隻列印一次,頁眉(header)和頁腳(footer)在報表的每一頁都會獨立列印。我們可以直接在field中新增、删除字段,還可以将字段拖拽到報表的細節面闆中,Jasper Studio将會為我們建立一個文本字段(text field)元素,并設定其值為對應字段的資料。文本字段不應出現在除細節面闆之外的其它地方。
下面,我們可以預覽報表了。在JasperSoftStudio5.2中,我們切換到預覽(Preview)視圖(點選報表設計視圖左下角的“Preview“标簽),即可編譯、生成、并在報表設計視圖展示報表。至此,一個簡單的報表就展示在我們面前了。
2.4.2 編輯jrxml檔案
建立完jrxml檔案後,使用JasperSoft Studio進入編輯階段。首先需了解示例模闆,了解整體的構圖,才能進行編輯。這裡我複制了先有的jrxml進行修改,也可以自己進行添加。
2.4.2.1 插入Barcode
①從Basic Elements中選擇 Barcode
②拖住 Barcode element放入Detail闆塊
選擇Barbecue types的Code39類型
③在Barcode 中設定Code Expression
注意:$F表示的是Filed,這裡需要Java代碼相比對才可以。
④引用OCR字型
選擇“Text Field”中的Font,字型設定為之前本地安裝的OCRAExtended字型。
⑤最終效果
三、總結
此次開發用到的技術及工具有:Java,Jaspersoft Studio、SQL Developer、FontForge、OCR。
Java代碼部分引用的jar包有:barbecue-1.5-beta1.jar,commons-collections4-4.3.jar、jasperreports-6.8.0.jar、jasperreports、fonts-6.8.0.jar、OCRAExtended.jar。Jaspersoft Studio主要用于繪制PDF模闆及編譯jrxml檔案并配合Java代碼進行動态資料的填充。SQL Developer是連接配接Oracle資料庫的主要工具,用于編輯資料表及插入資料。FontForge用于修改ttf字型,比如說字元的寬度及大小。測試的過程中,發現一個char字元多了空白符。使用FontForge軟體進行檢視,發現是字元間距的問題。另外,OCR字型是最重要的組成部分,沒有它整個需求則不能完成。該需求總花費時長差不多一個月。前期花費了一些時間琢磨JasperSoft軟體,中期反複修改使用者要求的列印模闆,後期主要探索Java代碼與jrxml的結合以及OCR字型展示不出的問題。經過反複搜尋OCR的相關資訊及測試的過程,事實證明一定要冷靜思考,實事求是,因為問題會在不經意間就解決了。