解析pdf图片格式的表格到excel表格

本文涉及的产品
票据凭证识别,票据凭证识别 200次/月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
文档理解,结构化解析 100页
简介: 解析pdf图片格式的表格到excel表格,原理是把pdf转换成图片,根据直方图定位表格单元格线条位置,按照单元格切分原始pdf,按顺序ocr单元格内容,最终拼接成完整excel
# -*- coding: utf-8 -*-"""Created on Wed Aug  3 10:06:27 2022@author: 01394546"""importcv2importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdfromPILimportImageimportcv2importnumpyasnpimportfitz##如果安装失败,可以直接安装pip install PyMuPDF后,fitz就可以正常使用了importpytesseractimportmatplotlib.pyplotaspltimportos# 处理文件frompdf2imageimportconvert_from_path# pdf转图片importpytesseract# 识别图片文字importcsv# 处理csv文件deftess_ocr(pdf_path):
# 创建一个和pdf同名的文件夹images=convert_from_path(pdf_path, fmt='png', output_folder='./out/',
userpw='site',poppler_path=r'E:\poppler-0.68.0_x86\poppler-0.68.0\bin')  # 转成图片# pdf_document = '2022年南山宝安避雷名单-截止2022年7月(OCR).pdf'doc=fitz.open(pdf_path)
result= {}
for (i,img) inenumerate(images):
# plt.xticks([]), plt.yticks([])  # 隐藏x和y轴# plt.imshow(np.asarray(img))# plt.savefig('./out/{0}_{1}页.png'.format(pdf_path, i+1))# plt.show()print('正在处理{0}的第{1}/{2}页。。。'.format(pdf_path,i,len(images)))
print(np.asarray(img).shape)
b, g, r=cv2.split(np.asarray(img))  # 分别提取B、G、R通道img_new1=cv2.merge([r, g, b])  # 重新组合为R、G、Bxs,ys=cut_pdf2_pic(img_new1)
page1=doc.load_page(i)  # pdf文件第一页rect=page1.rect# print(rect)# print('ys----',ys)iflen(ys)==7:
cols=['行政区','区域','地址','事件描述','黑房东联系方式','事件时间']
else:
cols= [ '区域', '地址', '事件描述', '黑房东联系方式', '事件时间']
forjinrange(len(xs) -1):
foriinrange(len(ys) -1):
# 在分割时,第一个参数为y坐标,第二个参数为x坐标# print('xs[j]--',xs[j])# print('xs[j + 1]--',xs[j + 1])# print('ys[i]--', ys[i])# print('ys[i + 1]--', ys[i + 1])# print('(ys[i]/ys[-1])',(ys[i]/ys[-1]))# print('(ys[i]/ys[-1]) * rect.width', (ys[i]/ys[-1]) * rect.width)# print('(ys[i+1]/ys[-1])', (ys[i+1]/ys[-1]))# print('(ys[i+1]/ys[-1])* rect.width', (ys[i+1]/ys[-1])* rect.width)clip=fitz.Rect(((ys[i]-30)/ys[-1]) *rect.width, ((xs[j]-50)/xs[-1]) *rect.height,
                                 ((ys[i+1]+30)/ys[-1])*rect.width, ((xs[j+1]+50)/xs[-1])*rect.height)
