1. 程式人生 > >java用JBarcode元件生成條形碼(支援自定義字型及顏色),圖文詳解之2-1

java用JBarcode元件生成條形碼(支援自定義字型及顏色),圖文詳解之2-1

前言:

JBarcode入門教程我就不寫了,可以參考:點選開啟連結

我的這篇教程和上篇部落格的不同之處:

1 上篇部落格直接生成二維碼圖片放到d盤的某個資料夾下,我的二維碼生成二維碼後直接用Base64編碼然後返回到前臺頁面。

2 上篇部落格只介紹了生成商品條形碼,其他二維如Code93碼、ISBN碼、ISSN碼、Code128碼等等都沒有介紹。我的部落格裡會介紹這些條碼怎麼生成。我文末會介紹常用條碼及其如何選擇適合自己專案的條碼。

部落格正文:

1 什麼是JBarcode工具,這個工具支援哪些條碼


2 如何用 JBarcode生成條形碼,我這裡提供生成商品條形碼和128條形碼

package barcode;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;

import javax.imageio.ImageIO;

import org.apache.commons.lang.StringUtils;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.encode.EAN13Encoder;
import org.jbarcode.encode.InvalidAtributeException;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WidthCodedPainter;

import sun.misc.BASE64Encoder;
 
public class BarcodeUtil {
	
	/**
     * 128條形碼
     *
     * @param strBarCode
     *            條形碼:0-100位
     * @param dimension
     *            商品條形碼:尺寸
     * @param barheight
     *            商品條形碼:高度
     * @return 圖片(Base64編碼)
     */
	  public static String generateBarCode128(String strBarCode,String dimension,String barheight) {
	        
	 
	        try {
	        	ByteArrayOutputStream outputStream = null;
	            BufferedImage bi = null;
	            int len = strBarCode.length();
	            JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(),
	                    WidthCodedPainter.getInstance(),
	                    EAN13TextPainter.getInstance());
	 
	            // 尺寸,面積,大小 密集程度
	            productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
	            // 高度 10.0 = 1cm 預設1.5cm
	            productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
	            // 寬度
	            productBarcode.setWideRatio(Double.valueOf(30).doubleValue());
//	      		    是否顯示字型
	            productBarcode.setShowText(true);
//	         	   顯示字型樣式
	            productBarcode.setTextPainter(BaseLineTextPainter.getInstance()); 
	 
	            // 生成二維碼
	            bi = productBarcode.createBarcode(strBarCode);
	            
	            outputStream = new ByteArrayOutputStream();
	            ImageIO.write(bi, "jpg", outputStream);
	            BASE64Encoder encoder = new BASE64Encoder();
//	          System.err.println(encoder.encode(outputStream.toByteArray()));

	            return encoder.encode(outputStream.toByteArray());
	        } catch (Exception e) {
	            e.printStackTrace();
	            return "encodeError";
	        }
	    }
	
	
	
	
 
    /**
     * 商品條形碼
     * @param strBarCode
     *            商品條形碼:13位
     * @param dimension
     *            商品條形碼:尺寸
     * @param barheight
     *            商品條形碼:高度
     * @return 圖片(Base64編碼)
     */
    public static String generateBarCode(String strBarCode,String dimension,String barheight) {
// 		isNumeric 是否是數值
//    	校驗。。。。。
        
 
        try {
        	ByteArrayOutputStream outputStream = null;
            BufferedImage bi = null;
            int len = strBarCode.length();
            JBarcode productBarcode = new JBarcode(EAN13Encoder.getInstance(),
                    WidthCodedPainter.getInstance(),
                    EAN13TextPainter.getInstance());
            
            String barCode = strBarCode.substring(0, len - 1);
            String code = strBarCode.substring(len - 1, len);
            
            //校驗13位
            String checkCode = productBarcode.calcCheckSum(barCode);
            if (!code.equals(checkCode)) {
                return "checkCodeError";
            }
 
 
            // 尺寸,面積,大小
            productBarcode.setXDimension(Double.valueOf(dimension).doubleValue());
            // 高度 10.0 = 1cm 預設1.5cm
            productBarcode.setBarHeight(Double.valueOf(barheight).doubleValue());
            // 寬度
            productBarcode.setWideRatio(Double.valueOf(25).doubleValue());
            
            // 是否校驗13位,預設false
            productBarcode.setShowCheckDigit(true);
            
          //顯示字串內容中是否顯示檢查碼內容
//          productBarcode.setShowCheckDigit(true);
 
            // 生成二維碼
            bi = productBarcode.createBarcode(barCode);
            
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(bi, "jpg", outputStream);
            BASE64Encoder encoder = new BASE64Encoder();
//          System.err.println(encoder.encode(outputStream.toByteArray()));

            return encoder.encode(outputStream.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
            return "encodeError";
        }
    }
 
    /**
     * @param args
     * @throws InvalidAtributeException
     */
    public static void main(String[] args) throws InvalidAtributeException {
 
        String encode = BarcodeUtil.generateBarCode("6936983800013","0.5","30");
        String encode2 = BarcodeUtil.generateBarCode128("69369833450938430579753045230800013","0.5","30");
 
        System.out.println(encode);
 
    }
 
}

