文字识别

    增值税发票识别

    接口描述

    支持对增值税普票、专票、卷票、电子发票的所有字段进行结构化识别,包括发票基本信息、销售方及购买方信息、商品信息、价税信息等,其中四要素识别准确率超过 99.9%; 同时,支持对增值税卷票的 16 个关键字段进行识别,包括发票类型、发票代码、发票号码、机打号码、机器编号、销售方纳税人识别号、开票日期、购买方纳税人识别号、项目、单价、数量、金额、税额、合计金额(小写)、合计金额(大写)、校验码,四要素平均识别准确率可达95%以上。

    请求说明

    请求示例

    HTTP 方法:POST

    请求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice

    URL参数:

    参数
    access_token 通过API Key和Secret Key获取的access_token,参考“Access Token获取

    Header如下:

    参数
    Content-Type application/x-www-form-urlencoded

    Body中放置请求参数,参数详情如下:

    请求参数

    参数 是否必选 类型 可选值范围 说明
    image string - 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式
    accuracy string normal/high normal(默认配置)对应普通精度模型,识别速度较快,在四要素的准确率上和 high 模型保持一致,high对应高精度识别模型,相应的时延会增加,因为超时导致失败的情况也会增加(错误码282000)
    type string normal/roll 进行识别的增值税发票类型,默认为 normal,可缺省
    - normal:可识别增值税普票、专票、电子发票
    - roll:可识别增值税卷票

    请求代码示例

    提示一:使用示例代码前,请记得替换其中的示例Token、图片地址或Base64信息。

    提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。

    curl -i -k 'https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=【调用鉴权接口获取的token】' --data 'image=【图片Base64编码,需UrlEncode】' -H 'Content-Type:application/x-www-form-urlencoded'
    # encoding:utf-8
    
    import requests
    import base64
    
    '''
    增值税发票识别
    '''
    
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
    # 二进制方式打开图片文件
    f = open('[本地文件]', 'rb')
    img = base64.b64encode(f.read())
    
    params = {"image":img}
    access_token = '[调用鉴权接口获取的token]'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print (response.json())
    package com.baidu.ai.aip;
    
    import com.baidu.ai.aip.utils.Base64Util;
    import com.baidu.ai.aip.utils.FileUtil;
    import com.baidu.ai.aip.utils.HttpUtil;
    
    import java.net.URLEncoder;
    
    /**
    * 增值税发票识别
    */
    public class VatInvoice {
    
        /**
        * 重要提示代码中所需工具类
        * FileUtil,Base64Util,HttpUtil,GsonUtils请从
        * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
        * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
        * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
        * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
        * 下载
        */
        public static String vatInvoice() {
            // 请求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 = "[调用鉴权接口获取的token]";
    
                String result = HttpUtil.post(url, accessToken, param);
                System.out.println(result);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            VatInvoice.vatInvoice();
        }
    }
    #include <iostream>
    #include <curl/curl.h>
    
    // libcurl库下载链接:https://curl.haxx.se/download.html
    // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
    const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice";
    static std::string vatInvoice_result;
    /**
    * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
    * @param 参数定义见libcurl文档
    * @return 返回值定义见libcurl文档
    */
    static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
        // 获取到的body存放在ptr中,先将其转换为string格式
        vatInvoice_result = std::string((char *) ptr, size * nmemb);
        return size * nmemb;
    }
    /**
    * 增值税发票识别
    * @return 调用成功返回0,发生错误返回其他错误码
    */
    int vatInvoice(std::string &json_result, const std::string &access_token) {
        std::string url = request_url + "?access_token=" + access_token;
        CURL *curl = NULL;
        CURLcode result_code;
        int is_success;
        curl = curl_easy_init();
        if (curl) {
            curl_easy_setopt(curl, CURLOPT_URL, url.data());
            curl_easy_setopt(curl, CURLOPT_POST, 1);
            curl_httppost *post = NULL;
            curl_httppost *last = NULL;
            curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, "【base64_img】", CURLFORM_END);
    
            curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
            result_code = curl_easy_perform(curl);
            if (result_code != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(result_code));
                is_success = 1;
                return is_success;
            }
            json_result = vatInvoice_result;
            curl_easy_cleanup(curl);
            is_success = 0;
        } else {
            fprintf(stderr, "curl_easy_init() failed.");
            is_success = 1;
        }
        return is_success;
    }
    <?php
    /**
    * 发起http post请求(REST API), 并获取REST请求的结果
    * @param string $url
    * @param string $param
    * @return - http response body if succeeds, else false.
    */
    function request_post($url = '', $param = '')
    {
        if (empty($url) || empty($param)) {
            return false;
        }
    
        $postUrl = $url;
        $curlPost = $param;
        // 初始化curl
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $postUrl);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 要求结果为字符串且输出到屏幕上
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        // post提交方式
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        // 运行curl
        $data = curl_exec($curl);
        curl_close($curl);
    
        return $data;
    }
    
    $token = '[调用鉴权接口获取的token]';
    $url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=' . $token;
    $img = file_get_contents('[本地文件路径]');
    $img = base64_encode($img);
    $bodys = array(
        'image' => $img
    );
    $res = request_post($url, $bodys);
    
    var_dump($res);
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Web;
    
    namespace com.baidu.ai
    {
        public class VatInvoice
        {
            // 增值税发票识别
            public static string vatInvoice()
            {
                string token = "[调用鉴权接口获取的token]";
                string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=" + token;
                Encoding encoding = Encoding.Default;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
                request.Method = "post";
                request.KeepAlive = true;
                // 图片的base64编码
                string base64 = getFileBase64("[本地图片文件]");
                String str = "image=" + HttpUtility.UrlEncode(base64);
                byte[] buffer = encoding.GetBytes(str);
                request.ContentLength = buffer.Length;
                request.GetRequestStream().Write(buffer, 0, buffer.Length);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                string result = reader.ReadToEnd();
                Console.WriteLine("增值税发票识别:");
                Console.WriteLine(result);
                return result;
            }
    
            public static String getFileBase64(String fileName) {
                FileStream filestream = new FileStream(fileName, FileMode.Open);
                byte[] arr = new byte[filestream.Length];
                filestream.Read(arr, 0, (int)filestream.Length);
                string baser64 = Convert.ToBase64String(arr);
                filestream.Close();
                return baser64;
            }
        }
    }

    返回说明

    返回参数

    字段 是否必选 类型 说明
    log_id uint64 唯一的log id,用于问题定位
    words_result_num uint32 识别结果数,表示words_result的元素个数
    words_result object{} 识别结果
    InvoiceType string 发票种类
    InvoiceTypeOrg string 发票名称
    InvoiceCode string 发票代码
    InvoiceNum string 发票号码
    CheckCode string 校验码
    InvoiceDate string 开票日期
    PurchaserName string 购方名称
    PurchaserRegisterNum string 购方纳税人识别号
    PurchaserAddress string 购方地址及电话
    PurchaserBank string 购方开户行及账号
    Password string 密码区
    CommodityName array[] 货物名称
    - row uint32 行号
    - word string 内容
    CommodityType array[] 规格型号
    - row uint32 行号
    - word string 内容
    CommodityUnit array[] 单位
    - row uint32 行号
    - word string 内容
    CommodityNum array[] 数量
    - row uint32 行号
    - word string 内容
    CommodityPrice array[] 单价
    - row uint32 行号
    - word string 内容
    CommodityAmount array[] 金额
    - row uint32 行号
    - word string 内容
    CommodityTaxRate array[] 税率
    - row uint32 行号
    - word string 内容
    CommodityTax array[] 税额
    - row uint32 行号
    - word string 内容
    SellerName string 销售方名称
    SellerRegisterNum string 销售方纳税人识别号
    SellerAddress string 销售方地址及电话
    SellerBank string 销售方开户行及账号
    TotalAmount uint32 合计金额
    TotalTax uint32 合计税额
    AmountInWords string 价税合计(大写)
    AmountInFiguers uint32 价税合计(小写)
    Payee string 收款人
    Checker string 复核
    NoteDrawer string 开票人
    Remarks string 备注

    返回示例

    {	
      "log_id": "5425496231209218858",
    	"words_result_num": 29,
    	"words_result": {
    		"InvoiceNum": "14641426",
    		"SellerName": "上海易火广告传媒有限公司",
    		"CommodityTaxRate": [
    			{
    				"word": "6%",
    				"row": "1"
    			}
    		],
    		"SellerBank": "中国银行南翔支行446863841354",
    		"Checker": ":沈园园",
    		"TotalAmount": "94339.62",
    		"CommodityAmount": [
    			{
    				"word": "94339.62",
    				"row": "1"
    			}
    		],
    		"InvoiceDate": "2016年06月02日",
    		"CommodityTax": [
    			{
    				"word": "5660.38",
    				"row": "1"
    			}
    		],
    		"PurchaserName": "百度时代网络技术(北京)有限公司",
    		"CommodityNum": [
    			{
    				"word": "",
    				"row": "1"
    			}
    		],
    		"PurchaserBank": "招商银行北京分行大屯路支行8661820285100030",
    		"Remarks": "告传",
    		"Password": "074/45781873408>/6>8>65*887676033/51+<5415>9/32--852>1+29<65>641-5>66<500>87/*-34<943359034>716905113*4242>",
    		"SellerAddress": ":嘉定区胜辛南路500号15幢1161室55033753",
    		"PurchaserAddress": "北京市海淀区东北旺西路8号中关村软件园17号楼二属A2010-59108001",
    		"InvoiceCode": "3100153130",
    		"CommodityUnit": [
    			{
    				"word": "",
    				"row": "1"
    			}
    		],
    		"Payee": ":徐蓉",
    		"PurchaserRegisterNum": "110108787751579",
    		"CommodityPrice": [
    			{
    				"word": "",
    				"row": "1"
    			}
    		],
    		"NoteDrawer": "沈园园",
    		"AmountInWords": "壹拾万圆整",
    		"AmountInFiguers": "100000.00",
    		"TotalTax": "5660.38",
    		"InvoiceType": "专用发票",
    		"SellerRegisterNum": "913101140659591751",
    		"CommodityName": [
    			{
    				"word": "信息服务费",
    				"row": "1"
    			}
    		],
    		"CommodityType": [
    			{
    				"word": "",
    				"row": "1"
    			}
    		]
    	}
    }
    上一篇
    卡证文字识别
    下一篇
    定额发票识别