本週感想 -- 不要害怕, 你並不孤獨
Java 之父, James Gosling 2003/10/16 在大陸的搜狐網聊天室與網友線上討論. 他有對於一些 Java 的未來, 甚至對於 .NET 的比較, 發表了自己的一些意見與想法, 有興趣的人可以看一下他們的對話--搜狐網聊天室.



對於最後的結語, 或許是我們身為軟體開發工程師的一種認知吧.


"不要害怕, 你並不孤獨"


我常常在夜深人靜的夜裡, 一行一行敲打出程式, 學習著新的知識, 思索各種解決方案, 有誰一直陪著我, 大概只有我面對的這個 CRT 螢幕吧....


然而, 當我透過這個 CRT 螢幕出去的世界卻是非常寬廣的, 透過 internet 的結合, 以及感謝林上傑在 jsptw 的努力, 把多少個台灣優秀 Java 工程師以及好學的學生們結合在一起, 我們一起努力了解著, 研究著 Java ... 不用再害怕了, 也不會感到孤獨了..


歡迎參觀 jini(99% jakarta) 的部落格 -


本週主題 -- 條碼製作- barbecue 及 krysalis-barcode
SECTION 00 簡介

記得我在大學的時候, 去大眾電腦實習工讀, 那時候在工業管理部門, 那時候我僅是呆呆笨笨的學生, 他們跟我說要我學習 clipper 去印製條碼, 朦朧無知的我就乖乖地學習 clipper 艱深難懂完全沒有物件導向的語法, 不過, 當我出了社會, 協助一家 ec 網站建立 7-11 的整套系統, 那時候, 我採用了 asp 透過 activx 的元件產生 barcode. 最近剛好有人在 jsptw 問起 barcode 的產生, 我又回想當時製作的方式, 不由得好奇 java 是否有相關的 opensource 可以使用, 在 sourceforge 上有存在著 barbecue 這個專案, Jiayun 大大也提供了 krysalis barcode 這個 opensource 給我知道. 因此, 本週就介紹如何製作 Barcode .


SECTION 01 Barbecue



#BSD License# , 目前版本 1.0.6 RC1, 由此下載 binary/source檔案


Barbecue 這個 opensource 專案使用 java 製作了一些 barcode 的格式, 只需要透過簡單又具有彈性的 java api 就可以使用了. 他輸出的格式為圖檔, 也可以使用在 Swing 之中, 更可以輸出成為 SVG 的格式.


使用 Barbecue 這個專案非常簡單, 當你下載他的 binary 檔案解壓縮後, 你會找到一個 barbecue.war 檔案, 你把它放到 %TOMCAT_HOME%/webapps/ 之下, 接著你可以直接執行 http://localhost:8080/barbecue/barcode?data=123545&height=50, 你就可以看到

這樣的 barcode 圖檔了 ( 此圖檔為1.0.5輸出, 1.0.6 RC1有點 bug, 無法輸出文字部分 ). 如果你要在其他的 jsp 使用的話, 你可以用 <img src="http://localhost:8080/barbecue/barcode?data=123545&height=50" >, 他就會內嵌在你的網頁之中.


SECTION 02 barbecue 參數解釋

我們可以 trace 一下 barbecue.war 的 web.xml 是怎麼設定的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
    <servlet>
        <servlet-name>barbecue</servlet-name>
                <display-name>Barbecue</display-name>
                <description>Barcode generating servlet (serves images)</description>
        <servlet-class>net.sourceforge.barbecue.BarcodeServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
    </servlet>
        <servlet-mapping>
                <servlet-name>barbecue</servlet-name>
                <url-pattern>*</url-pattern>
        </servlet-mapping>
</web-app>
他使用一個叫做 net.sourceforge.barbecue.BarcodeServlet 的程式接收傳入的參數, 可以接收以下這幾種參數
  • data *: 這是必要欄位, 就是你要對什麼數值做 barcode 編碼
  • type: 以下是支援的格式列表, 請注意大小寫, 預設為 Code128B
    • Code128
    • Code128A
    • Code128B
    • Code128C
    • EAN128
    • USPS
    • ShipmentIdentificationNumber
    • SSCC18
    • SCCC14ShippingCode
    • GlobalTradeItemNumber
    • UCC128
    • PDF417
    • Code39
    • 3of9
    • USD3
    • Codabar
    • USD4
    • NW7
    • Monarch
    • 2of7
  • appId: 只有 UCC128 格式需要.
  • width: 最小的 bar 寬度 pixels.
  • height: 輸出的圖檔高度 pixels.
  • resolution: 輸出的圖檔解析度 dpi.
  • drawText: 預設為 true, 當設為 false 時將不會同時繪出文字, 但是有些 type 即使設為 true 也不會繪出文字. (1.0.6RC1 此處有bug)
  • drawText: 預設為 false, 當設為 true 時將增加一個檢查碼, 只有 Code39 格式有用.



