Как извлечь текст под конкретные заголовки из PDF?
1 ответ
Именно над этим сценарием я работаю в своей нынешней компании. Нам нужно извлечь текст, лежащий под заголовком. Я лично использую систему на основе правил, то есть использую регулярное выражение для идентификации всех пронумерованных заголовков после чтения всего документа построчно. Получив заголовки, я ввожу название заголовка, для которого хочу найти соответствующий абзац. Этот ввод сопоставляется с уже существующим списком заголовков, и с помощью универсального кодировщика предложений я нахожу ближайшее совпадение. После этого я просто отображаю все содержимое, которое присутствует, начиная с этого заголовка и заканчивая непосредственно следующим заголовком.
Лучший метод, который я нашел, используя регулярное выражение
regex = r"^\d+(?:\.\d+)* .*(?:\r?\n(?!\d+(?:\.\d+)* ).*)*"
print(re.findall(regex,samplestring, re.M))
PDF - это неструктурированный текст, поэтому нет тегов для непосредственного извлечения данных. Поэтому мы используем регулярное выражение, чтобы найти нужную информацию из корпуса текста. Извлеките необработанный текст страницы, используя следующий код.
import fitz
page = pdf_file.loadPage(0) # 0 represents the page number... upto n-1 pages...
dl = page.getDisplayList()
tp = dl.getTextPage()
tp_text=tp.extractText()
re.split('\n\d+.+[ \t][a-zA-Z].+\n',tp_text)
Затем примените регулярное выражение в соответствии с вашими потребностями... (это сработало для меня, но вам может потребоваться или не нужно его менять)
Я привожу подробный пример, как это будет работать
re.findall('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")
Вывод: ['\n1. заголовок 1\n', '\n1.2.3 Заголовок 2\n']
Вы можете использовать re.split
для разделения текста по заголовкам и получения нужного текста заголовка.
re.split('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")
Вывод: ['какой-то текст', 'абзац 1', 'абзац 2']
Просто i-й заголовок будет иметь (i+1) текст заголовка.
Вы можете использовать Python-библиотеку PyPDF2 для этого, ниже приведены некоторые примеры фрагментов с использованием PyPDF2.
# importing required modules
import PyPDF2
# creating a pdf file object
pdfFileObj = open('example.pdf', 'rb')
# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# printing number of pages in pdf file
print(pdfReader.numPages)
# creating a page object
pageObj = pdfReader.getPage(0)
# extracting text from page
print(pageObj.extractText())
# closing the pdf file object
pdfFileObj.close()