Я читаю файл PDF и преобразую страницы в изображения с использованием pdf2image после преобразования всех страниц в изображения. Я использую Opencv для извлечения определенной таблицы c из изображения, которое я использую с помощью общих методов обработки изображений, таких как преобразование изображение в оттенках серого и применяя к нему некоторую морфологическую операцию для получения таблицы.
Проблема, с которой я сталкиваюсь, заключается в том, что мой код не может прочитать все ячейки таблицы, иногда отсутствуют данные,
#sort all the contours from top to bottom
(contours, boundingBoxes) = sort_contours(contours,method="top-to-bottom")
#crop all the boxes
idx = 0
for c in contours:
x,y,w,h = cv2.boundingRect(c)
if cv2.contourArea(c)<300000: #(w > 80 and h > 20) and w > 3*h:
idx += 1
new_img = img[y:y+h, x:x+w]
r = 1600/new_img.shape[1]
dim = (1600,int(new_img.shape[0]*r))
new_img = cv2.resize(new_img,dim)
cv2.imwrite(str(idx) + '.png',new_img)
#this function reads and returns text inside the cropped cell
val = highlight_text(new_img)
text.append(val)
text = list(filter(lambda x: x != " ", text))
os.chdir("..\\images_from_pdf")
return text
Теперь эта функция возвращает значение извлеченного текста из каждой ячейки в виде списка сверху вниз, т.е.
['**particulars**'.'zohaib ali','**Name**', '1234','**identity**']
В этом списке первое значение не имеет значения, поэтому я удаляю это. После этого я сортирую список таким образом, что оба значения меняются местами, т.е.
['**Name**','zohaib ali','**identity**','1234']
Теперь он точно в том формате, который мне нужен для хранения в словаре или json, но если он пропускает одиночное значение , весь порядок испорчен, и мне нужно снова отсортировать вещи, исходя из того, откуда было пропущено значение.
Ожидаемый результат:
Теперь я хочу отсортировать перечислить таким образом, чтобы я мог определить пропущенные значения из таблицы, но я не могу сделать это, я написал другую функцию для сортировки, но безрезультатно, пожалуйста, помогите
Представлять
import json
import re
def interchange_val(val):
for i in range(0,len(val)-1,2):
val[i],val[i+1] = val[i+1],val[i]
return val
def make_dict(val_list:list, form_keys:list)->dict:
test = [] #list to check the current values is either key or value if it is
a key then true else False
i= 0 #counter for val_list
j= 0 #counter for form_keys
val_dic = [] #final result after processing the list
'''
This loop will iterate over the lists and if it found the form_key in
correct position in case of val_list i.e
1. Name and its value
2. Identity and its value
4 Amount and its value
it will print [True,False,True,False,True,False]
In case val_list_1 it will produce an output like
[False,True,,False,True, True]
In case val_list_2 it will produce an output like
[True,False,False,False,True]
'''
while i<len(val_list) and j<len(form_keys):
print("inside loop")
keyword = form_keys[j].split()
print(keyword)
search_words = val_list[i]
print(search_words)
word = re.compile(rf'\b{keyword[0]}\b',flags=re.I|re.X)
y = re.findall(word,search_words)
print(y)
if (i == 0) and (len(y)>=1):
# val_dic.append("")
test.append(True)
# val_dic.append("")
j += 1
i += 1
continue
elif (i == 0) and (len(y)==0):
# val_dic.append("")
test.append(False)
# val_dic.append("")
j += 1
i += 1
continue
elif (i>0) and (len(y)>=1):
print("inside if")
# val_dic.append("")
test.append(True)
i+=1
# elif (i%2 == 1) and (len(y)>=2):
# # val_dic.append(val_list[i-1].upper())
# print("inside elif")
else:
i+=1
test.append(False)
# if i == len(val_list) and j<len(val_list):
# i = 0
# j+=1
# test.append("")
continue
j += 1
print(test)
'''
Now this loop will try to assemble all the data using test as the condition
'''
for i, val in enumerate(test):
if (i==0) and (val == True) and (test[i+1] == False):
val_dic.append(val_list[i+1])
continue
if (i==0) and (val == False):
val_dic.append("")
continue
elif (i>1) and (val == False) and (test[i-1] == True):
val_dic.append(val_list[i])
continue
elif (i>1) and (i<len(test)-1) and (val == False) and (test[i+1] == False):
# test[i+1] = True
# test[i+2] = False
# # val_dic.`append(val_list[i+1])
continue
elif (i>1) and (i<len(test)-1) and (val == True) and (test[i+1] == True):
val_dic.append("")
continue
return val_dic
def main_func():
#Correct Order of items
val_list = ["particulars", "Zohaib Ali", "Name", "1234", "Identity", "24", "Amount"]
#Incorrect Order of Items the value of Name field has been missed during reading the data
val_list_1 = ["particulars", "Name", "1234", "Identity", "24", "Amount"]
#Incorrect Order of Items the value of identity key has been missed during reading the data
val_list_2 = ["particulars","Zohaib", "Name", "1234", "24", "Amount"]
#keys that must be present in the form but might be missed during form reading
form_keys = ["Name",
"Identity",
"Amount"]
if val_list[0] == "particulars":
val_list.remove(val_list[0])
val = interchange_val(val_list)
x = make_dict(val_list,form_keys)
print(x)
if __name__ == "__main__":
main_func()