想读取文件夹*.pdf格式的发票并写入到excel当中,当然也可以写入txt(注释代码有)

详见下面代码,代码开头有参考的几篇文章的地址

一开始用的是pdfplumber,不好用,识别率不高,后来使用了pdfminer,还可以,但还是有一些识别不出来

# 1. python 3.x需要安装的是pdfminer3k而不是pdfminer(后者仅支持python 2.x),不过在导入的时候的语句都是`import pdfminer`

# 1. Python 3.6 中使用pdfminer解析pdf文件 - 大泡泡的专栏 - CSDN博客 https://blog.csdn.net/u011389474/article/details/60139786

# revised by wolf @2020年12月25日15:20:00

# https://github.com/jsvine/pdfplumber

# https://blog.csdn.net/weixin_48629601/article/details/107224376

# import pdfplumber as pdf

# infilePath=os.path.join(os.getcwd(),'pdf\\191.pdf')

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

from pdfminer.layout import LTTextBoxHorizontal, LAParams

from pdfminer.pdfparser import PDFParser, PDFDocument

from pdfminer.converter import PDFPageAggregator

from openpyxl import Workbook

import sys,os,re

def from_pdf_to_txt(read_file, page_start=0, page_end=0):

"""

:param read_file: str. 注意后缀名是".pdf"

:param write_file: str. 注意后缀名填".txt"

:param page_start: int

:param page_end: int

:return:

"""

# 以二进制读模式打开

origin_pdf_file = open(read_file, 'rb')

# 用文件对象来创建一个pdf文档分析器

parser = PDFParser(origin_pdf_file)

# 创建一个pdf文档

doc = PDFDocument()

# 连接分析器与文档对象,这个语句比较有意思,相互set对方进去

parser.set_document(doc)

doc.set_parser(parser)

# 提供初始化密码.如果pdf没有密码,就传入一个空参数

doc.initialize()

# 检测文档是否提供txt转换,不提供就忽略

if not doc.is_extractable:

# 如果pdf不支持提取,则直接报错

raise PDFTextExtractionNotAllowed

else:

# 创建pdf资源管理器 来管理共享资源

srcmgr = PDFResourceManager()

# 创建一个pdf设备对象

device = PDFPageAggregator(srcmgr, laparams=LAParams())

# 创建一个pdf解释器对象

interpreter = PDFPageInterpreter(srcmgr, device)

# 循环遍历列表,每次处理一个page的内容

pages = list(doc.get_pages())

if page_end == 0:

page_end = len(pages)

results=''

for i in range(page_start, page_end):

interpreter.process_page(pages[i])

# 接受该页面的LTPage对象

layout = device.get_result()

# 这里返回的是一个LTPage对象,里面存放着这个page解析出的各种对象

# 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等

# 想要获取文本就取它的text属性,即x.get_text()

# 获取text属性

for x in layout:

if isinstance(x, LTTextBoxHorizontal):

# with open(write_file, 'a', encoding='utf-8') as f:

string=x.get_text().replace('\n','')

string=string.replace(":",'')

string=string.replace(":",'')

results = results+string.replace(' ','')

# f.write(results)

# 最后关闭原始pdf文件

origin_pdf_file.close()

return results

def re_text(bt,text):

m1=re.search(bt,text)

if not m1 is None:

reText=m1[0]

return reText

# def pdf_text(pdffilepath):

# with pdf.open(pdffilepath) as file:

# firstPage=file.pages[0]

# pdftext=firstPage.extract_text()

# pdftext=pdftext.replace(' ','')

# pdftext=pdftext.replace(':','')

# pdftext=pdftext.replace(':','')

# return pdftext

if __name__=='__main__':

xlfilename='发票.xlsx'

xlfilepath=os.path.join(os.getcwd(),xlfilename)

dirpath=os.path.join(os.getcwd(),'g:/发票')

wb=Workbook()

ws=wb.active

ws['A1']='文件名'

ws['B1']='发票代码'

ws['C1']='发票号码'

ws['D1']='开票日期'

ws['E1']='校验码'

ws['F1']='合计金额'

# ws.title='统计'

# txtfile='save.txt'

# ofile=open(txtfile,'w',encoding='utf-8')

# ofile.write(text)

receiptsCount=0

for root,subdirs,filenames in os.walk(dirpath):

for filename in filenames:

# (filename,extension)=os.path.splitext(file)

# if extension in ['.pdf']:

if filename.endswith('.pdf'):

filepath=os.path.join(root,filename)

receiptsCount+=1

print(filepath+'is extracting')

pdftext=from_pdf_to_txt(filepath, 0, 1)

# pdftext=pdf_text(filepath)

bt='(?<=发票代码)\d+'

rt1=re_text(bt,pdftext)

bt='(?<=发票号码)\d+'

rt2=re_text(bt,pdftext)

bt='(?<=开票日期)\d+年\d+月\d+日'

rt3=re_text(bt,pdftext)

bt='(?<=校验码)\d+'

rt4=re_text(bt,pdftext)

bt='(?<=合计¥)\d+\.\d+'

rt5=re_text(bt,pdftext)

rownum=receiptsCount+1

ws['A'+str(rownum)]=filepath

ws['B'+str(rownum)]=rt1

ws['C'+str(rownum)]=rt2

ws['D'+str(rownum)]=rt3

ws['E'+str(rownum)]=rt4

