Oracle中生成二维码图片_V1.1_WEB

更新时间:2023-05-29 04:31:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

XYG ERP开发技术文档

利用Java技术

ORACLE中生成二维码图片

文档作者:

创建日期:

更新日期:

文档简称:

当前版本:

审批签字:

编制人:

审核人: 批准人: samt007@ 2013.10.9 2014.02.17 开发技术文档 1.1

文档控制

变更记录

审阅

分发

备注:

出于文档管理的目的,如果您收到了本文档的电子版本,请打印出来并在封面的相应位

置写上您的名字。

出于文档管理的目的,如果您收到了本文档的纸介质版本,请在封面写上您的名字。

目 录

文档控制 ................................................................................................................................... ii

开发需求_功能概述 ............................................................................................................... 13

基本业务需求 .................................................................................................................. 13

定义 .................................................................................................................................. 13

ERP开发组_开发技术概述 ................................................................................................... 14

方法步骤概述 .................................................................................................................. 14

具体开发详细步骤 .......................................................................................................... 14

程序测试 .......................................................................................................................... 21

未决与已决问题 ..................................................................................................................... 25

未决问题 .......................................................................................................................... 25

已决问题 .......................................................................................................................... 25

开发需求_功能概述

基本业务需求

定义

---该部分是功能的概述--- 二维码(2-dimensional bar code),又称二维条码,最早起源于日本,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中,可实现的应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共同享等等。 二维码是一种比一维码更高级的条码格式。一维码只能在一个方向(一般是水平方向)上表达信息,而二维码在水平和垂直方向都可以存储信息。一维码只能由数字和字母组成,而二维码能存储汉字、数字和图片等信息,因此二维码的应用领域要广得多。 随着二维码的推广,越来越多的公司已经比较倾向使用二维码替代旧的条码。 箱票打印 现在就有需求是,要打印箱票的二维码给客户。 安全性定义 1. 无

ERP开发组_开发技术概述

方法步骤概述

具体开发详细步骤 ---该部分是开发技术的逻辑说明--- 程序开发的逻辑过程大概是: 利用免费开源的Java工具(这里使用的是Swetake公司的QRCode,官网介绍 -- /qr/index-e.html),在数据库段编写一个基于Java的函数,通过调用Java的存储过程,来自动产生二维码图片到Oracle Ftp服务器。 接着对应的报表打印程序(例如箱票打印),利用XML打印对应的Ftp图片即可以实现打印出二维码图片的效果。 另外,我还研究了如何制作中间带图片的二维码。试想一下,在系统中打印出来的二维码中间出现公司的Logo,那对公司来说也是一种很好的宣传,而且是0成本的免费宣传。

一、 加载处理产生二维码图片的Java类到Oracle里面。

1. 将Qrcode.jar文件放在Ftp的特定的目录下面(如果没有com的目录,请新建):

cd $JAVA_BASE/com

2. 接着用Loadjava的命令,将jar文件加载到数据库。

提示:执行这个代码之后,如果没任何的报错提示,那应该是可以成功加载类到Oracle数据库了。

或者可以执行下面的语句确认这个类是否有成功加载:

SELECT object_name, object_type, status FROM user_objects

WHERE

object_type LIKE 'JAVA%' AND OBJECT_NAME LIKE '%Qrcode%';

二、 在Oracle中新增Java类,自动产生二维码图片到特定的目录下面。

新增的类的名称是:” XYGQRCodeEncoder”,代码为: createorreplaceandcompilejavasourcenamedas

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;

import

jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

/**

* 二维码生成器

*/

