发票二维码含义, 及java生成二维码
- 目录
- 发票二维码的含义
- 二维码
- 扫描结果
- 结果解析
- 样例
- 增值税电子普通发票:
- 增值税专用发票:
- 增值税普通发票:
- JAVA生成发票二维码
- 引入依赖
- 字符串二维码或二维码读取
- 二维码测试
- 生成样例
发票二维码的含义
二维码
从发票上截取的二维码
扫描结果
01,10,011001800211,65651348,105.46,20180709,05903676700178588016,C62D,
结果解析
样例
增值税电子普通发票:
01,10,011001800211,65651348,105.46,20180709,05903676700178588016,C62D,
该字符串以逗号分隔每一个属性值,从左到右依次是:
01:第一个属性值,尚未搞清楚含义;
10:第二个属性值,代表发票种类代码,10-增值税电子普通发票,04-增值税普通发票,01-增值税专用发票;
011001800211:第三个属性值,代表发票代码;
65651348:第四个属性值,代表发票号码;
105.46:第五个属性值,代表开票金额;
20180709:第六个属性值,代表开票日期,该值为2018年7月9日;
05903676700178588016:第七个属性值,代码发票校验码,我们都知道增值税专用发票是没有发票校验码的,没有则为空字符串;
C62D:第八个属性值,为CRC算法产生的机密信息;
增值税专用发票:
01,01,1200154130,03630024,94339.62,20180721,,AE2D,
其中"AE2D"为随机产生的机密信息;
增值税普通发票:
01,04,011001800211,65651348,1105.46,20180709,05903676700178588016,C62D,
其中"C62D"为CRC算法产生的机密信息;
JAVA生成发票二维码
引入依赖
<dependency><groupId>QRCode</groupId><artifactId>qrcode</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/lib/QRCode.jar</systemPath></dependency>
字符串二维码或二维码读取
package com.bosssoft.cloud.coreservice.pdf.help;import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;import javax.imageio.ImageIO;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.swetake.util.Qrcode;import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;/*** Title: QRCodeUtil.java* * @author hmc* @date 2018年7月18日* <p>* Description:二维码生成工具* </p>* */
public class QRCodeUtil {private static Logger logger = LoggerFactory.getLogger(QRCodeUtil.class);/*** 生成二维码,返回二维码图片字节数组* * @param encodeddata 要包装成二维码的字符串* @return* @throws IOException*/public static byte[] qrCodeEncode(String encodeddata) throws IOException {Qrcode qrcode = new Qrcode();qrcode.setQrcodeErrorCorrect('L');// 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关qrcode.setQrcodeEncodeMode('B');qrcode.setQrcodeVersion(7);// 设置Qrcode包的版本byte[] d = encodeddata.getBytes("GBK"); // 字符集BufferedImage bi = new BufferedImage(139, 139, BufferedImage.TYPE_INT_RGB);// createGraphics // 创建图层Graphics2D g = bi.createGraphics();g.setBackground(Color.WHITE); // 设置背景颜色(白色)g.clearRect(0, 0, 139, 139); // 矩形 X、Y、width、heightg.setColor(Color.BLACK); // 设置图像颜色(黑色)if (d.length > 0 && d.length < 123) {boolean[][] b = qrcode.calQrcode(d);for (int i = 0; i < b.length; i++) {for (int j = 0; j < b.length; j++) {if (b[j][i]) {g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);}}}}g.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象bi.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源// 输出ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(bi, "png", bos);bos.close();return bos.toByteArray();}/*** 解析二维码,返回解析内容* * @param imageFile* @return*/public static String qrCodeDecode(byte[] imageByte) {String decodedData = null;QRCodeDecoder decoder = new QRCodeDecoder();BufferedImage image = null;try {ByteArrayInputStream bais = new ByteArrayInputStream(imageByte);image = ImageIO.read(bais);bais.close();} catch (IOException e) {logger.error("二维码解析Error: " + e.getMessage());}try {decodedData = new String(decoder.decode(new MyQRCodeImage(image)), "GBK");} catch (DecodingFailedException dfe) {logger.error("Error: " + dfe.getMessage());} catch (UnsupportedEncodingException e) {logger.error("Error: " + e.getMessage());}return decodedData;}static class MyQRCodeImage implements QRCodeImage {BufferedImage image;public MyQRCodeImage(BufferedImage image) {this.image = image;}public int getWidth() {return image.getWidth();}public int getHeight() {return image.getHeight();}public int getPixel(int x, int y) {return image.getRGB(x, y);}}}
二维码测试
@Testpublic void testQR() {String filePath = "D:\\practice\\targetQR.png";// 二维码内容
// String encodeddata = "01,01,1200154130,03630024,94339.62,20180721,,C62D,";String encodeddata = "01,04,011001800211,65651348,1105.46,20180709,05903676700178588016,C62D,";
// String encodeddata = "01,04,1100162320,80050866,189.62,20161221,50138840680157228141,A6F0,";byte[] qrCodeEncode = null;try {qrCodeEncode = QRCodeUtil.qrCodeEncode(encodeddata);writeFile(qrCodeEncode, filePath);} catch (IOException e) {e.printStackTrace();}// 解码String reText = QRCodeUtil.qrCodeDecode(qrCodeEncode);System.out.println(reText);}private void writeFile(byte[] bytes, String target) {File file = new File(target);try {if (!file.exists())file.createNewFile();FileOutputStream fos = new FileOutputStream(file);fos.write(bytes);fos.close();} catch (Exception e) {System.out.println("写入文件异常");e.printStackTrace();}}
后四位随机数生成方法
/*** 电子发票生成二维码图片的规则* * @param* @return*/public static String generateEInvoiceQuickMarkStr(String invoiceCode,String invoiceNumber,String totalAmount,String invoiceDate,String checkCode) {StringBuilder builder = new StringBuilder("01,").append(InvoiceType.TAX_E_INVOICE.getType()).append(",").append(invoiceCode).append(",").append(invoiceNumber).append(",").append(totalAmount).append(",").append(invoiceDate).append(",").append(checkCode).append(",");return new StringBuilder(builder).append(Integer.toHexString(CRC16_MINIM(builder.toString().getBytes())).toUpperCase()).append(",").toString();}/*** CRC16_X25:多项式x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或** @param buffer* @return*/public static int CRC16_MINIM(byte[] buffer) {int wCRCin = 0x0000; // initial value 65535int wCPoly = 0x8005; // 1000 0000 0000 0101for (byte b : buffer) {for (int i = 0; i < 8; i++) {boolean bit = ((b >> (7 - i) & 1) == 1);boolean c15 = ((wCRCin >> 15 & 1) == 1);wCRCin <<= 1;if (c15 ^ bit)wCRCin ^= wCPoly;}}wCRCin &= 0xffff;return wCRCin ^= 0x0000;}
生成样例
发票二维码含义, 及java生成二维码相关推荐
- java 生成二维码 QRCode、zxing 两种方式
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...
- 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...
二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api. Zxing是Google提供的关于条码 ...
- java生成二维码打印到浏览器
java生成二维码打印到浏览器 解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...
- Java生成二维码带LOGO底部标题竖版字体
前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...
- java生成二维码,并在前端展示。
java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...
- java生成二维码(链接生成二维码)
Java二维码如何生成? awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com. ...
- java生成二维码到文件,java生成二维码转成BASE64
java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...
- java生成二维码扫描跳转到指定的路径URL
java生成二维码扫描跳转到指定的路径URL 导入依赖 <dependency><groupId>com.google.zxing</groupId><art ...
- Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码
Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...
最新文章
- kotlin与java对比
- OpenCV矩阵可视化工具包
- Linux 进阶笔记(一)
- [WinError 127] 找不到指定的程序
- 常见多媒体文件格式及视音频编解码总结
- 使用 dotnet format 格式化代码
- jsp实现网页的在线调查功能
- oracle 数据库由Linux平台向Windows平台迁移
- python定时器及数据库操作
- Commons-logging + Log4j 使用方法、常见问题
- [转载] 用pandas进行数据分析实战
- VS2010/VS2012/VS2015下openGL环境配置(转)
- FreeSwitch中,RGB颜色转换为YUV
- 最常用的GitHub—— Android 开源项目整理(精品)
- 三层交换机/路由器OSPF配置详解【华为eNSP实验】
- ThingJS 和three.js对比开发太空漫游技术!3D 可视化
- TN.STN液晶屏常见问题及解决办法
- MySQL插入数据时报错Cause: java.sql.SQLException: #HY000
- 操作系统——文件管理实验
- 数学机器人不解人意?