前言

一切都得从三天想法开始说起,一张带有部分信息需要填入的表格,当这些填过很多次的东西再一次的出现在我的面前,实在是填烦了。于是我打开了另一张的表格开始,ctrl c,ctrl v。但是这玩意容易烦。

填这干嘛,练字。。

这时我就想如果能将第二张上的信息迁移到第一张上面,那该有多好。我去写点真正需要新写进的内容就玩了呀。所以一点奇怪的想法就此诞生。

day 1

复现了两个ocr相关的程序E:\2024\下载文件scr2txt-master另一个在一点奇怪的想法——paddleocr复现使用-CSDN博客

有讲到,现阶段的作用不大,如果后期需要写软件可以参考,作为一个没有审美的人,更喜欢copy之后在改改能用就行,最后就是将paddleocr做了复现

在下午认识到了paddleocr识别的应用——ppstructure下的关键信息抽取

一点奇怪的想法——paddleocr识别的应用——ppstructure下的关键信息抽取-CSDN博客

当时就被这个图片一下震慑到了,就是这个,就是这个。

对要用到的工具确定后就开始了复现,确实在百度飞桨的平台里又很多好的想法和项目,在我觉得和无从下手的时候这个大佬给了我一点信心 我看完了他的1和5简历信息提取(五):用VI-LayoutXLM提升关键信息抽取效果 - 飞桨AI Studio星河社区 (baidu.com)

1提供的信息,5提供的行动力,在我的博客里讲到了用到的函数。

一点奇怪的想法——PDFPlumber和PP-Structure——大佬给予的灵感-CSDN博客

这个时关键信息提取后生成的图像,后面的时对关键信息提取后的一些需要的信息保存为infer.txt文件

那么在这里对第一张图片的处理就已经结束了 ,剩下的就是如何将第一张存在的信息放入第二张。

#关于一点为啥不直接用ocr+nlp----->很简单,不咋会。

我本以为第二张用同样的方式提取就好了,但是效果不佳,或者是没啥用

后面用上祖传手艺opencv的特征匹配,那就是瞎子画谱,乱来。

day 2

对第二张图开始新的尝试

一点奇怪的想法 ——ppstructure中关键信息的提取和表格识别的结合---->我以为的结束,其实是折磨的开始-CSDN博客n

在这个上面开启了鼓捣 

框也还行,xlsx文件也还行,但是保存的信息我不咋知道怎么处理,所以就对predict_table.py中的大多参数进行输出,顺便研究下代码,然后就是,它是由两个画框体系构成的,有的是保存四个数,有的保存8个数,在对这些分别输出然后调用这两个去画图

因为要做区分所以重新定义了一下draw_rectangle---这个画红色框,draw_boxes----这个画蓝色框


        if len(pred_res['cell_bbox']) > 0 and len(pred_res['cell_bbox'][
                0]) == 4:
            img = predict_strture.draw_rectangle(image_file,
                                                 pred_res['cell_bbox'])
        else:
            img = utility.draw_boxes(img, pred_res['cell_bbox'])
        img_save_path = os.path.join(args.output, os.path.basename(image_file))
        cv2.imwrite(img_save_path, img)

我在晚上对着这三张图看了半天,也不知道咋来的。代码还是的下点功夫

就在这种情况下我想到能否将信息直接填入word中,上代码

from docx import Document  
  
# 加载Word文档  
doc = Document('E:/2024/PaddleOCR-release-2.6/mytest/test2.docx')  
table_data = {
    "姓  名":"张三",
    "出生年月":"20010101",
    "联系电话":"1234567890", 
    "性别":"男", "民族":"汉",  
    "政治面貌":"群众", 
    "所在院校":"汉语言", 
    "年纪专业":"19级"}
  
# 获取文档中的第一个表格  
table = doc.tables[0]  

for row_index, row in enumerate(table.rows[1:], start=1):  # 从第二行开始填充数据(假设第一行是标题行)  
    for key, value in table_data.items():  
        # 查找键对应的列标题  
        column_index = None  
        for cell_index, cell in enumerate(table.rows[0].cells):  # 遍历标题行来找到列索引  
            if cell.text == key:  
                column_index = cell_index  
                break  
          
        # 如果找到了列标题,则填写数据到对应的单元格中  
        if column_index is not None:  
            cell = row.cells[column_index]  
            cell.text = value  
        else:  
            print(f"Column header '{key}' not found in the table. Skipping...")
  
 
  