SECTION 03 在 swing 中使用 barbecue

我們如果要在 swing 中使用, 範例程式如下, 因為 barcode 本身就是 JComponent, 所以可以直接 add();
import javax.swing.*;
import net.sourceforge.barbecue.BarcodeFactory;
import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.BarcodeException;
import net.sourceforge.barbecue.BarcodeImageHandler;

import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.*;
import java.io.FileOutputStream;
import java.io.IOException;

public class SwingApplication {


    public static void main(String[] args) {
        //Create the top-level container and add contents to it.
        JFrame frame = new JFrame("SwingApplication");
        SwingApplication app = new SwingApplication();

                Component contents = app.usingBarbecueAsSwingComponent();

        frame.getContentPane().add(contents, BorderLayout.CENTER);

        //Finish setting up the frame, and show it.
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }

        public Component usingBarbecueAsSwingComponent() {

                // Always get a Barcode from the BarcodeFactory
        Barcode barcode = null;
        try {
            barcode = BarcodeFactory.createCode128B("12345");
        } catch (BarcodeException e) {
            // Error handling
        }

                return barcode;
        }
}
執行的結果是.


SECTION 04 krysalis 的 barcode



#ASF License# , 目前版本 0.9, 由此下載 binary/source檔案


相同的, krysalis barcode 也有提供一個 krysalis-barcode.war, 你可以直接 deploy 到 %Tomcat_HOME%/webapps 之下, 直接 http://localhost:8080/krysalis-barcode 就可以看到執行的頁面了, krysalis barcode 主要輸出 SVG 圖檔格式為主, 如果沒有安裝過 SVG 的使用者, 可以到 adobe 的網站下載 SVG Viewer 3.0.1 . 當我輸入, type=code128, msg=12345, height=2.5cm, mw=0.5mm, wf=2, qz=10mw, hrp=bottom 的畫面如下





SECTION 05 krysalis barcode 的使用

也是相同的觀念, 使用了一個 org.krysalis.barcode.servlet.BarcodeServlet 作為接值及呈現的處理.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
  <servlet>
    <servlet-name>BarcodeServlet</servlet-name>
    <servlet-class>org.krysalis.barcode.servlet.BarcodeServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BarcodeErrorServlet</servlet-name>
    <servlet-class>org.krysalis.barcode.servlet.BarcodeErrorServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BarcodeServlet</servlet-name>
    <url-pattern>/gensvg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BarcodeErrorServlet</servlet-name>
    <url-pattern>/errsvg</url-pattern>
  </servlet-mapping>
  <mime-mapping>
    <extension>xhtml</extension>
    <!--mime-type>application/xhtml+xml</mime-type-->
    <!--the above is not supported by IE6-->
    <mime-type>text/html</mime-type>
  </mime-mapping>
  <mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg+xml</mime-type>
  </mime-mapping>
  <mime-mapping>
    <extension>svgz</extension>
    <mime-type>image/svg+xml</mime-type>
  </mime-mapping>
  <error-page>
    <exception-type>org.krysalis.barcode.BarcodeException</exception-type>
    <location>/errsvg</location>
  </error-page>
</web-app>

目前支援的 type 有以下幾種
  • Interleaved 2 of 5
  • Code 39
  • Codabar
  • Code 128
  • UPC-A
  • UPC-E
  • EAN-13
  • EAN-8



SECTION 06 krysalis barcode 輸出的 SVG 檔案

當我們執行 gensvg?type=code128&msg=12345&height=2.5cm&mw=0.5mm&wf=2&qz=10mw&hrp=bottom 他會產生一個 svg 檔案. 檔案內容就是 XML 檔案. 內容如下..
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg>
<svg 
        height="25mm" 
        width="49.5mm" 
        preserveAspectRatio="xMidYMid meet" 
        xmlns:xmlns="http://www.w3.org/2000/svg" 
