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

发布时间 2023-09-30 17:46:49作者: ®Geovin Du Dream Park™

 

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Http;



namespace WebApplication1
{

    /// <summary>
    /// 百度API读取增值税发票
    /// 
    /// </summary>
    public static class AccessToken
    {


        const string API_KEY = "geovindu";  
        const string SECRET_KEY = "geovindu"; 
        // 百度
        private static String clientId = API_KEY;// ConfigurationManager.AppSettings.Get("APIKey");
        // 百度
        private static String clientSecret = SECRET_KEY;// ConfigurationManager.AppSettings.Get("SecretKey");
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static String getAccessToken()
        {
            String authHost = "https://aip.baidubce.com/oauth/2.0/token";
            HttpClient client = new HttpClient();
            List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
            paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
            paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
            paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));

            HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
            String result = response.Content.ReadAsStringAsync().Result;
            // Console.WriteLine(result);

            AccessTokenInfo tokenInfo = JsonConvert.DeserializeObject<AccessTokenInfo>(result);

            return tokenInfo.access_token;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileurl"></param>
        /// <returns></returns>
        public static string vatInvoice(string fileurl)
        {
            string token = getAccessToken();
            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(fileurl);
            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();
            HttpContext.Current.Response.Write("增值税发票识别:");
            HttpContext.Current.Response.Write(result);
            return result;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileurl"></param>
        /// <returns></returns>
        public static string vatInvoicePdf(string fileurl)
        {
            string token = getAccessToken();
            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(fileurl);
            String str = "pdf_file=" + 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();
            HttpContext.Current.Response.Write("增值税发票识别:");
            HttpContext.Current.Response.Write(result);
            return result;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 增值税发票识别  
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static string vatInvoice2(string fileName)
        {
            string token = getAccessToken();
            string host = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=" + token;
            Encoding encoding = Encoding.Default;
            System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            // 图片的base64编码
            string base64 = getFileBase642(fileName);
            String str = "image=" + 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.UTF8);
            string result = reader.ReadToEnd();
            return result;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static String getFileBase642(String fileName)
        {
            FileStream filestream = new FileStream(fileName, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite);
            byte[] arr = new byte[filestream.Length];
            filestream.Read(arr, 0, (int)filestream.Length);
            string baser64 = Convert.ToBase64String(arr);
            filestream.Close();
            return baser64;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string UrlEncode(string str)
        {
            StringBuilder sb = new StringBuilder();
            byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认System.Text.Encoding.Default.GetBytes(str)
            for (int i = 0; i < byStr.Length; i++)
            {
                sb.Append(@"%" + Convert.ToString(byStr[i], 16));
            }
            return (sb.ToString());
        }

    }
    /// <summary>
    /// 
    /// </summary>
    public class AccessTokenInfo
    {
        public string refresh_token { get; set; }
        public string expires_in { get; set; }
        public string session_key { get; set; }
        public string access_token { get; set; }
        public string scope { get; set; }
        public string session_secret { get; set; }
    }
}

  

调用:

            var API_KEY = "geovindu";
            var SECRET_KEY = "geovindu";
            //1 SDK 读取
            var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超时时间
            string url = Server.MapPath(@"invoice/fapiao.png");  //@"invoice/fapiao.png"
            var image = File.ReadAllBytes(url);
            //var result = client.Accurate(image);
           // Response.Write(result);
            Response.Write("<br/>");
            //2. 
            string token=AccessToken.getAccessToken();
            Response.Write(token+"<br/>");
            Response.Write("<br/>");
            var result2=AccessToken.vatInvoice2(url);
            Response.Write(result2);