python 提取增值税电子发票信息

这篇具有很好参考价值的文章主要介绍了python 提取增值税电子发票信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.代码介绍

本代码的主要功能是通过弹窗传入一个文件夹路径(文件夹下存放pdf版本的增值税电子发票),然后就会解析文件夹下所有的发票,然后把提取后的信息写入到Excel中,最后Excel会保存在python文件的当前目录。
1.1 需要用到的python库
python 电子发票,python,开发语言

import os
import re 
import logging
import tkinter as tk
from tkinter import filedialog
from datetime import datetime
import pdfplumber
import pandas as pd
from logging.handlers import RotatingFileHandler


# 提取发票信息
class ExtraInfo():
    def __init__(self) -> None:
        # 通过logger设置日志格式
        logger = logging.getLogger()
        logger.setLevel("INFO")
        fh = RotatingFileHandler("run.log", maxBytes=1024*1024, backupCount=1, encoding="utf-8")  # <这里设置了日志最大只能为1M>, <备份数设为1, 如果不设则maxBytes不生效>, <输出到文件>
        sh = logging.StreamHandler()  # <输出到控制台>
        fh.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
        sh.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
        logger.addHandler(fh)  # <使fh生效>
        # logger.addHandler(sh)  # <使sh生效>
        self.logger = logger


    @staticmethod
    def extra_invoice_info(file_path):
        text = ""
        try:
            with pdfplumber.open(file_path) as pdf:
                page = pdf.pages[0]
                text = page.extract_text()
        except Exception as e:
            print(f"出现异常:{file_path}-{e}")
        finally:
            return text
    

    def analyze_invoice_info(self, pdf_dir):
        ls_dir = os.listdir(pdf_dir)
        ls_data = []
        for i in ls_dir:
            pdf_path = os.path.join(pdf_dir, i)
            if pdf_path.endswith(".pdf"):
                try:
                    text = self.extra_invoice_info(pdf_path)
                    mtime = os.path.getmtime(pdf_path) #修改时间
                    文件修改时间 = datetime.fromtimestamp(int(mtime))
                    名称 = re.findall(r"名\s{0,1}称\s{0,1}[:,:]\s{0,1}(.*?)\s", text, re.I|re.S)
                    识别号 = re.findall(r"纳税人识别号[:, :]\s{0,1}(.*?)\s", text, re.I|re.S)
                    开票项目名称 = re.findall(r"税\s{0,1}额\s{0,1}(.*?)\s", text, re.I|re.S)
                    开票日期 = re.findall(r"开票日期\s{0,1}[:,:]\s{0,1}(.*?)日", text, re.I|re.S)
                    发票号码 = re.findall(r"发票号码\s{0,1}[:,:]\s{0,1}(.*?)\s", text, re.I|re.S)
                    价税合计 = re.findall(r".小写.[\s]{0,1}[\xa5,¥]\s{0,1}(.*?)\s", text, re.I|re.S)
                    if not 价税合计:
                        价税合计 = re.findall(r"小写\(cid:61\)[\xa5,¥]\s{0,1}(.*?)\s", text, re.I|re.S)
                    if not 价税合计:
                        价税合计 = re.findall(r"大写.\s{0,1}(.*?)\s", text, re.I|re.S)
                    ret = [pdf_path, 文件修改时间, 名称[0], 名称[1], 识别号[0], 识别号[1], 开票项目名称[0], 开票日期[0].replace(" ", "")+"日", f"'{发票号码[0]}", f"'{价税合计[0]}"]
                    ret = [str(k).replace(" ", "").replace("'", "") for k in ret]
                except Exception as e:
                    self.logger.warning(e)
                    self.logger.warning([text])
                    ret = [pdf_path, 文件修改时间, "", "", "", "", "", "", "", ""]
                finally:
                    self.logger.warning([text])
                    self.logger.info(ret)
                    ls_data.append(ret)
        return ls_data


    def to_excel(self, save_path, pdf_dir):
        ls_data = self.analyze_invoice_info(pdf_dir)
        df = pd.DataFrame(ls_data, columns=["文件路径", "文件修改时间", "购方名称", "销方名称", "购方识别号", "销方识别号", "开票项目名称" , "开票日期", "发票号码", "价税合计"])
        writer = pd.ExcelWriter(save_path, engine='openpyxl')
        df.to_excel(writer, sheet_name='Sheet1', startrow=0, startcol=0, index=False)
        writer.save()  # 如果writer.save()报错, 可能是你的pandas版本比较高, 请改为writer._save()或者writer.close()


