функция pdfplumber extract_text также извлекает текст из таблицы. Требуется только извлечь текст за пределы таблицы

#python #pdf #pdfplumber

Вопрос:

У меня есть pdf-файл, содержащий текст и таблицы. Я хочу извлечь их оба, но когда я использовал функцию extract_text, она также извлекает содержимое, которое находится внутри таблицы. Я просто хочу извлечь только текст, который находится за пределами таблицы, и таблицу можно извлечь с помощью функции extract_tables.

Я протестировал файл pdf, который содержит только таблицы, но по-прежнему извлекает текст, а также содержимое таблицы, которое я хочу извлечь с помощью функции extract_tables.

Ответ №1:

Вы можете попробовать использовать следующий код

 import pdfplumber

# Import the PDF.
pdf = pdfplumber.open("file.pdf")

# Load the first page.
p = pdf.pages[0]

# Table settings.
ts = {
    "vertical_strategy": "lines",
    "horizontal_strategy": "lines",
}

# Get the bounding boxes of the tables on the page.
bboxes = [table.bbox for table in p.find_tables(table_settings=ts)]

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)

print("Text outside the tables:")
print(p.filter(not_within_bboxes).extract_text())
 

Я использую .filter() метод, предоставленный pdfplumber, чтобы удалить любые объекты, которые попадают в ограничивающую рамку любой из таблиц, и создать отфильтрованную версию страницы, а затем извлечь из нее текст.

Поскольку вы не предоставили общий доступ к PDF-файлу, настройки таблицы, которые я использовал, могут не работать, но вы можете изменить их в соответствии с вашими потребностями.