ws['F'+str(rownum)]=rt5

wb.save(filename=xlfilepath)

print('done')

# ofile.close()

# # 利用pdfplumber单个提取表格

# with pdfplumber.open('基于python的网页爬虫.pdf') as pdf:

# first_page = pdf.pages[0]

# print(first_page.extract_table())

# # 利用pdfplumber多个提取表格

# with pdfplumber.open('基于python的网页爬虫.pdf') as pdf:

# first_page = pdf.pages[0]

# for table in first_page.extract_tables():

# print(table)

# # 利用pdfplumber单个提取财报 table_settings: 提取表格是的设定

# with pdfplumber.open('基于python的网页爬虫.pdf') as pdf:

# first_page = pdf.pages[0]

# table = first_page.extract_tables(

# table_settings={

# 'vertical_strategy': 'text',

# 'horizontal_strategy': 'text'

# }

# )

# new_table = []

# for row in table:

# new_row = []

# # 如果不是空行

# if not ''.join([str(item) for item in row]) == '':

# # 合并单词

# new_row.append(''.join([str(item) if item else '' for item in row[:3]]))

# new_row += row[3:]

# new_table.append(new_row)

# print(new_table)

python提取pdf发票信息_python读取pdf(发票)相关推荐

  1. python 读取pdf 两栏_python 读取pdf

    # #-*- coding: UTF-8 -*- # -*- coding:utf-8 -*- ##提取pdf文件中的文字 importtime,os.path,requests,re time1=t ...

  2. python获取pdf页数_Python读取pdf页面的一部分

    假设您使用的是pdfminer和pypdf2,那么我假设所讨论的PDF文件是生成的PDF而不是扫描的(如您所给出的示例中所示).如果您知道以英寸为单位的列和行的大小,您可以使用^{}(完全公开:我写了 ...

  3. python提取网页表格信息_python 提取网页表格数据库数据库

    python开源工具列表[持续更新] 以下是个人在工作中整理的一些python wheel,供参考.这个列表包含与网页抓取和数据处理的Python库 网络 通用urllib -网络库(stdlib). ...

  4. python读取pdf文件_python读取pdf文件

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一.安装pdfminer3k模块?二. 读取pdf文件import sysimp ...

  5. java读取word文档内容_Python读取PDF信息插入Word文档

    Hello,上个周末没能搞事情,被一个代码需求给绊住了:朋友在平时工作中会经常重复性地打开不同PDF文件,选取其中特定的几组信息复制粘贴到不同的Word文档中,完成一份PDF文件平均耗时15分钟,想试 ...

  6. python pdf-有没有好一点的读取 PDF 的 Python 包?

    专注Python.AI.大数据 @七步编程 ​PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以 ...

  7. python读取pdf并写入excel_Python读取pdf表格写入excel代码方法

    本篇文章小编给大家分享一下Python读取pdf表格写入excel代码方法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 避免CV大法 pdf 文件的 ...

  8. java解析pdf 图片文字_Java 读取PDF中的文本和图片

    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取. 使用工具:Free Spire.PDF for Java ...

  9. php判断pdf页码,PHP_PHP简单读取PDF页数的实现方法,本文实例讲述了PHP简单读取PDF - phpStudy...

    PHP简单读取PDF页数的实现方法 本文实例讲述了PHP简单读取PDF页数的实现方法.分享给大家供大家参考,具体如下: 还是老外比较厚道, 在老外的网站找到了这样一个方法, 我写成了一个函数, 再将函 ...

最新文章

  1. NetCore+MySql+EF 数据库生成实体模型
  2. 通过Visual Studio 2005的项目模板来加速开发过程
  3. 3D视频的质量评价报告 (MSU出品)
  4. 笔记:Html.Partial和Html.Action
  5. Spring中注册Bean的方式有哪些?
  6. cnc计算机控制,CNC控制器
  7. Shapley_Value全解析与公式推导
  8. Win10外接显示器可以复制不可以扩展
  9. ESP8266-连接阿里云示例
  10. 年末最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!
  11. 神经网络训练常见坑-新手如何优化调整训练神经网络
  12. iPhone 4 无shsh 完美降级 iOS 6
  13. Android Things:外设I/O接口-GPIO
  14. Wallabag——开源稍后读知识管理服务工具
  15. handlebars是什么
  16. 什么?一个核同时执行两个线程?
  17. 关于谭浩强老先生的《C++程序设计教程》 1
  18. autojs读取文字_Auto.js小白详细代码分析教程-如何阅读本文档 - Documentation
  19. 跟着瑜伽老师一节课程序员锻炼身体
  20. InfiniteScroll 无限滚动组件的使用

热门文章

  1. 大内老A:200行代码,7个对象——让你了解ASP.NET Core框架的本质
  2. 将动画角色导入Unity 3D
  3. 【CTF练习平台】BugkuCTF部分misc writeup
  4. 生物特征识别技术领跑者--墨奇科技 全面亮相2022身份识别技术大会
  5. think php5 离线手册,thinkphp5.0离线手册下载
  6. 【JZOJ100209】【20190705】狂妄之人
  7. OneNET麒麟座应用开发之一:初识OneNET麒麟座
  8. 服务器远程登录用户在哪查看,RAKsmart VNC用户登录信息在哪查看?
  9. 助力金融科技产业发展 360金融AI之夜成功举办
  10. vue如何判断iOS与Android系统