a_text=page1.get_text(clip=clip)
# print(a_text)result[cols[i]]=result.get(cols[i],[])
result[cols[i]].append(a_text.replace('\n',''))
# for i in result.keys():#     print(len(result[i]))print(result)
data=pd.DataFrame(result)
data.index.name='编号'data['标注名称'] =data['地址']
if'行政区'inlist(data.columns):
data['地名地址'] ='深圳市'+data['行政区']+data['区域'] +data['地址']
else:
data['地名地址'] ='深圳市'+data['区域'] +data['地址']
data['经度'] =Nonedata['纬度'] =Nonedata['被举报原因'] =data['事件描述']
data['举报日期[日期]'] =data['事件时间']
data[['标注名称', '地名地址', '经度', '纬度', '被举报原因','黑房东联系方式', '举报日期[日期]']].to_csv(os.path.join('./黑房东数据/OUT/', pdf_path.split('/')[-1]+'.csv'))
defcut_pdf2_pic(image):
# image = cv2.imread('./20220809193309.png', 1)# print(image)# 灰度图片gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化binary=cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
# ret,binary = cv2.threshold(~gray, 127, 255, cv2.THRESH_BINARY)# cv2.imshow("二值化图片:", binary) #展示图片# cv2.waitKey(0)rows, cols=binary.shapescale=20# 识别横线kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (cols//scale, 1))
eroded=cv2.erode(binary, kernel, iterations=1)
# cv2.imshow("Eroded Image",eroded)dilatedcol=cv2.dilate(eroded, kernel, iterations=1)
# cv2.imshow("表格横线展示:",dilatedcol)# cv2.waitKey(0)# 识别竖线scale=20kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows//scale))
eroded=cv2.erode(binary, kernel, iterations=1)
dilatedrow=cv2.dilate(eroded, kernel, iterations=1)
# cv2.imshow("表格竖线展示:",dilatedrow)# cv2.waitKey(0)# 标识表格merge=cv2.add(dilatedcol, dilatedrow)
# cv2.imshow("表格整体展示:", merge)# cv2.waitKey(0)print('merge.shape:', merge.shape)#页面的长和宽,对应矩阵的行和列x=merge.sum(axis=0)  #像素向上叠加,长度等于列y=merge.sum(axis=1)  #像素向右边叠加,长度等于行# print(x,len(x))# print(y,len(y))ys=np.where(x>255*len(y) *0.6)#竖线xs=np.where(y>255*len(x) *0.80)#横线ys=list(ys[0])
xs=list(xs[0])
xs2=[]
ys2=[]
xs=[0]+xsforjinrange(len(xs) -1):
ifxs[j+1] -xs[j] <20: continuexs2.append(xs[j])
xs2.append(xs[-1])
ys=[0]+ysforiinrange(len(ys) -1):
ifys[i+1] -ys[i] <20: continueys2.append(ys[i])
ys2.append(ys[-1])
print(xs)
print(xs2)
print(ys)
print(ys2)
xs=xs2ys=ys2# for j in range(len(xs) - 1):#     for i in range(len(ys) - 1):#         # 在分割时,第一个参数为y坐标,第二个参数为x坐标#         ROI = image[xs[j]:xs[j + 1], ys[i]:ys[i + 1]]  # 减去3的原因是由于我缩小ROI范围#         # cv2.imshow("分割后子图片展示:",ROI)#         # cv2.waitKey(0)##         b, g, r = cv2.split(ROI)  # 分别提取B、G、R通道#         img_new1 = cv2.merge([r, g, b])  # 重新组合为R、G、B##         if np.var(img_new1) > 1000:#             print('第{0}行--第{1}列----------------'.format(j, i))#             print(np.var(img_new1))#             plt.xticks([]), plt.yticks([])  # 隐藏x和y轴#             plt.imshow(img_new1)#             plt.savefig('./out/第{0}行,第{1}列.png'.format(j, i))#             # plt.show()# text = pytesseract.image_to_string(img_new1, lang='chi_sim+eng')  # 识别图片文字returnxs,ysimportosTemp_Dir1='./OCR/'forroot, dirs, filesinos.walk(Temp_Dir1, topdown=False):
for (i_,file_path) inenumerate(files):
print(i_,file_path)
tess_ocr(os.path.join(root, file_path))
目录
相关文章
|
4天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
51 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
4月前
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
380 15
概率分布深度解析:PMF、PDF和CDF的技术指南
|
3月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
263 16
|
3月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
485 5
|
3月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
161 2
|
3月前
|
存储 安全 网络安全
Python编程--使用PyPDF解析PDF文件中的元数据
Python编程--使用PyPDF解析PDF文件中的元数据
78 1
|
5月前
|
前端开发 PHP
ThinkPHP6之Excel解析
ThinkPHP6之Excel解析
61 0
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
3月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
174 4
|
8天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。

热门文章

最新文章

推荐镜像

更多