public class XYGQRCodeEncoder {

/**

* 生成二维码(QRCode)图片

*

* @param content

* @param imgPath

*/

public static String encoderQRCode(String content, String

imgPath) {

try {

Qrcode qrcodeHandler = new Qrcode();

qrcodeHandler.setQrcodeErrorCorrect('M');

qrcodeHandler.setQrcodeEncodeMode('B');

// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储

的信息越大

int size = 10;

qrcodeHandler.setQrcodeVersion(size);

System.out.println(content);

byte[] contentBytes = content.getBytes("gb2312");

int imgSize = 67 + 12 * (size - 1);

BufferedImage bufImg = new BufferedImage(imgSize,

imgSize, BufferedImage.TYPE_INT_RGB);

Graphics2D gs = bufImg.createGraphics();

gs.setBackground(Color.WHITE);

gs.clearRect(0, 0, imgSize, imgSize);

// 设定图像颜色 > BLACK

gs.setColor(Color.BLACK);

// 设置偏移量 不设置可能导致解析出错

int pixoff = 2;

// 输出内容 > 二维码

if (contentBytes.length > 0 && contentBytes.length <800) {

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,800 ].

");

//return "N";

}

gs.dispose();

bufImg.flush();

//System.out.println("7");

File imgFile = new File(imgPath);

//System.out.println("8");

// 生成二维码QRCode图片

ImageIO.write(bufImg, "png", imgFile);

//System.out.println("9");

return "Y";

} catch (Exception e) {

e.printStackTrace();

//return e.getMessage();

return "N";

}

}

/**

* 生成二维码(QRCode)图片 ,中间带Logo的

*

* @param content

* @param imgPath

* @param imgIcon

*/

public static String encoderQRCode(String content, String

imgPath, String imgIcon) {

try {

Qrcode qrcodeHandler = new Qrcode();

qrcodeHandler.setQrcodeErrorCorrect('M');

qrcodeHandler.setQrcodeEncodeMode('B');

// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储

的信息越大

int size = 12;

qrcodeHandler.setQrcodeVersion(size);

System.out.println(content);

byte[] contentBytes = content.getBytes("gb2312");

// 图片尺寸

int imgSize = 67 + 12 * (size - 1);

BufferedImage bufImg = new BufferedImage(imgSize,

imgSize, BufferedImage.TYPE_INT_RGB);

Graphics2D gs = bufImg.createGraphics();

gs.setBackground(Color.WHITE);

gs.clearRect(0, 0, imgSize, imgSize);

// 设定图像颜色 > BLACK

gs.setColor(Color.BLACK);

// 设置偏移量 不设置可能导致解析出错

int pixoff = 2;

// 输出内容 > 二维码

if (contentBytes.length > 0 && contentBytes.length <800) {

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,800 ].

");

//return "N";

}

Image img = ImageIO.read(new File(imgIcon));

gs.drawImage(img,

(imgSize-imgSize/6)/2,(imgSize-imgSize/6)/2,imgSize/6,imgSiz

e/6, null);

gs.dispose();

bufImg.flush();

//System.out.println("7");

File imgFile = new File(imgPath);

//System.out.println("8");

// 生成二维码QRCode图片

ImageIO.write(bufImg, "png", imgFile);

//System.out.println("9");

return "Y";

} catch (Exception e) {

e.printStackTrace();

//return e.getMessage();

return "N";

}

}

/**

* @param args

* the command line arguments

*/

public static void main(String[] args) {

/*

String imgPath = "/var/tmp/samt.png";

String content = "Oracle EBS Repository,你好,二维码!";

XYGQRCodeEncoder handler = new XYGQRCodeEncoder();

handler.encoderQRCode(content, imgPath); */

System.out.println("encoder QRcode success");

}

}

注意:该代码参考网上的资料:/pan_tian/article/details/8834567

三、 在Oracle中新增函数,调用第二步编写的Java类,产生二维码图片。

代码为(我这里用了一个java专用的PKG包):

CREATEORREPLACEPACKAGE.AS

/***********************************************************

*******************

NAME: XYG_ALJ_COMMON_PKG

PURPOSE: PKG For JAVA 相关逻辑处理

REVISIONS:

Ver Date Author Description

--------- ---------- ---------------

------------------------------------

1.0 2013/12/09 Sam.T 1,New Create the pkg

1.1 2014/01/27 Sam.T 增加带图标的版本

************************************************************

******************/

