要讓 Java 透過標籤印表機(Lable Printer)列印標籤,一般會用 javax.comm 或者 RXTX 對 COM Port 送 PCL 語法來完成,簡單的文字排版加條碼(BarCode)用這種方式到還好,要是複雜的排版或者有圖片、Logo 這種非文字的圖形列印需求,那光串 PCL 這種跟機械語言差不多的語法就絕對足以讓人抓狂,圖型列印品質說也奇怪的就是會變差,甚至是根本串不出來,最近剛好有這需求,所以就聽印表機原廠建議,使用 BarTender 這套標籤排版列印軟體。 |
很神奇的網路上幾乎找不到 Java BarTender 有關的訊息,找了其他的標籤列印方案,才驚覺 Java 這方面的應用怎麼這麼貧瘠,明明有很多的系統都是 Java base 的,難不成標籤列印這塊都沒整合?最後求助 BarTender 原廠 Seagull Scientific,他們提供了一份 Sample Code ftp://ftp.seagullscientific.com/TechSupport/ActiveX/Java/BtAutoJavaEx.zip,結果竟然是 J# 版本 …,參考其他 Java 呼叫 ActiveX 的方式,最後用 SWT 成功的呼叫了 BarTender 的 ActiveX 達到了列印的目標。
首先要執行的列印工作的電腦必須安裝 BarTender,而且至少要自動化版(Automation),Seagull Scientific 官方網站可以取得全功能的三十天試用版。
第二個要件是 SWT Library,可到 http://eclipse.org/swt/ 取得,SWT 有分 32bit 跟 64bit,這視 JRE 安裝版本來決定。
第三部分是 JBarTenderPrinter Library,這部份就是筆者自行用 SWT 的方式呼叫 BarTender 的 ActiveX,因為 BarTender 的 ActiveX 功能受限了,無法像官方 .NET SDK 功能完善,對於一些例外也無法掌控,所以這邊就不推了,提供基本功能的 jar Library 供非商業性質使用。
這邊做個簡單的 Sample,開啟 eclipse 建立一個 Java Project,加入 swt.jat 以及 JBarTenderPrinter.jar 兩個 Library,最後建立一個 Class 名為 Sample 並包含 main method。
Sample Class Code 如下:
import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import com.jaips.com.JBarTenderPrinter.Application; public class Sample { public static void main(String[] args) { boolean rc = false; Shell shell = new Shell(); Application app = new Application(shell, SWT.NONE); try { rc = app.openFile("./lable/L1.btw"); if (!rc) { app.quitApp(); return; } app.setNameValue("PROD_NAME", "超真空保溫瓶"); app.setNameValue("PRICE", "NTD$999"); app.setNameValue("BARCODE", "90328475937"); app.printLabel(false, false); } catch (Exception e) { e.printStackTrace(); } finally { app.quitApp(); shell.close(); shell.dispose(); app = null; shell = null; } } }
接者打開 BarTender 建立一張簡單的標籤,這裡做一張兩個文字一個條碼的標籤。
設定動態傳入值,1. 滑鼠雙擊欲動態傳入值的欄位、2. 彈出文字物件視窗後選資料來源、3. 按 [進階] 按鈕切換模式、4. 共用/名稱 部分輸入變數名稱(自行命名需跟程式裡相同)。
於 BarTender 設定的變數名稱在程式裡用 setNameValue Method 填入(19~21 行部分)
執行程式結果(這裡用 XPS 代替印表機,故條碼無法列印。)
您好:
回覆刪除關於內文中的JBarTenderPrinter Library(http://ee.jaips.com/file/JBarTenderPrinter.jar)似乎是舊網域名稱, 目前連結已失效, 不知能否提供有效連結, 以造福其他網友, 謝謝
已修復,不過強烈建議參考 BarTender 標籤列印跨平台整合 使用 Commander 的方式,效能、錯誤處理 ... 都好得多,Java 寫文字檔也很容易。
回覆刪除感謝您的提供, 目前案子是以JSP執行, 利用文字檔當資料庫, 由於列印環境在工廠裡, 為避免人員誤操作, 所以需要client端的daemon執行列印, 取代Commander的效果
回覆刪除