有的讀者想生成Code 11, Code 93型別的條碼怎麼生成呢?很簡單

答案就在建立Jbarcode物件程式碼裡,如果你想生成128條碼

 JBarcode productBarcode = new JBarcode(Code128Encoder.getInstance(),
	                    WidthCodedPainter.getInstance(),
	                    EAN13TextPainter.getInstance());
如果你想生成EAN13Ender條碼
JBarcode productBarcode = new JBarcode(EAN13Encoder.getInstance(),
                    WidthCodedPainter.getInstance(),
                    EAN13TextPainter.getInstance());

看到紅色字型裡了吧,想生成什麼條碼直接xxx.getInstance即可,簡單吧

3 頁面顯示

生成圖片後,用Base64編碼後得到字串,假如為:"123xyz"

頁面jsp裡<img src="data:image/png;base64,123xyz"/>即可

注意-注意條形碼的字型樣式!!!

我當時就在這裡栽了,不同的字型樣式顯示效果不一樣,甚至可以用天上地下來形容他們的差距。最後沒辦法,只有看原始碼找到了控制條碼字型樣式的方法。

祝你成功!

對部落格哪裡不懂得地方歡迎留言提問!

相關推薦

javaJBarcode元件生成條形碼(支援定義字型顏色),圖文2-1

前言: JBarcode入門教程我就不寫了,可以參考:點選開啟連結 我的這篇教程和上篇部落格的不同之處: 1 上篇部落格直接生成二維碼圖片放到d盤的某個資料夾下,我的二維碼生成二維碼後直接用Base64編碼然後返回到前臺頁面。 2 上篇部落格只介紹了生成商品條形碼,其他二維

mybatis-generator程式碼生成支援定義型別轉換)

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

定義的CircleProgressBar,支援定義寬度,顏色等等。

