Как игнорировать таблицу и ее содержимое при извлечении текста из pdf
Пока мне удалось извлечь текстовое содержимое из файла pdf. Я застрял в точке, где мне нужно извлечь текстовое содержимое за пределы таблицы (игнорировать таблицу и ее содержимое) и мне нужна помощь
Pdf можно скачать здесь
import pdfplumber
pdfinstance = pdfplumber.open(r'\List of Reportable Jurisdictions for 2020 CRS information reporting_9 Feb.pdf')
for epage in range(len(pdfinstance.pages)):
page = pdfinstance.pages[epage]
text = page.extract_text(x_tolerance=3, y_tolerance=3)
print(text)
1 ответ
Для PDF-файла, которым вы поделились, вы можете использовать следующий код для извлечения текста за пределы таблиц.
import pdfplumber
def not_within_bboxes(obj):
"""Check if the object is in any of the table's bbox."""
def obj_in_bbox(_bbox):
"""See https://github.com/jsvine/pdfplumber/blob/stable/pdfplumber/table.py#L404"""
v_mid = (obj["top"] + obj["bottom"]) / 2
h_mid = (obj["x0"] + obj["x1"]) / 2
x0, top, x1, bottom = _bbox
return (h_mid >= x0) and (h_mid < x1) and (v_mid >= top) and (v_mid < bottom)
return not any(obj_in_bbox(__bbox) for __bbox in bboxes)
with pdfplumber.open("file.pdf") as pdf:
for page in pdf.pages:
print("\n\n\n\n\nAll text:")
print(page.extract_text())
# Get the bounding boxes of the tables on the page.
bboxes = [
table.bbox
for table in page.find_tables(
table_settings={
"vertical_strategy": "explicit",
"horizontal_strategy": "explicit",
"explicit_vertical_lines": page.curves + page.edges,
"explicit_horizontal_lines": page.curves + page.edges,
}
)
]
print("\n\n\n\n\nText outside the tables:")
print(page.filter(not_within_bboxes).extract_text())
Я использую
.filter()
метод, предоставленный
pdfplumber
чтобы отбросить любые объекты, попадающие в ограничительную рамку любой из таблиц (в
not_within_bboxes(...)
) и создание отфильтрованной версии страницы, которая будет содержать только те объекты, которые выходят за пределы любой из таблиц.