首页 > 编程语言 >java: 用百度API读取增值税发票信息

java: 用百度API读取增值税发票信息

时间:2023-09-30 18:14:36浏览次数:31  
标签:baidu java 读取 aip API import com String

 

/**
 * encoding: utf-8
 * 版权所有 2023 涂聚文有限公司
 * 许可信息查看:https://github.com/Baidu-AIP/java-sdk/blob/master/src/main/java/com/baidu/aip/http/AipRequest.java
 * 描述:
 * # Author    : geovindu,Geovin Du 涂聚文.
 * # IDE       : IntelliJ IDEA 2023.1 Java 17
 * # Datetime  : 2023 - 2023/9/30 - 16:31
 * # User      : geovindu
 * # Product   : IntelliJ IDEA
 * # Project   : EssentialAlgorithms
 * # File      : BaiduAuthService.java  类
 * # explain   : 学习
 **/

package SortingAlgorithms;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import com.baidu.aip.util.Base64Util;
import com.baidu.aip.http.AipHttpClient.*;
import com.baidu.aip.client.*;
import com.baidu.aip.client.BaseClient;
import com.baidu.aip.error.AipError;
import com.baidu.aip.http.AipRequest;
import com.baidu.aip.util.Base64Util;
import com.baidu.aip.util.ImageUtil;

import com.baidu.aip.util.Util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.stream.FileImageInputStream;

import org.json.JSONArray;
import org.json.JSONObject;

import com.baidu.aip.ocr.AipOcr;

import java.net.URLEncoder;

public class BaiduAuthService {


    /**
     *https://github.com/Baidu-AIP/java-sdk/blob/master/src/main/java/com/baidu/aip/ocr/AipOcr.java
     *
     * */
    public static String getAuth() {
        // 官网获取的 API Key 更新为你注册的
        String clientId = "QuXMNizc80gTmUznKDRqQX3D";
        // 官网获取的 Secret Key 更新为你注册的
        String clientSecret = "h6aHaGLssw51CYGtR3dvX1wGg6BBm0zi";
        return getAuth(clientId, clientSecret);
    }
    /**
     *
     *
     * */
    public static String getAuth(String ak, String sk) {
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            Logger logger = LoggerFactory.getLogger(BaiduAuthService.class);
            JSONObject jsonObject = new JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            logger.info("获取百度token成功,access_token:{}", access_token);
            return access_token;
        } catch (Exception e) {
            Logger logger = LoggerFactory.getLogger(BaiduAuthService.class);
            logger.error("获取百度token失败, {}", e);
            //throw  //logger.error("获取百度OCR token失败{}",e);
            //throw e.toString();
            return  "";
        }
    }

    /**
     *
     *
     * */
    public static String vatInvoice(String filePath) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice";
        try {
            // 本地文件路径
            //String filePath = "[本地文件路径]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = getAuth();

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *
     * 这个有效
     * */
    public static byte[] image2byte(String path){
        byte[] data = null;
        FileImageInputStream input = null;
        try {
            //图片输入
            input = new FileImageInputStream(new File(path));
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int numBytesRead = 0;
            while ((numBytesRead = input.read(buf)) != -1) {
                output.write(buf, 0, numBytesRead);
            }
            data = output.toByteArray();
            output.close();
            input.close();

        }  catch (FileNotFoundException ex1) {
            ex1.printStackTrace();
        }
        catch (IOException ex1) {
            ex1.printStackTrace();
        }
        return data;
    }


}

  

    /**
     * 
     * 
     * */
    public static String baiduOCR()
    {
        String result="";
        //result= SortingAlgorithms.BaiduAuthService.vatInvoice("C:\\Users\\geovindu\\IdeaProjects\\EssentialAlgorithms\\src\\fapiao.png");
        //System.out.println(result);


        JSONObject jsonObject=new JSONObject();
        //以token信息创建api调用对象
        com.baidu.aip.ocr.AipOcr aipOcr=new AipOcr("40226401", "QuXMNizc80gTmUznKDRqQX3D", "h6aHaGLssw51CYGtR3dvX1wGg6BBm0zi");
       // com.baidu.aip.ocr.AipOcr aipOcr=new AipOcr("10728591", "k1qEDIj16cfpEQU1FUGYEXIG", "NGZqqvWlaoS8Ydqfz0EtLYKu7ebkiQMW");
        //定义装图片信息的byte数组
        byte[] img=null;
        //图片本地地址
        String path="C:\\Users\\geovindu\\IdeaProjects\\EssentialAlgorithms\\src\\fapiao.png";
        //转换为byte数组
        img=SortingAlgorithms.BaiduAuthService.image2byte(path);
        System.out.println(img);

        //调用Api可选参数,把返回文字外接多边形顶点位置设为true
        HashMap<String, String> options=new HashMap<String, String>();
        options.put("vertexes_location", "true");

        System.out.println("SDK:");
        //请求百度接口识别图片
        jsonObject=aipOcr.general(img,null);
        // int logid=jsonObject.getInt("log_id");
        //  System.out.println("log_id"+logid);
        JSONArray jsonArray=jsonObject.getJSONArray("words_result");
        for(int i=0;i<jsonArray.length();i++) {
            JSONObject object = (JSONObject) jsonArray.get(i);
            String words=object.getString("words");
            JSONObject location=(JSONObject) object.get("location");
            System.out.println("words  "+words);
            System.out.println("location"+location);
        }
        return  result;

    }

  

