Untitled
unknown
python
2 years ago
3.3 kB
10
Indexable
!pip install opencv-python
!pip install opencv-contrib-python
!pip install opencv-python-headless==4.9.0.80
import cv2
!pip install img2table
from img2table.document import Image
pip install Pillow
from PIL import Image as PILImage
pip install pdf2image
conda install -c conda-forge poppler
pip install easyocr
import easyocr
import pathlib
import pandas as pd
cur_path = pathlib.Path().resolve() # текущий путь до папки
cur_path
name = 'Доп_соглашение_о_мин_объеме_ТМС_от_01_10_2022' # название pdf файла
# name = 'ДС_о_минимальном_объеме_№1_от_01.12.2022'
# name = 'ДС_тест_качество'
img_path = f'{cur_path}/{name}.pdf' # расположение pdf файла
img_path
from pdf2image import convert_from_path
pages = convert_from_path(img_path)
pages
for count, page in enumerate(pages):
if count == 0:
page.save(f'{name}_1st_page.jpg', 'JPEG') # сохраняем 1-ую страницу в текущую папку
instance_path = f'{cur_path}/{name}_1st_page.jpg'
img = Image(instance_path)
# Extract tables
extracted_tables = img.extract_tables()
# Display extracted tables
table_img = cv2.imread(instance_path)
for table in extracted_tables:
for row in table.content.values():
for cell in row:
cv2.rectangle(table_img, (cell.bbox.x1, cell.bbox.y1), (cell.bbox.x2, cell.bbox.y2), (255, 0, 0), 2)
PILImage.fromarray(table_img)
!mkdir {cur_path}/rus_ft # создаем папку
!unzip {cur_path}/rus_ft.zip -d {cur_path}/rus_ft # распаковываем архив с моделью в папку
EXPERIMENT_NAME = 'rus_ft' # название эксперимента
OUT_MODEL_PATH = f'{cur_path}/rus_ft' # путь до папки с моделью
reader = easyocr.Reader(["ru"], # код языка распознавания (ISO 639)
model_storage_directory=OUT_MODEL_PATH,
user_network_directory=OUT_MODEL_PATH,
recog_network=EXPERIMENT_NAME)
res_table = [] # список строк со всеми значениями ячеек
current_row = [] # значения ячеек текущей строки
for table in extracted_tables: # цикл по всем таблицам
for row in table.content.values(): # цикл по всем строкам
for cell in row: # цикл по всем столбцам
crop = table_img[cell.bbox.y1:cell.bbox.y2, cell.bbox.x1:cell.bbox.x2] # берем ячейку
result = reader.readtext(crop) # координаты bounding boxes, распознанный текст в них и вероятность
txt = "\n".join([elem[1] for elem in result]) # распознанный текст из всех bounding boxes
txt_n = txt.replace('\n',' ') # распознанный текст без переноса строк
current_row.append(txt_n)
res_table.append(current_row)
current_row = []
df = pd.DataFrame(res_table)
df
df.to_csv(f'{name}.csv', encoding='cp1251', header=False)
Editor is loading...
Leave a Comment