基於Anbase框架優化了了一個自定義的CircleProgressBar,onDraw方法如下 @Override protected void onDraw(Canvas canvas) {

Hive執行過程中出現Caused by : java.lang.ClassNotFoundException: org.cloudera.htrace.Trace的錯誤解決辦法(圖文

pre wid logs In 實用 過程 ase edit 微信     不多說,直接上幹貨! 問題詳情     如下   這個錯誤的意思是缺少 htrace-core-2.04.jar。  解決辦法:   

安卓定義View進階-MotionEvent

Android MotionEvent 詳解,之前用了兩篇文章 事件分發機制原理 和 事件分發機制詳解 來講解事件分發,而作為事件分發主角之一的 MotionEvent 並沒有過多的說明,本文就帶大家瞭解 MotionEvent 的相關內容,簡要介紹觸控事件,主要包括 單點觸控、多點

安卓定義View進階-Matrix

這應該是目前最詳細的一篇講解Matrix的中文文章了,在上一篇文章Matrix原理中,我們對Matrix做了一個簡單的瞭解,偏向理論,在本文中則會詳細的講解Matrix的具體用法,以及與Matrix相關的一些實用技巧。 ⚠️ 警告:測試本文章示例之前請關閉硬體加速。

Java定時任務Timer排程器【一】 原始碼分析(圖文版)

就以鬧鐘的例子開頭吧(後續小節皆以鬧鐘為例,所有原始碼只列關鍵部分)。 public class ScheduleDemo { public static void main(String[] args) throws InterruptedException {

步步1節----ALTERA FPGA關於PLL的使用,幫你光所有PLL

PLL 建立工程 建立新工程 引導說明,點選next 設定工程路徑,不能有中文;設定工程名稱,點選next 點選next 選擇器件庫,這裡選擇cyclone IV E,器件型號為EP4C6EE22C8,該器件有兩個PLL; 點選next 呼叫

JavaWeb學習篇----定義標籤 JSTL標籤庫

                今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介:自定義標籤主要用於移除Jsp頁面中的java程

input type=“range”滑塊定義樣式,實現步驟實際應用

寫在前面: 本文的主要內容包括:type="range"屬性介紹,修改range預設css樣式以及在js中的實際應用。本文面向前端小白,寫的不好之處,請多多見諒。文末有demo連結,可以自行復制到本地進行試驗。 最終要實現的效果: 其中包括一部分js程式碼

一步一步帶你實現定義圓形進度條(

        每次看到別人做出炫酷的都會想,這個應該很難吧?這是心理上先入為主的就這麼認為了,其實實現很簡單,下面一步一步的詳細剖析自定義圓形進度條的步驟。 首先看效果圖: 篇幅有點長,耐心看完肯定get新技能。 看每一個檢視都包含了些什麼。 最

前端載入定義字型速度優化

今天是2.14情人節,也是另一個重要的日子,那就是我的第一個全棧專案上線啦~~~ 這個是公司的官網,採用Python+Django做後端,前端也用了gulp自動化工作流,使用了前後端分離的開發方式,從年前弄到現在,雖然之後肯定還會有小的迭代和修改,一些輪播

JavaWeb學習篇----定義標籤&&JSTL標籤庫

今天來看一下自定義標籤的內容,自定義標籤是JavaWeb的一部分非常重要的核心功能,我們之前就說過,JSP規範說的很清楚,就是Jsp頁面中禁止編寫一行Java程式碼,就是最好不要有Java指令碼片段,下面就來看一下自定義標籤的簡介: 自定義標籤主要用於移除Jsp頁面中的ja

定義指令的各種屬性

【一】 自定義指令的兩種方式           1. 通過 module.directive(name,directiveFactory) 定義 , 如:         (function() { angular.module(

Jmeter(十五) - 從入門到精通 - JMeter匯入定義的Jar包(教程)

1.簡介   原計劃這一篇是介紹前置處理器的基礎知識的,結果由於許多小夥伴或者童鞋們在微信和部落格園的短訊息中留言問如何引入自己定義的Jar包呢???我一一回復告訴他們和引入外掛的Jar包一樣的道理,一通百通。但是感覺他們還是很迷糊很迷惘,因此在這裡穿插一篇匯入自定義的Jar包。還有另外一個原因就是前置處理器

Java WebService接口生成和調 圖文

cto 技術分享 tex 什麽 wsdl eclipse ces 硬件 block webservice簡介: Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數據或集成。依據Web Service規範實施

使用PHP生成二維碼支援定義logo(致敬李明老師)

二維碼對於我們來說已經不陌生了,可以說是無處不在,購物、轉賬等很多場合都需要用到二維碼,我們平時大多數是在掃描二維碼,那麼二維碼如何生成呢?接下來介紹一下使用PHPqrCode生成二維碼並且可以嵌入自己的logo。PHPqrCode似乎很久不更新了,不支援自定義logo,並且在測試過程中還有一小點b

Kettle控制元件介紹(1):生成記錄、定義常量資料

這邊主要介紹2個控制元件,生成記錄以及自定義常量資料,屬於kettle輸入項裡。 一、生成記錄: 這是生成記錄的轉換圖,生成記錄的具體值如下: 如圖,建立三個欄位,分別為A、B、C,對其定義欄位型別和欄位值。最上面的"限制"是限制展示的數量;如圖,"限制"為5,那就展示5行。 結

IOS控制元件系列二---優雅的UITableView的MVC模式設計,支援定義下拉重新整理/上提載入更多檢視(含swift)

demo效果如下: 本小框架設計原則依舊按照之前的慣例: 1.擴充套件性好,程式碼不冗餘(整個重新整理的頭部與底部程式碼不超過300行)。 2.邏輯清晰。 3.回撥介面清晰。 4.移植性好。 對於擴充套件性本框架擴充套件點如下: 1.框架中的

Javapoi解析Excel,支援xls/xlsx

由於JXL不能支援.xlsx的Excel檔案,因此採用POI。 這裡要用到的Jar包只需要:org.apache.poi 3.15和org.apache.poi-ooxml 3.15 在POI中,解析.XLS使用的是HSSFWorkbook,解析.XLSX的