zoomAndPan="magnify">
<g style="fill:black; stroke:none">
        <rect height="22.1781mm" width="1mm" x="5mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="6.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="8mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="10.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="11.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="13.5mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="16mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="18mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="19mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="21.5mm" y="0mm"/>
        <rect height="22.1781mm" width="2mm" x="22.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="25mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="27mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="28.5mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="31mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="32.5mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="34.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="35.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="38mm" y="0mm"/>
        <rect height="22.1781mm" width="1.5mm" x="40.5mm" y="0mm"/>
        <rect height="22.1781mm" width="0.5mm" x="42.5mm" y="0mm"/>
        <rect height="22.1781mm" width="1mm" x="43.5mm" y="0mm"/>
        <text 
          style="font-family:Helvetica; font-size:8.0pt; text-anchor:middle"
          x="24.75mm" 
          y="24.4356mm" 
          startOffset="0" >
                12345
        </text>
</g>
</svg>



SECTION 07 結論

目前我們所見到的都是屬於一維條碼, 未來希望能夠看到二維甚至多維條碼的製作或是其他 opensource 能夠出現. 當然, 如果你們有特別製作特殊的條碼格式, 或是有一些比較冷僻的條碼標準不在這兩個專案中, 希望你能夠加入他們的開發工程.. 感謝這麼多願意默默付出的工程師們, 相較之下, 自己非常的渺小....
參考 -- 相關書目或相關文章

  1. barbecue
    http://barbecue.sourceforge.net/
  2. barbecue api
    http://barbecue.sourceforge.net/apidocs/index.html
  3. krysalis barcode
    http://www.krysalis.org/barcode/
  4. krysalis barcode api
    http://www.krysalis.org/barcode/javadocs/index.html
贊助 -- 如果你覺得這個電子報對你有幫助, 可以匯款贊助, 如果需要刊登廣告, 也可聯絡 !
匯款帳號 : 第一銀行 板橋分行 201-10-071238

帳戶名稱 : 松凌科技股份有限公司

聯絡電話 : (02)8951-9554 # 121 王先生

聯絡Email: johnny@softleader.com.tw

人才招募 -- 松凌科技 徵才



>>徵求 Java 工程師 1 名<<



徵求有心向學的 Java 工程師加入我們的行列, 本公司的 Framework 採用 Struts 為基礎, 主要著重於 J2EE 相關系統開發 及 金融資訊的資訊整合應用, 目前的產品涵蓋了證券/期貨/基金 及 EIP/CMS 等, 工作內容以 WEB-Based J2EE 程式設計為主, 歡迎大家的加入.


應徵職稱: Java 軟體工程師

員工福利: 享有勞健保, 保障 14 個月年薪, 股票分紅等福利.

工作年資: 不拘, 也歡迎剛退伍或畢業的新鮮人加入

性別: 不拘, 只要能夠吃苦耐勞即可

人格特質: 聰明, 外向, 肯拼, 肯學

學經歷需求: 大專學校資訊相關科系畢業尤佳, 或具有 SCJP 認證, 有 SCWCD 將優先錄用

基本技能: JSP, MVC 概念, 了解 Struts 者優先錄用

聯絡電話: (02)8951-9554 #9 陳小姐

聯絡Email: yvonne@softleader.com.tw

履歷格式: http://www.softleader.com.tw/resume/resume.doc

廣告 -- 松凌科技 獨家贊助



>>軟體生產力提升計畫 -- 企業包班方案<<



如果你們公司正在想要轉型成為 java 的軟體公司,

或是已經採用 java 卻發現不得其門而入,

甚至工程師一直無法突破瓶頸,

松凌科技技術顧問團隊將帶領你們技術人員在五天的課程中,

了解整個 j2ee 的概觀以及標準的開發流程.



課程名稱: 建立 J2EE 標準的開發流程

課程編號: SLJ-021

課程時數: 40 小時

課程規劃:
  • J2EE 架構與概觀
  • 使用 Struts 建立一套完善的 MVC Framework
  • 建立自己的設計模組 Design Pattern
  • 使用 Hibernate 建立 O/R Mapping 的環境
  • 透過 JSTL 處理頁面端邏輯
  • 實作教育
基本開班人數: 10 人

收費標準: 每人 30,000 元, 超過一人酌收 5,000 元 ( 含稅, 大台北地區外需加上車馬費 )

聯絡電話: (02)8951-9554 # 111 陳先生

聯絡Email: kevin@softleader.com.tw

政府補助: 短中期輔導課程, 可申請軟體策進協會補助約 50% 的教育訓練費用

快速訂閱 -- 覺得好就訂閱吧~~~~
目前訂戶數: ; 目前發報數: ;
欣賞之前發行電子報 ;
投票區 ~ 覺得好就投票吧 !
有夠讚 不錯啦 普普說 蠻爛的 爛到最高點