Oracle中生成二维码图片_V1.1_WEB
更新时间:2023-05-29 04:31:01 阅读量: 实用文档 文档下载
- oracle生成随机数推荐度:
- 相关推荐
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)
未决与已决问题
未决问题
已决问题
正在阅读:
永九快速线KC12段交KS2路BD匝道挡土墙工程施工招标公告【模板】04-14
复习试题汇总11-29
12.4.2列方程组解应用题(2)05-10
2012经审会台帐 - 图文07-01
2011年《经济法概论》形成性考核作业册答案1-407-29
基于VHDL的数字密码器的设计05-05
2015届《创新设计》高考英语(北师大版)一轮活页训练(基础版)03-31
忘不了那句话作文700字07-10
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 二维码
- 生成
- Oracle
- 图片
- 1.1
- WEB
- 八年级上册英语3完形填空与5阅读理解(含答案,翻译)
- 政府公文写作手册——总论
- 马原哲学基本原理(考研复习备用)
- 华图教育2012国家公务员模拟题专项演练与解析
- 推进施工进度整改措施及方案
- 苏州现代物流业保持快速发展
- 苏州市各类社会组织评估考核细则
- 柞水县下梁中学女中学生自我保护意识教育活动实施方案
- 外来医疗器械管理制度
- 新中大SE年结(2007)
- 《渡劫》重磅优化 切换武器对应技能CD清除
- 高考英语一轮复习课时跟踪检测44 试题解析
- 苏教版三年级数学下册商中间、末尾有0的除法
- 十大皮衣品牌品牌
- 14.3.1提取公因式教学设计
- 小学语文课改工作计划
- 绿色节能施工技术在房屋建筑工程中的应用探讨 朱媛媛
- 教你钢琴过后如何复习
- 让亿万青年都有人生出彩的机会
- 小学三年级下册北师大版品德与社会全册教案及教学计划