跳到主要內容

IReport中的條碼類別BcImage

最近有一個繳費單的專案,需要列印條碼,因為IReport本身就有提供列印條碼的功能,所以就用IReport設計繳費單然後再用Jasperreport API寫批次程式去產生PDF,資料量大概3000多筆(頁)拆成幾個檔案,可是就發生了一個問題居然發生部分繳費單的條碼有問題,看了一下程式研判是Race Condition因為程式採用的是多執行緒,若是依序個別產生是不會有問題,但是同時執行的時候就會亂掉,而且都錯在條碼,令我覺得很奇怪,後來我查了一下發現it.businesslogic.ireport.barcode.BcImage 類別我猜是這裡的問題,就先加上synchronized重新編譯在去執行,嘿嘿條碼就對了,做了一下壓測也正常,程式碼如下,不過這樣事不是對了可能還要仔細查查看。

public class BcImage {
private static net.sourceforge.barbecue.Barcode bc = null;

public synchronized static net.sourceforge.barbecue.Barcode getBarcode() {
return bc;
}

public synchronized static BufferedImage getBarcodeImage(int type, Object aText, boolean showText, boolean checkSum) {
return getBarcodeImage(type, aText, showText, checkSum,"",0,0);
}

public synchronized static BufferedImage getBarcodeImage(int type, Object aText, boolean showText, boolean checkSum, String applicationIdentifier, int width, int height) {
// 2of7, 3of9, Bookland, Codabar, Code128, Code128A, Code128B, Code128C, Code39, EAN128, EAN13, GlobalTradeItemNumber, Int2of5, Int2of5, Monarch, NW7, PDF417, SCC14ShippingCode, ShipmentIdentificationNumber, SSCC18, Std2of5, Std2of5, UCC128, UPCA, USD3, USD4, USPS

String text = new StringBuffer().append(aText).toString();

try {
switch (type) {
case 0: return null;
case 1: bc = BarcodeFactory.create2of7(text); break;
case 2: bc = BarcodeFactory.create3of9(text, checkSum); break;
case 3: bc = BarcodeFactory.createBookland(text); break;
case 4: bc = BarcodeFactory.createCodabar(text); break;
case 5: bc = BarcodeFactory.createCode128(text); break;
case 6: bc = BarcodeFactory.createCode128A(text); break;
case 7: bc = BarcodeFactory.createCode128B(text); break;
case 8: bc = BarcodeFactory.createCode128C(text); break;
case 9: bc = BarcodeFactory.createCode39(text, checkSum ); break;
case 10: bc = BarcodeFactory.createEAN128(text); break;
case 11: bc = BarcodeFactory.createEAN13(text); break;
case 12: bc = BarcodeFactory.createGlobalTradeItemNumber(text); break;
case 13: bc = BarcodeFactory.createInt2of5(text, checkSum); break;
case 14: bc = BarcodeFactory.createMonarch(text); break;
case 15: bc = BarcodeFactory.createNW7(text); break;
case 16: bc = BarcodeFactory.createPDF417(text); break;
case 17: bc = BarcodeFactory.createSCC14ShippingCode(text); break;
case 18: bc = BarcodeFactory.createShipmentIdentificationNumber(text); break;
case 19: bc = new UCCEAN128Barcode(UCCEAN128Barcode.SSCC_18_AI, text, checkSum); break; //BarcodeFactory.createSSCC18(text); break;
case 20: bc = BarcodeFactory.createStd2of5(text, checkSum); break;
case 21: bc = new UCCEAN128Barcode(applicationIdentifier, text, checkSum); break; //BarcodeFactory.createUCC128(applicationIdentifier, text); break;
case 22: bc = BarcodeFactory.createUPCA(text); break;
case 23: bc = BarcodeFactory.createUSD3(text, checkSum); break;
case 24: bc = BarcodeFactory.createUSD4(text); break;
case 25: bc = BarcodeFactory.createUSPS(text); break;
case 26: bc = new net.sourceforge.barbecue.linear.code39.Code39Barcode(text, checkSum, true); break;
}

if (width > 0) bc.setBarWidth(width);
if (height > 0) bc.setBarHeight(height);
bc.setDrawingText(showText);
return net.sourceforge.barbecue.BarcodeImageHandler.getImage(bc);
}
catch (Exception e) {
e.printStackTrace();
//generate a runtime exception, invalid value passed.
//the user must be notified if fail
throw new RuntimeException(e.getMessage());
//return null;
}
}
}

