巧用Python的camelot库批量提取PDF发票信息

巧用 Python 的 camelot 库批量提取 PDF 发票信息
PDF 是一种文档格式,因为这种格式不受操作系统的限制,而且方便保存和传输,所以相关的 pdf 软件非常受欢迎。目前市场上有很多 pdf 软件,大部分是阅读类,也有支持对 pdf 的编辑、转换成 Word 等功能,但这部分工具不少是收费的。

例如我就很喜欢某个 PDF 转换软件,买了个终身 VIP 会员,目的就是将电子发票转换成 Excel 格式,并提取相关数据。

现在很多增值税普通发票都是电子发票,其格式都是以 PDF 格式进行保存的,而且相信未来的增值税电子专票也会以 PFD 格式保存。那么财务能不能将 PFD 格式的发票信息批量读取到 Excel 中呢?特别是不花钱的情况下。

例如我从京东中收到几十份电子发票,能不能通过什么办法将其金额、税额一次性的录入到某个 Excel 文件中呢?

可以的,但问题是 python 可以操作 PDF 文件的库有好几个,如 PyPDF2、pyPDF4、pikepdf、ReportLab、pdfplumber、PyMuPDF 等,那么我们应该选择哪一个库为我们工作呢?

因为不是所有 PDF 库都能读取所有版本的电子发票,有些库只能读取 2018 年之前的版本,有些库对 2019 年的发票不能读取中文等等。

例如用 pdfplumber 库,我们读取中石化的电子发票时,只能读取数字。

用 pdfplumber 库的话,虽然可以读取中文,但不能解析表格:

我们的电子发票上面,除了有文本、表格、图片,我们需要读取以上的这些信息,还还需要有解析表格的功能。当然,其他的 Python 库也可以读取,但为了减少读取时出现错误,我建议选择用 camelot 库来读取发票。

Camelot 译文为卡美洛,是阿瑟王传说中的城堡,但在 python 库中,这是一个 PDF 表格读取库,而且比较冷门,不过非常适合用来提取发票。它能将每个 PDF 表格提取到 Pandas DataFrame 中,对数据分析非常方便,更让人满意的是能比较准确的识别中文。

设计 camelot 库是一位叫做维纳亚克・梅塔的印度电脑工程师,是一位印度 90 后。从事数据分析的工作。如果对这个库有什么疑问的,可以在 Github 留言给它。老实说,这个库的安装比较麻烦,我也走了不少弯路,以下是我的安装总结:

千万不要用 pip install camelot 来安装,因为即使安装成功了也会报错,正确的方法是在 Anaconda 中用 conda install -c conda-forge camelot-py 命令。

不要用 PIP 安装,不然的话会非常麻烦,安装成功之后,你就等于安装了一套 python 库,包括 PyPDF2 库、 camelot 库、ghostscript 库、opencv 库、 pdfminer.six - 库、 pdftopng 库、以及 tabulate 库。

另外安装后,需要到 www.ghostscript.com/download/gsdnl... 官网安装 Ghostscript 软件,不然的话会报错,由于我是 Win10 的,选择用 64bit。安装成功后记得重启电脑。

这个时候我们再用 camelot 去读取发票,就会发现已经转变成表格格式。

现在,我先介绍一下这个库的基本操作。

import camelot #导入库

tables = camelot.read_pdf('发票名称.pdf')

tables[0].df ##用提取表格显示
其中 tables [0] 表示第一张表格,如果是 tables [1] 表示第二张表格,.df 表示用 pandas 方式显示表格。

默认情况下,Camelot 库只会对 PDF 的第一页来提取表格。如果要指定多个页面,您可以使用 pages 关键字参数:

camelot.read_pdf (‘发票名称.pdf’, pages=’1,2,3’)## 提取 1,2,3 页的表格,或者用

camelot.read_pdf (‘发票名称.pdf’, pages=’1-3’) 或者 pages=’1-end’都可以。

导入之后,如果我们发现有一些不需要的字符,如空格、点和换行符之类的,我们可以用 strip_text 参数去除。

tables = camelot.read_pdf (‘发票名称.pdf’, strip_text=’ \n’)

tables[0].df

运行如下:

但是我发现这种单元格不好看,好像有些单元格没有拆分一样,这时我们可以加上 shift_text=[‘’] 这个参数,让各行列分组更紧密。

tables = camelot.read_pdf(‘044002007111_22865083.pdf’,shift_text=[‘’],strip_text=’\n’)

tables[0].df

这个时候,基本上发票的数据可以出来了。

我们可以用 tables [0].to_csv (‘发票.csv’) 来保存,或用 to_excel()为 Excel 格式。

如果是非常多的发票呢?这是一个非常有现实意义的问题,相信不少的出纳会希望有一款软件能批量读取发票,然后将其转化成 Excel 文件。以下是我分享的代码,希望可以帮到大家。

##批量读取发票,然后汇总成一个CSV文件
import camelot
import pandas as pd 
import os
##定义文件夹位置
directoryPath = r'E:\py读取pdf发票汇总'##如果改为=os.getcwd()表示当前文件夹
os.chdir(directoryPath)
print(os.listdir())##列取该文件夹下所有文件名称
folderList = os.listdir(directoryPath)
for folders, sub_folders, file in os.walk(directoryPath):  ##所有文件的路径
    for name in file:  ##定义所需文件名
        if name.endswith(".pdf"):  ##如果文件名是以.pdf结束的话
            filename = os.path.join(folders,name) ##定义这条路径
            print(filename)##输出文件路径
            print(name)##输出文件名
            tables = camelot.read_pdf(filename,shift_text=[''],strip_text='\n')##读取pdf文件,
            df01= tables[0].df##转换为DF表格
            #df01.to_excel('{name}.xlsx',sheet_name=name)
            df01.to_csv('foo2.csv',mode="a",encoding="utf_8_sig")##保存为CSV格式,以直接使参数mode='a’实现每个表追加数据。
除了能读取发票之外,也可以读取申报表。在电子税务局,我们可以查询以及下载已经申报的申报表,包括增值税申报表、所得税申报表以及综合申报表等。这些报表不是 Excel 格式的,全部都是 PDF 格式的。如果只做一家公司的账当然是没有问题的,但如果是好几家公司的账,要核对每个月的申报表以及每家子公司的申报表时,这就麻烦了。

旧的方法是一张一张的打印下来,然后逐张分析。好一点的用商业化 PDF 转化软件,批量将 PDF 转化成 Excel 文件,然后再分类汇总,数据透视等等。不过如果安装了 Camelot 之后,你就可以用这个库直接在 PDF 文件夹抓取数据,直接用 Pandas 库进行分析。而且更方便的是,可以设定好脚本程序,解决重复分析的问题。

我用一个例子来说明一下:

import pandas as pd
import camelot
import os
directoryPath =os.getcwd()
folderList = os.listdir(directoryPath)
for name in folderList:
    if '增值税'and".pdf" in name:
        filename = os.path.join(directoryPath,name)
        print(filename)##输出文件路径
        print(name)##输出文件名
        tables = camelot.read_pdf(name,pages='1')##读取pdf文件,
tables[0].df
df01=tables[0].df
df02=df01.iloc[[4,5,9]]
df02
运行后:

特别要注意的是,你要保证你浏览器内的 pdf 版本为最新版,我见到有的同事用其他浏览器下载的申报表文件,因为版本原因不能被 Camelot 读取,而相同的申报表,我却可以读取。这显然是保存 PDF 文件时出现问题。

猜你喜欢

转载自blog.csdn.net/xifenglie123321/article/details/131986803
今日推荐