---全局参数

G_USER_ID NUMBER :=

NVL(FND_PROFILE.VALUE('USER_ID'),-1);--FND_ER_ID;

--User ID, Sysadmin here

G_LOGIN_ID NUMBER :=

NVL(FND_PROFILE.VALUE('login_ID'),-1); --FND_GLOBAL.LOGIN_ID; ---调试的级别

G_OUT_LEVEL0 NUMBER := 0;

G_OUT_LEVEL1 NUMBER := 1;

G_OUT_LEVEL2 NUMBER := 2;

G_OUT_LEVEL3 NUMBER := 3;

G_OUT_LEVEL4 NUMBER := 4;

G_OUT_LEVEL5 NUMBER := 5;

----

---是否为调试模式

/*

G_DEBUG_LEVEL:调试的级别

0:不启动调试

1:调试程序主要流程,不进入任何的循环

2:第一层主循环(游标的每批处理)的信息

3:第二层循环,进入到每一行的处理

4:第三层循环,每一行的明细的调试信息

5:第四层循环,调试最明细的信息

*/

G_DEBUG_LEVEL NUMBER := 0;

G_DEBUG_TYPE VARCHAR2(240) :=

'DBMS_OUTPUT';---DBMS_OUTPUT直接输出/FILE_OUTPUT文档输出

/REQUEST_OUTPUT请求日志输出

-----------------------------------------

--自动产生二维码图片,返回Y/N

---P_Content:二维码图片的内容

---P_ImgPath:二维码图片的文件路径。这个要注意的是,包括文件名的

-----------------------------------------

FUNCTION GENERATE_QRCode(P_Content STRING,P_ImgPath STRING)RETURN VARCHAR2;

-----------------------------------------

--自动产生二维码图片,中间带图片,返回Y/N

---P_Content:二维码图片的内容

---P_ImgPath:二维码图片的文件路径。这个要注意的是,包括文件名的

---P_imgIcon:二维码中间的图片的位置

-----------------------------------------

FUNCTION GENERATE_QRCode(P_Content STRING,P_ImgPath

STRING,P_imgIcon STRING) RETURN VARCHAR2;

-----------------------------------------

---如果用默认的公司图标,可以直接调用这个函数

-----------------------------------------

FUNCTION GENERATE_QRCode_ICON(P_Content STRING,P_ImgPath

STRING) RETURN VARCHAR2;

END;

CREATE OR REPLACE PACKAGE BODY APPS.XYG_ALJ_COMMON_PKG

AS

--==========================================================

=====

-- Log

--==========================================================

=====

PROCEDURE LOG (P_MSG IN VARCHAR2)

IS

BEGIN

FND_FILE.PUT_LINE (FND_FILE.LOG, P_MSG);

END LOG;

--==========================================================

=====

-- Output

--==========================================================

=====

PROCEDURE OUTPUT (P_MSG IN VARCHAR2)

IS

BEGIN

FND_FILE.PUT_LINE (FND_FILE.OUTPUT, P_MSG);

END OUTPUT;

---输入消息的级别。决定消息是否输出

---P_DEBUG_LEVEL:该消息的级别

----如果G_DEBUG_LEVEL设定:0:则是失效消息输出;1:消息级别<=1的会输

出;2:消息级别<=2的会输出

FUNCTION DEBUG_ENABLE(P_DEBUG_LEVEL IN NUMBER)

RETURN BOOLEAN

IS

BEGIN

RETURN P_DEBUG_LEVEL <= G_DEBUG_LEVEL;

END;

PROCEDURE DEBUGLOG (P_MSG IN VARCHAR2)

IS

BEGIN

IF G_DEBUG_TYPE = 'DBMS_OUTPUT' THEN

