发票二维码含义, 及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:第八个属性值,为随机产生的机密信息;

增值税专用发票:

01,01,1200154130,03630024,94339.62,20180721,AE2D,

其中"AE2D"为随机产生的机密信息;

增值税普通发票:

01,04,011001800211,65651348,1105.46,20180709,05903676700178588016,C62D,

其中"C62D"为随机产生的机密信息;

JAVA生成发票二维码

引入依赖

<dependency>
			<groupId>QRCode</groupId>
			<artifactId>qrcode</artifactId>
			<version>1.0.0</version>
			<scope>system</scope>
			<systemPath>${project.basedir}/lib/QRCode.jar</systemPath>
		</dependency>

字符串二维码或二维码读取

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、height
        g.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);
        }
    }
 
}

二维码测试

    @Test
    public 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();
        }
    }

生成样例
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要生成Java国税局发票二维码,您可以使用一些开源的Java库来实现。其中,Zxing是一个非常流行的二维码生成库,可以用于在Java生成二维码。 首先,您需要在您的项目中添加Zxing库的依赖。您可以在Maven或Gradle中添加以下依赖: Maven: ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency> ``` Gradle: ```groovy dependencies { implementation 'com.google.zxing:core:3.4.1' } ``` 接下来,您可以使用以下代码生成二维码: ```java import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { public static void main(String[] args) { String invoiceCode = "YOUR_INVOICE_CODE"; // 替换为您的发票代码 String invoiceNumber = "YOUR_INVOICE_NUMBER"; // 替换为您的发票号码 String content = "http://fpcy.gd-n-tax.gov.cn/WebQuery/validate?fpdm=" + invoiceCode + "&fphm=" + invoiceNumber; int width = 300; // 二维码的宽度 int height = 300; // 二维码的高度 String format = "png"; // 二维码的格式 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); try { BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); // 生成二维码的保存路径和文件名 Path filePath = Paths.get("path/to/save", "qrcode.png"); File outputFile = filePath.toFile(); MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile); System.out.println("二维码生成成功!"); } catch (Exception e) { System.out.println("二维码生成失败:" + e.getMessage()); } } } ``` 请注意,在上面的代码中,您需要将`YOUR_INVOICE_CODE`和`YOUR_INVOICE_NUMBER`替换为您的发票代码和发票号码。此外,您还需要指定生成的二维码的保存路径和文件名。 运行上述代码后,将会在指定的路径生成一个名为`qrcode.png`的二维码图片。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值