留言

這個網誌中的熱門文章

Pentaho kettle取指定目錄下的所有檔案

最近開始玩 BI的東西,而之前專案有使用到Pentaho Open Source這個好物.... Pentaho裡面很多東西,跟 Jasperreport一樣東西很多,我最先接觸到的是kettle ETL的工具,玩了一陣子,開始有空就把它寫下來,以免忘記。 Scan一個目錄下所有檔案,然後塞進去資料庫 1.先拉兩個 Input,一個Get File Names,一個是CSV file input,再拉一個 output 中的 Table output,然後把他連起來。 2.點開 Get File Names,File or directory設定你的指定目錄,Regular Expression則是輸入.*\.*$則是所有檔案,若是CSV則可.*\.torrent$這可以了,可以按一下 Preview rows看看是否正確。

Spring boot v1.5 (六) spring data jpa 基本操作

最近天氣好熱,做甚麼事都覺得很懶,想要寫個spring data jpa也是懶懶的,不過這部分卻也是滿重要的一部分,前一篇介紹 JDBCTemplate ,已經覺得跟以前寫SQL方式有所差異了,JPA帶來的是物件導向的設計面思考,說到JPA不得不提提 ORM ,Object-relational mapping主要想法為簡化及物件導向的設計,讓RDB更貼近Object,在設計上可以更加便利,甚至透過一些設計可以讓Table具有物件導向的特性如繼承等等,以往要使用ORM的框架,都會先以 Hibernate 進行,不過近來慢慢地轉向JPA,主要還是在減少程式碼、增加彈性等等,大體的功能沒有差異很大,所以從Hibernate轉到JPA問題不大,JPA要介紹的東西還滿多的,所以我這裡會再分成三個章節來介紹。 SPRING DATA JPA基本操作 JPQL & Named SQL & Native SQL Cache & DB Design Pattern SPRING DATA JPA更加簡化的程式撰寫,只需要一個 Interface內寫一些查詢 method就可以操作JPA,因為利用 method 組合查詢條件,確實很方便也很容易理解,若是都沒有辦法符合需求當然也可以自己實作一個來用當然沒有問題。 學習目的 :SPRING DATA JPA基本操作。 學習時數 :3.5hr 教學影片: pom.xml 說明 spring-boot-starter-web:配置 Web Project所需的函式庫。 spring-boot-starter-test:配置 unit or mock test 所需的函式庫。 spring-boot-starter-actuator:配置監控spring boot所需的函式庫,後續spring cloud會使用到,所以一開就導入。 spring-boot-starter-jdbc:配置使用jdbc所需的函式庫。 postgresql:配置postgresql連接Driver所需的函式庫。 jasypt-spring-boot-starter:加解密所需的函式庫。 spring-boot-starter-data-jpa:配置Spring data jpa所需的函式庫。

IReport字型下拉選單中文亂碼

這個問題其實也不是很大啦,不過當你有很多的中文字型檔的時候可能就不知道要選哪一個,啟動IReport後,開啟報表後會發現左邊下拉選單中,最下面的字型清單中有出現方框,顯示不出該字型的名稱,這幾個字型應該是判斷新細明體,標楷體及細明體,如下圖 下載IReport的Source Code來檢查一下,it.businesslogic.ireport.gui.MainFrame發現這個JComboBox有特別設定Arial字型,當然只要是中文的都顯示不出來ㄚ,所以點掉這一行後重新編譯,嘿嘿就可以了。 jComboBoxFont.setFont(new java.awt.Font("Arial", 0, 11)); 我目前使用的版本為 IReport-3.0.0-src