DBMS_OUTPUT.PUT_LINE(P_MSG);

ELSIF G_DEBUG_TYPE = 'FILE_OUTPUT' THEN

XYG_FND_FILE.PUT_LINE(FND_FILE.OUTPUT, P_MSG);

ELSIF G_DEBUG_TYPE = 'REQUEST_OUTPUT' THEN

LOG(P_MSG);

END IF;

END DEBUGLOG;

----------------------

------程序主体部分----

----------------------

FUNCTION GENERATE_QRCode(P_Content STRING,P_ImgPath STRING)RETURN VARCHAR2

IS

LANGUAGE JAVA NAME '

XYGQRCodeEncoder.encoderQRCode(ng.String,ng.St

ring) return ng.String';

FUNCTION GENERATE_QRCode(P_Content STRING,P_ImgPath

STRING,P_imgIcon STRING) RETURN VARCHAR2

IS

LANGUAGE JAVA NAME '

XYGQRCodeEncoder.encoderQRCode(ng.String,ng.St

ring,ng.String) return ng.String';

程序测试 FUNCTION GENERATE_QRCode_ICON(P_Content STRING,P_ImgPath STRING) RETURN VARCHAR2 IS L_imgIcon VARCHAR2(150); BEGIN SELECT

DIRECTORY_PATH||'Logo.png' INTO L_imgIcon

FROM all_directories WHERE DIRECTORY_NAME = 'XYG_FILE_DIR'; IF DEBUG_ENABLE(G_OUT_LEVEL1) THEN DEBUGLOG(L_imgIcon); END IF; RETURN GENERATE_QRCode(P_Content,P_ImgPath,L_imgIcon); EXCEPTION WHEN OTHERS THEN IF DEBUG_ENABLE(G_OUT_LEVEL1) THEN DEBUGLOG('出现异常错误!错误信息:'||SQLERRM); END IF; RETURN 'N'; END; END XYG_ALJ_COMMON_PKG;

1. 程序测试如下,新增二维码图片

SELECT XYG_JAVA_COMMON_PKG.GENERATE_QRCode('某某有限公司ORACLE

ERP开发组 网址:','/var/tmp/samt2.png') FROM DUAL

2. 到FTP看产生的图片文件:

这时候的二维码图片已经是正常产生了,可以用手机二维码软件扫描一下里面包括的内

容。

3. 测试二维码中间带Logo的版本:

对应产生的文件:

可以看到二维码出现中间的图标:

4. 在EBS的XML报表中打印的效果:

注意!

需要注意的是,除开一些特定的目录之外,别的目录是不可以直接产生文件的,其中一

个原因是由于文件目录的权限管控。

所以我们要调试为什么产生不了二维码。这时候,可以用下面的代码确认问题出现在哪

里: call dbms_java.set_output(5000);--当然,接着要打开Server output SELECT XYG_JAVA_COMMON_PKG.GENERATE_QRCode(

'某某有限公司ORACLE ERP开发组,网址:'

,'/data/uat/apps/apps_st/appl/xyg/12.0.0/forms/compile/samt2.p

ng') FROM DUAL

输出结果: 某某有限公司ORACLE ERP开发组,网址:

java.io.FileNotFoundException: Permission denied

at java.io.RandomAccessFile.open(Native Method) at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212) at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:44)

at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.j

ava:37) at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:391)

at javax.imageio.ImageIO.write(ImageIO.java:1483) at XYGQRCodeEncoder.encoderQRCode(XYGQRCODEENCODER)

ng.IllegalArgumentException: output == null! at javax.imageio.ImageIO.write(ImageIO.java:1435)

at javax.imageio.ImageIO.write(ImageIO.java:1488) at XYGQRCodeEncoder.encoderQRCode(XYGQRCODEENCODER)

未决与已决问题

未决问题

已决问题

本文来源:https://www.bwwdw.com/article/jlp4.html

Top