Существует куча опенсорс и проприетарных решений, которые реализуют извлечение текста из PDF-документов. Зачем знакомиться с PyMuPDF?
Постараемся ответить на этот вопрос, рассмотрим отличия PyMuPDF от других инструментов, и реализуем базовые действия в этой библиотеке.
import fitz # Импорт PyMuPDF
doc = fitz.open("PyMuPDF.pdf") # Открываем документ
page = doc[0] # Указываем номер нужной страницы
text = page.get_text() # Извлекаем текст
print(text) # Выводим его
all_text = ""
for page in doc:
all_text += page.get_text() + chr(12)
all_text = chr(12).join([page.get_text() for page in doc])
page_rect = page.rect # Прямоугольник на всю страницу
half_width = page_rect.width / 2 # Вычисляем половину ширины страницы
left_rect = +page_rect # Подготавливаем левую половину страницы: копируем прямоугольник страницы
left_rect.x1 = half_width # Делаем его в два раза уже
right_rect = +page_rect # Подготавливаем правую половину страницы: копируем прямоугольник страницы
right_rect.x0 = half_width # Левая граница - это середина страницы
# Используем эти два прямоугольника в качестве областей обрезки для извлечения:
left_text = page.get_text(sort=True, clip=left_rect)
right_text = page.get_text(sort=True, clip=right_rect)
import fitz
doc = fitz.open("PyMuPDF.pdf")
page = doc[0]
all_infos = page.get_text("dict", sort=True)
pprint(all_infos)
{'blocks': [{'bbox': (240.0, 88.94, 540.0, 388.94),
'bpc': 8,
'colorspace': 3,
'ext': 'png',
'height': 1200,
'image':
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xb0'
<< ... omitted data ... >>,
'number': 0,
'size': 107663,
'transform': (300.0, 0.0, -0.0, 300.0, 240.0, 88.94),
'type': 1,
'width': 1200,
'xres': 96,
'yres': 96},
{'bbox': (236.90, 396.92, 540.0, 432.41),
'lines': [{'bbox': (236.90, 396.92, 540.0, 432.41),
'dir': (1.0, 0.0),
'spans': [{'ascender': 1.125,
'bbox': (236.90, 396.92, 540.0, 432.41),
'color': 0,
'descender': -0.307,
'flags': 20,
'font': 'TeXGyreHeros-Bold',
'origin': (236.90, 424.80),
'size': 24.79,
'text': 'PyMuPDF Documentation'}],
'wmode': 0}],
'number': 1,
'type': 0},
{'bbox': (422.28, 433.36, 540.0, 457.98),
'lines': [{'bbox': (422.28, 433.36, 540.0, 457.98),
'dir': (1.0, 0.0),
'spans': [{'ascender': 1.123,
# ... и так далее
text = page.get_text("html")
html_page = open("page-%i.html" % page.number, "w")
html_page.write(text)
html_page.close()
before: 'binaries we generate – our decisions are ��u��t i�� i�to them.
'after: 'binaries we generate — our decisions are “burnt in” into them. '
Источник: Medium