调用:

 SortingExmaple.baiduOCR();

  

 

标签:baidu,java,读取,aip,API,import,com,String
From: https://www.cnblogs.com/geovindu/p/17738059.html

相关文章

  • 【RuoYi移动端】uni-app中通过vuex的store来实现全局变量的修改和读取
    一、在store文件中新建csjVar.js文件constcsjVar={csjMess:[{aaa:"ok"},{bbb:"no"}]}exportdefaultcsjVar二、修改store文件中新建index.js文件importVuefrom'vue'importVuexfrom'vuex'importuserfrom'@/store/modules/user�......
  • API商品数据接口调用
    一、API商品数据接口概述API商品数据接口是一种通用的数据交互方式,它允许不同系统之间进行数据传输和交互。API商品数据接口可以使用各种不同的协议和标准来实现,例如RESTfulAPI、SOAP、XML-RPC等。其中RESTfulAPI是最常用的一种,它基于HTTP协议和JSON格式进行数据传输,具有简单易用......
  • java面试点
    语法基础关键字:final:用于表示某个变量、方法或类是最终的,不能被修改或继承super:可用于调用父类的方法或者字段synchronized:用于指定多线程代码中的同步方法、变量或者代码块transient:修饰的字段不会被序列化const在C语言中是声明常量的关键字,在Java中可以使用publ......
  • Java:Springboot和React中枚举值(数据字典)的使用
    目录1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章1、开发中的需求开发和使用过程中,通常会涉及四个角色:数据库管理员、后端开发人员、前端开发人员、浏览者数据库使用int类型的数值进行存储(eg:0、1、2)Java代码使用enum枚举类型的对象进行......
  • Java代码for循环太多,解决方式
    如何解决java代码for循环太多呢?这样写publicclassforhu{publicstaticvoidmain(String[]args){List<Student>stus=newArrayList<>();for(inti=0;i<stus.size();i++){Studentstu=stus.get(i);Integerv......
  • NET Core 6.0之读取配置文件
    ASP.NETCore默认加载顺序是appsettings.json->appsettings.Environment.json,它会根据当前的运行环境去加载不同的配置文件,最后appsettings.Environment.json值将替代appsettings.json中的值,如果没有多个值,则取默认值。在开始之前,我们先在appsettings.json中新增一些配置信息......
  • Java 变量之变量数据类型
    Java变量之变量数据类型Java数据类型图:1.基本数据类型基本数据类型,也称内置类型,是可以在栈直接分配内存的,Java保留基本数据类型最大的原因也在此:性能。关于这一点可以参考:Java为什么需要保留基本数据类型。另外,要注意,Java是基于JVM的,所以,其所占字节固定,与机器平台无关......
  • java的基本语法、注释、关键字、标识符
    1.1.1Java的基本语法每一种编程语言都有一套自己的语法规范,Java语言也不例外,同样需要遵从一定的语法规范,如代码的书写、标识符的定义、关键字的应用等。因此要学好Java语言,首先需要熟悉它的基本语法。本节将针对Java的基本语法进行详细讲解。Java的基本语法格式编写......
  • Java集合框架(部分)
    类图List:有序可重复集合特点1.元素允许重复2.元素有序(元素的顺序就是插入时的顺序)3.元素可以通过索引来访问或者设置{ArrayLIst:底层为数组,查询速度快,增删慢LinkedList:底层是链表,查询速度慢,增删快两者的优缺点,:效率高,线程不安全}Set:无序不可重复集合HashSet:底层为数组,......
  • java springboot项目,mybatisplus,import com.baomidou.mybatisplus.core.mapper.BaseMa
    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version><!--用版本2.1.9就不行,UserMapper里BaseMapper爆红--></dependency>我的结果是,......