Python提取PDF发票信息并导入到Excel中

yizhihongxing

本篇文章将学习提取pdf发票信息,并将发票信息导入到Excel中。

使用到的Python库:

  • pdfplumber
  • Gooey
  • pyinstaller

背景

Python提取PDF发票信息并导入到Excel中

随着电子发票越来越普遍,企业使用的越来越多,在财务报账流程中需要将发票信息录入到财务系统(如K3)中,在这个过程中,通常有以下几个痛点:

  • 发票信息检查容易出错。
  • 手动录入发票信息效率十分低下。
  • 人工处理非常容易出错。
  • 电子发票文件名不规范,不容易区分。如:045001600111112565055.pdf

解决方案

做一个程序,自动提取发票中的文字信息,并保存到Excel中。

这样可以从Excel中检查发票信息是否完整,并且从Excel中复制或导入到财务系统中,大大提高了工作效率。

程序效果

程序界面

导入到Excel中

文件重命名

实现方法

发票识别

使用pdfplumber,安装命令pip install pdfplumber

import pdfplumber
import re
import os

def re_text(bt, text):
    m1 = re.search(bt, text)
    if m1 is not None:
        return re_block(m1[0])

def re_block(text):
    return text.replace(' ', '').replace(' ', '').replace(')', '').replace(')', '').replace(':', ':')

def get_pdf(dir_path):
    pdf_file = []
    for root, sub_dirs, file_names in os.walk(dir_path):
        for name in file_names:
            if name.endswith('.pdf'):
                filepath = os.path.join(root, name)
                pdf_file.append(filepath)
    return pdf_file