# 弹窗获取文件夹
class PopUp():
    def __init__(self) -> None:
        self.folder_path = ""
        self.root = tk.Tk()
        self.folder_label = tk.Label(self.root, text="请选择文件夹")
        self.folder_label.pack(padx=5, pady=5)


    def browse_folder(self):
        self.folder_path = filedialog.askdirectory()
        print(self.folder_path)
        if self.folder_path:
            self.folder_label.config(text=self.folder_path)


    def pop_up(self):
        self.root.title("上传文件夹")
        self.root.geometry("300x150")
        browse_button = tk.Button(self.root, text="浏览", command=self.browse_folder)
        browse_button.pack(padx=5, pady=5)
        upload_button = tk.Button(self.root, text="提交", command=self.root.destroy)
        upload_button.pack(padx=5, pady=5)
        self.root.mainloop()
        return self.folder_path


if __name__ == '__main__':
    pop = PopUp()
    dir = pop.pop_up()

    extra = ExtraInfo()
    save_path = r"ouput.xlsx"  # 可以自行修改保存路径
    extra.to_excel(save_path, dir)

2.运行过程截图

2.1弹窗:点击“浏览”选择文件夹路径,然后点击“提交”即可!
python 电子发票,python,开发语言
2.2 生成的Excel
python 电子发票,python,开发语言
2.3 提取的效果
python 电子发票,python,开发语言文章来源地址https://www.toymoban.com/news/detail-730524.html

到了这里,关于python 提取增值税电子发票信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链在电子发票报销中的创新应用模式

    摘要 【目的】 基于区块链的电子发票应用平台为科研机构在电子发票报销过程中提供可信、安全、高效、便捷的数据存储,进而为财务部门提供发票报销的功能性平台。 【方法】 本文提出一种基于区块链的电子发票应用平台,根据区块链电子发票应用平台的系统架构,阐明区块

    2024年02月06日
    浏览(37)
  • JAVA识别PDF和OFD电子发票并解析为java对象

    上一篇我们说了java实现电子发票中的发票税号等信息识别的几种可用方案,最后博主选取了识别文件二维码的方式,而且文章最后也说了,这种有局限性,去到的信息有限,而且针对OFD格式也得继续想办法,那接下来,我们就说一下怎么处理这个问题,并且如何去识别OFD格式

    2024年02月09日
    浏览(38)
  • 多个PDF发票合并实现一张A4纸打印2张电子/数电发票功能

    python教程79--A4纸增值税电子发票合并打印_python 打印 发票设置_颐街的博客-CSDN博客 文章浏览阅读7.9k次。接上篇https://blog.csdn.net/itmsn/article/details/121902974?spm=1001.2014.3001.5501一张A4纸上下2张增值税电子发票实现办法。使用环境:python3.8、mac、docx库开发工具:jupyterlab增值税电子发

    2024年02月05日
    浏览(72)
  • 【python】网络爬虫与信息提取--requests库

             当一个软件想获得数据,那么我们只有把网站当成api就可以         requests库:自动爬取HTML页面,自动网络请求提交         robots协议:网络爬虫排除标准(网络爬虫的规则)         beautiful soup库:解析HTML页面         IDLE:适用于python入门,功能简单直接,

    2024年02月20日
    浏览(37)
  • 【python】网络爬虫与信息提取--正则表达式

            正则表达式是用来简洁表达一组字符串的表达式。是通用的字符串表达框架,简洁表达一组字符串的表达式,针对字符串表达“简洁”和“特征”思想的工具,判断某字符串的特征归属。         用处:表达文本类型的特征;同时查找或替换一组字符串;匹配字符串

    2024年02月19日
    浏览(74)
  • 基于Tesseract模块Python实现提取图片中的文字信息(安装+使用教程)

    Python实现提取图片中的文字可以使用Optical Character Recognition (OCR) 技术来解决。OCR是指将图像中的文本转换成可编辑的文本的过程。Python有许多OCR库,但最流行和最广泛使用的是Tesseract库。 下面是一个使用Python和Tesseract来提取图像中的文本的简单示例代码。 OCR,即光学字符识

    2024年02月05日
    浏览(43)
  • (python)正则表达式提取字符串中的各种信息(持续更新)

            在日常数据处理过程,拿到一段文字,进行关键信息的提取.总而言之,翻来覆去地用到几种处理方法.这些都需要用到正则去进行通用处理.比如提取关键信息,诸如时间,日期,地址等. 那么我们要根据关键信息的特征去提取. 数字提取:可以用正则表达式来提取数字,包括整

    2024年01月24日
    浏览(47)
  • 全国青少年电子信息智能创新大赛(复赛)python·模拟一卷

    目录 一、编程题 下载文档打印做题: 全国青少年电子信息智能创新大赛(复赛)python·模拟一卷 一、编程题 第一题: 描述 鸡尾酒疗法,原指\\\"高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于 1996 年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。

    2023年04月09日
    浏览(39)
  • 全国青少年电子信息智能创新大赛(复赛)python·模拟四卷

    目录 一、编程题 答案解析如下: 下载文档打印做题: 全国青少年电子信息智能创新大赛(复赛)python·模拟四卷 一、编程题 第一题: 描述 班上有学生若干名,给出每名学生的年龄《整数),求班上所有学生的平均年龄,保留到小数点后两企

    2023年04月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包