Oracle EBS中列印二維碼
阿新 • • 發佈:2019-02-20
Oracle EBS暫時還只支援一維碼,所以如需要二維碼的列印和掃描,需要自行開發。PL/SQL還沒有成熟的二維碼生成類庫,但Java已有很多二維碼生成和解碼的第三方類庫(比如,QRCode,ZXing...),這裡以比較簡單的QRCode為例演示怎麼輸出和解碼二維碼。一個QRCode的簡單例子:
二維碼圖片的生成:
涉及到的主要類庫:
- 編碼 lib:Qrcode_swetake.jar (官網介紹 -- http://www.swetake.com/qr/index-e.html)
- 解碼 lib:qrcode.jar (官網介紹 -- http://sourceforge.jp/projects/qrcode/)
二維碼圖片的生成:
import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; /** * 二維碼生成器 */ public class PTIANQRCodeEncoder { /** * 生成二維碼(QRCode)圖片 * * @param content * @param imgPath */ public void encoderQRCode(String content, String imgPath) { try { Qrcode qrcodeHandler = new Qrcode(); qrcodeHandler.setQrcodeErrorCorrect('M'); qrcodeHandler.setQrcodeEncodeMode('B'); qrcodeHandler.setQrcodeVersion(7); System.out.println(content); byte[] contentBytes = content.getBytes("gb2312"); BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); gs.setBackground(Color.WHITE); gs.clearRect(0, 0, 140, 140); // 設定影象顏色 > BLACK gs.setColor(Color.BLACK); // 設定偏移量 不設定可能導致解析出錯 int pixoff = 2; // 輸出內容 > 二維碼 if (contentBytes.length > 0 && contentBytes.length < 120) { boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } else { System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. "); } gs.dispose(); bufImg.flush(); File imgFile = new File(imgPath); // 生成二維碼QRCode圖片 ImageIO.write(bufImg, "png", imgFile); } catch (Exception e) { e.printStackTrace(); } } /** * @param args * the command line arguments */ public static void main(String[] args) { String imgPath = "D:/PTIAN_QRCode.png"; String content = "PTIAN Oracle EBS Repository,你好,世界"; PTIANQRCodeEncoder handler = new PTIANQRCodeEncoder(); handler.encoderQRCode(content, imgPath); System.out.println("encoder QRcode success"); } }
生成的圖片:
解析二維碼:
Output:import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage; import jp.sourceforge.qrcode.exception.DecodingFailedException; public class PTIANQRCodeDecoderHandler { /** * 解碼二維碼 * @param imgPath * @return String */ public String decoderQRCode(String imgPath) { // QRCode 二維碼圖片的檔案 File imageFile = new File(imgPath); BufferedImage bufImg = null; String decodedData = null; try { bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); decodedData = new String(decoder.decode(new J2SEImage(bufImg))); // try { // System.out.println(new String(decodedData.getBytes("gb2312"), // "gb2312")); // } catch (Exception e) { // // TODO: handle exception // } } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } catch (DecodingFailedException dfe) { System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace(); } return decodedData; } /** * @param args the command line arguments */ public static void main(String[] args) { PTIANQRCodeDecoderHandler handler = new PTIANQRCodeDecoderHandler(); String imgPath = "d:/PTIAN_QRCode.png"; String decoderContent = handler.decoderQRCode(imgPath); System.out.println("解析結果如下:"); System.out.println(decoderContent); System.out.println("========decoder success!!!"); } class J2SEImage implements QRCodeImage { BufferedImage bufImg; public J2SEImage(BufferedImage bufImg) { this.bufImg = bufImg; } public int getWidth() { return bufImg.getWidth(); } public int getHeight() { return bufImg.getHeight(); } public int getPixel(int x, int y) { return bufImg.getRGB(x, y); } } }
解析結果如下:
PTIAN Oracle EBS Repository,你好,世界
========decoder success!!!
Oracle EBS中如何使用QRCode來列印二維碼,ITPUB上已經有人通過JSP來呼叫QRCode做到了,最終可以在XML報表中列印,詳見帖子:http://www.itpub.net/thread-1755791-1-1.html
未完...