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

本文涉及的产品
票证核验,票证核验 50次/账号
小语种识别,小语种识别 200次/月
票据凭证识别,票据凭证识别 200次/月
简介: 解析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))
目录
相关文章
|
1月前
|
机器学习/深度学习 文字识别 Shell
高效率办公PDF批量处理:批量OCR识别PDF区域文字内容,用PDF内容批量改名或导出表格的货物运单应用案例
针对铁路货运物流单存档需求,本项目基于WPF与飞桨OCR技术,实现批量图片多区域文字识别与自动重命名。用户可自定义识别区域,系统提取关键信息(如车号、批次号)并生成规范文件名,提升档案管理效率与检索准确性,支持PDF及图像文件处理。
283 0
|
3月前
|
移动开发 JavaScript
(H5查看CAD)网页CAD提取图纸表格到excel
本文介绍如何通过自定义MxCAD插件,在Web端智能识别CAD图纸中的表格,实现自动合并与高效导出至Excel,提升数据提取效率与准确性。内容涵盖区域选择、图形识别、表格结构重建、单元格合并及内容导出等关键技术,适用于工程图纸数据自动化处理场景。
|
2月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
539 0
|
6月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
287 10
|
5月前
|
人工智能 开发工具 开发者
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。
278 0
|
7月前
|
安全 搜索推荐 iOS开发
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
407 8
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
|
11月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
2559 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
8月前
|
JavaScript 前端开发 数据可视化
20.6K star!Excel级交互体验!这款开源Web表格神器绝了!
Handsontable 是一款功能强大的 JavaScript 数据表格组件,提供类 Excel 的交互体验。支持实时协作、数据绑定、公式计算等企业级功能,可轻松集成到 React/Vue/Angular 等主流框架。
1572 11
|
8月前
|
人工智能 数据可视化 前端开发
Probly:开源 AI Excel表格工具,交互式生成数据分析结果与可视化图表
Probly 是一款结合电子表格功能与 Python 数据分析能力的 AI 工具,支持在浏览器中运行 Python 代码,提供交互式电子表格、数据可视化和智能分析建议,适合需要强大数据分析功能又希望操作简便的用户。
1124 2
|
10月前
|
人工智能 文字识别 自然语言处理
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式
Vision Parse 是一款开源的 PDF 转 Markdown 工具,基于视觉语言模型,能够智能识别和提取 PDF 中的文本和表格,并保持原有格式和结构。
1390 19
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式

热门文章

最新文章

推荐镜像

更多
  • DNS