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

news2024/11/28 19:42:50
# encoding: utf-8
# 版权所有 2023 涂聚文有限公司
# 许可信息查看:
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2023/9/30 6:56
# User      : geovindu
# Product   : PyCharm
# Project   : pythonTkinterDemo
# File      : BaiduOCRAPI.py
# explain   : 学习
 
import os
import base64
import requests
import pandas as pd
import json
 
 
 
class BaiduOCR(object):
    """
    利用百度API读取发票信息(pdf,image文件)
    """
 
    AppID="40226401"
    APIKey="geovindu"
    SecretKey="geovindu"
 
    def __init__(self):
        """
 
        """
        self.AppID="40226401"
        self.APIKey="geovindu"  #
        self.SecretKey="geovindu"  #
 
 
 
    def getAccessToken(self):
        """
 
        :param APIKey:
        :param SecretKey:
        :return:
        """
        '''
        host = f"https://aip.baidubce.com/oauth/2.0/token?client_secret={self.SecretKey}&grant_type=client_credentials&client_id={self.APIKey}"
        response = requests.get(host)
        return response.json()['access_token']
        '''
        url = "https://aip.baidubce.com/oauth/2.0/token"
        params = {"grant_type": "client_credentials", "client_id": self.APIKey, "client_secret": self.SecretKey}
        return str(requests.post(url, params=params).json().get("access_token"))
 
    def getContent(self,accessToken, pdfFile):
        """
 
        :param accessToken
        :param pdfFile:
        :return:
        """
        #headers = {'content-type': 'application/x-www-form-urlencoded'}
        #request_url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token={accessToken}"
        f = open(pdfFile, 'rb')
        pdf = base64.b64encode(f.read())
        print(pdf)
        print(accessToken)
        request_url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
        params = {"pdf_file": pdf}
        access_token =accessToken # '[调用鉴权接口获取的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())
 
        #print(pdf)
        #params = {"pdf_file": pdf}
        #response = requests.post(request_url, data=params, headers=headers)
        #print(response.json())
        return response.json()
 
 
    def getContentPng(self,accessToken, pngFile):
        """
 
        :param accessToken
        :param pngFile:
        :return:
        """
        #headers = {'content-type': 'application/x-www-form-urlencoded'}
        #request_url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token={accessToken}"
        f = open(pngFile, 'rb')
        pdf = base64.b64encode(f.read())
        print(pdf)
        print(accessToken)
        request_url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
        params = {"image": pdf}
        access_token =accessToken # '[调用鉴权接口获取的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())
 
        #print(pdf)
        #params = {"pdf_file": pdf}
        #response = requests.post(request_url, data=params, headers=headers)
        #print(response.json())
        return response.json()
 
    def getUsefulInfo(self,content, pdf_name):
        """
 
        :param content
        :param pdf_name:
        :return:
        """
        jsonstr = content
        print("Json",jsonstr)
        words_result = jsonstr['words_result']
        info = {'发票文件名': pdf_name,
                '发票号码': str(words_result['InvoiceNum']),
                '开票日期': words_result['InvoiceDate'],
                '货物名称': words_result['CommodityName'][0]['word'],
                '未税金额': words_result['CommodityAmount'][0]['word'],
                '货物税率': words_result['CommodityTaxRate'][0]['word'],
                '货物税额': words_result['CommodityTax'][0]['word'],
                '合计金额': words_result['TotalAmount'],
                '合计税额': words_result['TotalTax'],
                '价税合计(小写)': words_result['AmountInFiguers'],
                '价税合计(大写)': words_result['AmountInWords'],
                '销售方名称': words_result['SellerName'],
                '销售方纳税人识别号': words_result['SellerRegisterNum'],
                '销售方银行及账户': words_result['SellerBank'],
                '销售方地址及电话': words_result['SellerAddress']}
        return info