def read():
    filenames = get_pdf('C:\Users\Administrator\Desktop\a')  # 修改为自己的文件目录
    for filename in filenames:
        print(filename)
        with pdfplumber.open(filename) as pdf:
            first_page = pdf.pages[0]
            pdf_text = first_page.extract_text()
            if '发票' not in pdf_text:
                continue
            # print(pdf_text)
            print('--------------------------------------------------------')
            print(re_text(re.compile(r'[\u4e00-\u9fa5]+电子普通发票.*?'), pdf_text))
            t2 = re_text(re.compile(r'[\u4e00-\u9fa5]+专用发票.*?'), pdf_text)
            if t2:
                print(t2)
            # print(re_text(re.compile(r'发票代码(.*\d+)'), pdf_text))
            print(re_text(re.compile(r'发票号码(.*\d+)'), pdf_text))
            print(re_text(re.compile(r'开票日期(.*)'), pdf_text))
            print(re_text(re.compile(r'名\s*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text))
            print(re_text(re.compile(r'纳税人识别号\s*[::]\s*([a-zA-Z0-9]+)'), pdf_text))
            price = re_text(re.compile(r'小写.*(.*[0-9.]+)'), pdf_text)

            print(price)
            company = re.findall(re.compile(r'名.*称\s*[::]\s*([\u4e00-\u9fa5]+)'), pdf_text)
            if company:
                print(re_block(company[len(company)-1]))
            print('--------------------------------------------------------')

read()

通过上述代码可以实现对pdf发票的内容识别和输出功能。

写入到Excel中

使用xlwt写Excel文件,安装命令pip install xlwt,一个简单的例子如下:

import xlwt

# 创建工作簿
wb = xlwt.Workbook()
# 创建表单
sh = wb.add_sheet('sheet 1')
# 写入数据
sh.write(0, 1, '姓名')
# 保存
wb.save('test.xls')

创建软件界面

使用Gooey创建GUI图像界面,安装命令pip install Gooey
Gooey是个适用于命令行的图形工具,也就是只做输入(有各种输入/选择框)和输出的情况,不适用于做界面展示,无法添加自定义按钮,如button等。使用print就能将输出内容显示到GUI图形界面上。

Gooey实例如下:

from gooey import Gooey, GooeyParser

@Gooey(program_name="简单的实例")
def main():
    parser = GooeyParser(description="第一个示例!")
    parser.add_argument('文件路径', widget="FileChooser")  # 文件选择框
    parser.add_argument('日期', widget="DateChooser")  # 日期选择框
    args = parser.parse_args()  # 接收界面传递的参数
    print(args)

if__name__ == '__main__':
    main()

Python提取PDF发票信息并导入到Excel中

打包为exe文件

使用pyinstaller将代码打包为exe文件
安装命令pip install pyinstaller
打包命令pyinstaller -F xxxxx.py -w (xxxxx.py改为具体的.py文件名)
等待打包完成,在代码对应的目录下会生成dist文件夹,打开后可以看到exe程序。

Python提取PDF发票信息并导入到Excel中

软件下载

当然你如果你有使用需求的话,可以查看此文章下载软件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python提取PDF发票信息并导入到Excel中 - Python技术站

(8)
上一篇 2024年1月16日 下午5:02
下一篇 2023年1月9日 下午8:28

相关文章

  • regexbuddy正则表达式测试工具使用方法(图文)

    以下是“RegexBuddy正则表达式测试工具使用方法(图文)”的完整攻略: 什么是RegexBuddy? RegexBuddy是一款功能强大的正则表达式测试工具,它可以帮助开发人员快速创建、测试和调试正则表达式。RegexBuddy支持多种编程语言和正则表达式语法,并提供了丰富的工具和功能,使得开发人员可以轻松地创建和测试正则表达式。 RegexBuddy…

    python 2023年5月14日
    00
  • Python利用百度地图获取两地距离(附demo)

    下面我将详细讲解“Python利用百度地图获取两地距离(附demo)”的完整实例教程。 简介 本文主要介绍如何使用Python代码实现利用百度地图API获取两地距离的方法。百度地图API提供了计算两点间经纬度距离的服务,而Python则可以通过调用相应的API接口实现对距离的获取。 我们将分以下五个步骤来讲解实现过程: 准备工作 百度地图API开发者密钥申请…

    python 2023年5月13日
    00
  • python deque模块简单使用代码实例

    当我们在Python中需要实现简单的队列或双向队列数据结构时,可以使用Python的deque模块。本文将详细讲解Python deque模块的简单使用代码实例,并提供两个示例来说明使用deque的好处。 什么是Python deque模块? deque模块是Python标准库 collections 中的一个子模块,提供了一个双向队列的数据结构,支持高效的…

    python 2023年6月3日
    00
  • 3段Python图像处理的实用代码的分享

    以下是“3段Python图像处理的实用代码的分享”的完整攻略: 1. 图像处理准备 首先,我们需要准备一张待处理的图片,图片可以使用Python Pillow库中的Image模块来加载,代码如下: from PIL import Image # 加载图片 img = Image.open("image.jpg") 在加载图片之后,我们可以…

    python 2023年5月31日
    00
  • python采用requests库模拟登录和抓取数据的简单示例

    下面我来讲解一下“Python采用requests库模拟登录和抓取数据的简单示例”: 1. 简介 requests库是一个Python第三方库,用于处理http请求,是Python开发中用的最为广泛的第三方库之一。我们可以利用requests模拟登录网站并抓取网站数据。 2. 环境准备 在使用requests模拟登录之前,需要安装requests库,安装命令…

    python 2023年5月14日
    00
  • python networkx 包绘制复杂网络关系图的实现

    下面我将为您详细讲解如何使用Python的networkx包来绘制复杂网络关系图。 1. 安装networkx包 在命令行中输入以下命令即可安装networkx包: pip install networkx 如果您已经安装了anaconda,则可以使用以下命令安装: conda install networkx 2. 创建图结构 首先,我们需要创建一个图结构…

    python 2023年5月14日
    00
  • Python中死锁的形成示例及死锁情况的防止

    Python中死锁的形成示例及死锁情况的防止 什么是死锁? 死锁指的是多个进程(或线程)因相互等待对方持有的资源而陷入僵局,无法继续向前执行。在 Python 中,由于 GIL(全局解释器锁)的存在,多线程下使用锁可能会产生死锁问题。 死锁的形成 举一个简单的例子,假设有两个线程 A 和 B,共享着两把锁 lockA 和 lockB。如果线程 A 先锁定了 …

    python 2023年5月13日
    00
  • Pandas sample随机抽样的实现

    下面我为您详细讲解“Pandas sample随机抽样的实现”的完整攻略。 什么是Pandas sample随机抽样? 在数据分析领域,经常需要对数据集进行抽样分析,Pandas作为数据分析库,提供了sample方法来实现对数据集的抽样操作。Pandas sample方法可以从DataFrame中获取指定样本数量的数据,同时也支持获取指定比例的数据。 sam…

    python 2023年6月3日
    00

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

合作推广
合作推广
分享本页
返回顶部