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

本文涉及的产品
小语种识别,小语种识别 200次/月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 解析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))
目录
相关文章
|
18天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
79 5
|
13天前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
31 2
|
26天前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
|
2月前
|
机器学习/深度学习 算法
概率分布深度解析:PMF、PDF和CDF的技术指南
本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。
210 15
概率分布深度解析:PMF、PDF和CDF的技术指南
|
1月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
187 16
|
1月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
311 5
|
1月前
|
存储 安全 网络安全
Python编程--使用PyPDF解析PDF文件中的元数据
Python编程--使用PyPDF解析PDF文件中的元数据
|
1月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
130 0
|
1月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
38 0
|
1月前
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。

推荐镜像

更多
下一篇
无影云桌面