调用:用京东多张发票测试成功

    ocr=Common.BaiduOCRAPI.BaiduOCR()
    pdfFilelist = os.listdir("invoice/")
    infolist = []
    for pdfFile in pdfFilelist:
        if pdfFile.split(".")[-1] == 'pdf':
            pdfName = pdfFile.split(".")[:-1]
            print(pdfFile)
            access_token =ocr.getAccessToken()
            content = ocr.getContent(access_token, "invoice/" + pdfFile)
            info = ocr.getUsefulInfo(content, pdfName)
            infolist.append(info)

    df = pd.DataFrame(infolist)
    print(df)
    #df.to_excel('增值税发票信息统计.xlsx', sheet_name="geovindu",index=False)
    with pd.ExcelWriter('geovindu.xlsx') as writer:  #, mode='a' 附加
        df.to_excel(writer, sheet_name='geovindu', index=False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧公厕:探索未来公共厕所的创新设计

近年来,随着城市发展的不断科技化,智慧公厕的设计成为了一个备受关注的话题。作为城市基础设施的重要组成部分,公厕不仅仅是简单的功能性建筑,更是体现了城市形象和管理水平的重要指标。在这篇文章中,我们将以智慧公厕…

【python】python实现杨辉三角的三种方法

文章目录 1.杨辉三角介绍:2.方法一:迭代3.方法二:生成器4.方法三:递归 1.杨辉三角介绍: 杨辉三角是一种数学图形,由数字排列成类似三角形的形状。它的每个数值等于它上方两个数值之和。这个三角形的形状可以…

【Linux】CentOS-6.8超详细安装教程

文章目录 1.CentOS介绍:2.必要准备:3.创建虚拟机:4 .安装系统 1.CentOS介绍: CentOS是一种基于开放源代码的Linux操作系统,它以其稳定性、安全性和可靠性而闻名,它有以下特点: 开源性&#xff1…

STM32F4X UCOSIII软件定时器

STM32F4X UCOSIII软件定时器 定时器概念 定时器在MCU中是一个很常用的外设,其作用是可以在某个事件点触发MCU中断,告知MCU处理事情。定时器跟生活中的闹钟很类似,可以设置闹钟每天什么时候响,还能设置响的次数,是响一…

山西电力市场日前价格预测【2023-10-01】

日前价格预测 预测说明: 如上图所示,预测明日(2023-10-01)山西电力市场全天平均日前电价为254.94元/MWh。其中,最高日前电价为399.30元/MWh,预计出现在19: 00。最低日前电价为0.00元/MWh,预计出…

源码编译安装systemtap

目录 编译环境 编译步骤 编译环境 阿里云ubuntu20.04 编译步骤 1 先安装elfutils,参见我的前一篇博客 源码编译elfutils_金色熊族的博客-CSDN博客 2 下载systemtap源码 3 解压 解压后的文件夹与elfutils的文件夹应该是平行的,如下图&#xff1a…

利用mAP计算yolo精确度

当将yolo算法移植部署在嵌入式设备上,为了验证算法的准确率。将模型测试的结果保存为txt文件(每一个txt文件,对应一个图片)。此外,需要将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]。最后,运行验证代码 …

轻松整理电脑文件:按大小归类保存,高效管理你的数据

你是否曾经在电脑中迷失在纷繁复杂的文件海洋中?你是否曾经花费大量时间搜索需要的文件,却发现它们并不在你想找的地方?如果你也遇到了这样的问题,那么是时候采取行动,对电脑文件进行整理和归类了。 首先。进入文件批…

问答区混赏金的集合贴

此贴专记录CSDN问答社区里面,一些回答者在临近结题时胡乱回答,只为分取结题赏金的人。 为了截图方便,给回答者点赞和点踩不是对其回答的认可和不认可,只是为了方便截图而已 文章目录 第一位——夜深人静的哝玛 (PS:与本人的头像和…

【CUDA编程概念】一、什么是bank conflict?

前言 搜了不少答案,大多是在避免Bank Conflict,很难找到一个关于Bank Conflict的详细定义,这里找了些资料来尝试解释下; 一、基础概念 先简单复习下相关概念 GPU调度执行流程: SM调度单位为一个warp(一…

AI-FGNet降噪算法

上一篇文章介绍AI-CGNet降噪算法和AI-GruNet降噪算法,本篇文章介绍一个新的轻量级降噪做法AI-FGNet。 一、模型结构 AI-FGNet网络相比AI-GruNet,额外添加一层全连接实现特征的维度变换,作为频谱压缩、控制计算量的一种手段。此外&#xff0c…

Win11下无法打开丛林之狐,提示未检测到DirectX 8.1

新装的win11系统,打开丛林之狐提示未检测到DirectX 8.1. 运行dxdiag检查DirectX版本: DX版本已经是12了: 最终参考了这篇文章解决了: 罪恶都市出现XX-directx version 8.1处理方法 - 知乎 控制面板 > 程序 > 启用或关闭Wi…

(三) gitblit管理员手册

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 权限管理创建仓库时创建用户普通用户 管理员用户访问限制和访问权限仓库创建权限分配 Teams普通组管理员组 参考资料 权限管理 创建仓库时 选择指定的人员查看,克隆,推送 不允许fork 对应Anonymo…

9.30小任务

消息队列实现进程之间通信方式 实现了父子进程之间的通信 #include <myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int arg…

从私服上拉取jar包,就是拉取不下来

明明私服上有jar包&#xff0c;但是就是拉取不下来&#xff0c;原因有很多种&#xff0c;我这里分享一种情况&#xff0c;我是因为idea的maven配置忘记改过来了&#xff0c;如下&#xff1a; 因为setting配置文件是拷贝来的&#xff0c;嫌麻烦&#xff0c;配置文件里的本地仓库…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

如何写一份完整的职业规划书?

写职业规划书&#xff0c;确定今后几年的一个发展方向&#xff08;职业规划建议越早越好&#xff09;&#xff0c;帮助自己收获更大的成功。普通的职业规划书书写起来十分简单&#xff0c;没有想象中那样复杂&#xff0c;只需要包括基本的部分&#xff0c;就可以轻轻松松完成。…

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

源码编译elfutils

编译环境 阿里云ubuntu20.04 编译步骤&#xff1a; 1 下载elfutils-0.170源码 2 解压 3 按照elfutils-0.170 (linuxfromscratch.org) 的描述&#xff0c;首先 ./configure --prefix/usr --program-prefix"eu-" 4 make 此时发生一个问题&#xff0c;报错&#x…

支付宝电脑网站支付,支付退款

一&#xff1a;支付宝退款 示例代码&#xff1a; AlipayClient alipayClient new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key&qu…