doc.save('E:/2024/PaddleOCR-release-2.6/mytest/cesi2.docx')

不笑好吧,跑是能跑的。但是跑的结果------难绷。。。属于是小🔪拉屁眼,开眼了就写进去了一个,果然群众的力量是强大的

day3---today

使用ocr识别做测试,但用ocr对分散的文字,或者不在同一直线上,识别的效果很差,可能不,肯定加文字处理后的表格识别会更好一点

最后的方案是将infer文件中信息提取出来作为table_data = {
    "姓  名":"张三",
    "出生年月":"20010101",
    "联系电话":"1234567890", 
    "性别":"男", "民族":"汉",  
    "政治面貌":"群众", 
    "所在院校":"汉语言", 
    "年纪专业":"19级"}

还有一些写过来,在表格识别中图片二会生成一个testas005.xlsx的表格文件,

将表格中的信息提取出来,与table_data进行对比写入

from openpyxl import load_workbook  
import openpyxl

table_data = {  
    "姓名": "张三",  
    "出生年月": "20010101",  
    "联系电话": "1234567890",  
    "性别": "男",  
    "民族": "汉",  
    "政治面貌": "群众",  
    "所在院校": "汉语言",  
    "年纪专业": "19级"  
}  

# 加载现有的Excel文件  
wb = load_workbook('E:/2024/PaddleOCR-release-2.6/mytest/output/testyu.xlsx')  
ws = wb.active  # 获取活动工作表  
keys_list = list(table_data.keys())  
values_list = list(table_data.values())
  
  # ----->获取表格中的信息
location_info_dict = {}  #--------> 将张三放到位置
  
def xlsx_to_set(ws):
    cell_data = {}
    for row in ws.iter_rows():  
        for cell in row:  
            # 跳过空单元格  
            if cell.value is not None:  
                # 获取单元格的行、列和值  
                row_idx = cell.row  
                col_idx = cell.column  
                value = cell.value  
                
                # 将单元格的值和位置以字典形式存储  
                # 使用行号和列号作为键,值作为值  
                cell_data[(row_idx, col_idx+1)] = value  #------->往后一格
    return cell_data
# print(cell_data)
# 遍历工作表中的单元格  
def set_to_dict(table_data,cell_data):
    global location_name_dict
    location_name_dict = {} 
    for location, tag in cell_data.items():
        for loc, name in table_data.items(): 
        # print (location,tag) 
        # location, tag = (1,2):姓名
        # loc, name ="姓名",“张三”
            if loc== tag:
                    location_name_dict[location] =name
            continue
        # 从标签到名称的字典中获取名称         
    return location_name_dict

def dict_to_xlsx(ws,wb):
    global location_name_dict
    for coord, value in location_name_dict.items():  
        lo_row, lo_col = coord  # 解包坐标 
        # print(row) 
        # print(coord)
        # print(value)
        if 1 <= lo_row <= ws.max_row and 1 <= lo_col <= ws.max_column:  

            ws.cell(row=lo_row, column=lo_col, value=value)  
            print (value)
            key_word ="完了"
            ws.cell(row= ws.max_row,column=ws.max_column, value=key_word)
            
        else:  
            
            print(f"坐标({lo_row}, {lo_col})超出工作表边界,未写入数据。")  
    wb.save('E:/2024/PaddleOCR-release-2.6/mytest/output/testyu.xlsx')


if __name__ == '__main__':
# 打印结果  
    xlsx_to_set(ws)
    # print (cell_data)
    set_to_dict(table_data,xlsx_to_set(ws))
    dict_to_xlsx(ws,wb)
    # print (table_data.items())
    # print (set_to_dict(table_data,xlsx_to_set(ws)))
    #输出(2,2)张三

最后的结果就是写了五个进去了。

还是太垃圾了我。

over总结+规划

1 想法永远都是想法,只有做出来的才叫产品。多动手,多尝试。

2提高自己的信息收集能力,有些东西不是没有,只是自己找不到。Ai很好,但是你和他沟通的表述不对他就是个笨蛋。

3 pdf word,excel这三种的表格,今年吧争取在空闲时间做出来,不埋坑。

4 peddleocr C++进行一次复现

5 后面看看有没有相似的数据集,加一些自己的数据做些训练。

over

看到的朋友,好运。。。

GitHub 加速计划 / pa / PaddleOCR
41.53 K
7.59 K
下载
Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
最近提交(Master分支:3 个月前 )
7bbda2bc 6 天前
1d4e7a80 8 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