Как извлечь текст из PDF в Python: сравнение 3 библиотек
Извлечение текста из PDF в Python кажется простой задачей, но на практике разработчики быстро сталкиваются с исключениями, сломанной вёрсткой и упрямыми файлами, где весь контент — это изображения. В этом руководстве — только практика. Сначала сравним лучшие Python-библиотеки для чтения PDF, чтобы вы сразу выбрали подходящий инструмент под свой проект.

Дальше разберём примеры кода для трёх самых полезных библиотек — PyPDF2, pdfplumber и PyMuPDF (Fitz): от базового извлечения текста до работы со сложными таблицами. Отдельно рассмотрим и самый неудобный случай — сканированные PDF, для которых нужен OCR, и покажем практичный способ обработки без сложной локальной настройки. В итоге у вас будут и готовые примеры кода, и понятная стратегия, как надёжно автоматизировать обработку PDF.
Быстрый вывод: лучшие библиотеки Python для извлечения текста из PDF
Прежде чем переходить к коду, вот краткое сравнение основных вариантов. Выбор полностью зависит от того, что для вас важнее: скорость, простота или точный анализ структуры документа.
| Библиотека | Лучше всего подходит для | Работа с макетом/таблицами | Производительность | Простота использования (1–5) |
|---|---|---|---|---|
| PyPDF2 | Простые текстовые документы; базовые операции с PDF (объединение/разделение) | Слабая (извлекает текстовый поток без позиционных данных) | Средняя | 5 |
| pdfplumber | Извлечение данных из таблиц; документы со структурированной вёрсткой | Отличная (даёт координаты текста, линий и прямоугольников) | Ниже | 4 |
| PyMuPDF (Fitz) | Быстрая пакетная обработка; работа с изображениями и аннотациями | Хорошая (может извлекать текст с базовой позиционной информацией) | Отличная (самая быстрая) | 4 |
Итог: для самых простых сценариев начинайте с PyPDF2. Как только в PDF появляются таблицы, переходите на pdfplumber. Если на первом месте скорость, выбирайте PyMuPDF.
Перед началом: настройка окружения Python
Чтобы зависимости проекта оставались в порядке и не конфликтовали друг с другом, работайте внутри виртуального окружения. Для любого серьёзного проекта на Python это обязательная практика.
Вот как всё настроить в терминале:
- Создайте виртуальное окружение:
# В macOS/Linux
python3 -m venv pdf_env
# В Windows
python -m venv pdf_env
```
2. **Активируйте его:**
```plaintext
# В macOS/Linux
source pdf_env/bin/activate
# В Windows
.\pdf_env\Scripts\activate
```
Теперь в приглашении терминала должно отображаться `(pdf_env)`.
3. **Установите библиотеки:** поставим все три библиотеки из сравнения, чтобы вы могли сразу протестировать разные подходы.
```plaintext
pip install pypdf2 pdfplumber pymupdf
```
После этого окружение готово, и можно переходить к примерам кода ниже.
---
## Способ 1: базовое извлечение текста из PDF через PyPDF2
PyPDF2 — один из самых популярных вариантов для базовой работы с PDF. Библиотека простая, давно используется и отлично подходит для «обычных» PDF, где текст можно выделить, а не распознавать с изображения. Если вы работаете с простыми отчётами, статьями или текстовыми экспортами, PyPDF2 позволит быстро извлечь текст из PDF в Python с минимальным количеством кода.
Главное ограничение? Библиотека читает внутренний текстовый поток PDF, а он не всегда совпадает с визуальным порядком чтения — особенно в документах с несколькими колонками. Таблицы она тоже не понимает: текст из ячеек просто сливается в один общий блок.
Вот простой скрипт, который позволяет извлечь весь текст из PDF:
```python
# requirements: pip install pypdf2
import PyPDF2
def extract_text_with_pypdf2(pdf_path):
"""
Извлекает текст из PDF-файла с помощью библиотеки PyPDF2.
Args:
pdf_path (str): Путь к PDF-файлу.
Returns:
str: Извлечённый текст или сообщение об ошибке.
"""
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Всего страниц: {num_pages}")
full_text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
full_text += page.extract_text() + "\n"
return full_text
except FileNotFoundError:
return f"Ошибка: файл по пути {pdf_path} не найден."
except Exception as e:
return f"Произошла непредвиденная ошибка: {e}"
# --- Пример использования ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)
if "Error" not in extracted_text:
print("--- Извлечённый текст ---")
print(extracted_text)
else:
print(extracted_text)
Этот скрипт отлично работает с простым текстом в одну колонку. Но что будет, если подать на вход финансовый отчёт с аккуратными таблицами? На выходе получится смесь текста и чисел без какой-либо структуры. И вот здесь уже лучше показывает себя следующая библиотека.
Метод 2: извлечение таблиц и работа с макетом в pdfplumber
Если задача связана с извлечением структурированных данных, pdfplumber — один из лучших вариантов. Библиотека построена поверх pdfminer.six и дает детальный доступ к геометрии страницы PDF. Она «видит» символы, линии и прямоугольники, а еще умеет очень уверенно находить и извлекать таблицы.
Для задач в data science и бизнес-автоматизации это часто решает все. Представьте, что вам нужно достать квартальную отчетность из PDF-отчета компании. С PyPDF2 это обычно превращается в мучительный разбор строк. С pdfplumber данные можно получить в виде аккуратного списка списков, который сразу готов для Pandas DataFrame.
Главная причина, почему pdfplumber лучше подходит для структурированных данных, чем PyPDF2, — библиотека учитывает визуальную структуру страницы, а не только сырой поток текста. Она понимает, что отдельные текстовые элементы выровнены по строкам и столбцам и разделены линиями.
Вот как извлечь таблицы из страницы PDF:
# requirements: pip install pdfplumber
import pdfplumber
import pandas as pd
def extract_tables_with_pdfplumber(pdf_path, page_number=0):
"""
Извлекает все таблицы с указанной страницы PDF с помощью pdfplumber.
Args:
pdf_path (str): Путь к PDF-файлу.
page_number (int): Номер страницы, с которой нужно извлечь таблицы (индексация с 0).
Returns:
list of pandas.DataFrame: Список, где каждый элемент — DataFrame,
представляющий таблицу, найденную на странице.
"""
tables = []
try:
with pdfplumber.open(pdf_path) as pdf:
if page_number >= len(pdf.pages):
print(f"Ошибка: страница {page_number} вне диапазона. В PDF {len(pdf.pages)} стр.")
return tables
page = pdf.pages[page_number]
# .extract_tables() — ключевой метод
extracted_tables = page.extract_tables()
for table_data in extracted_tables:
# Преобразуем список списков в pandas DataFrame
df = pd.DataFrame(table_data[1:], columns=table_data[0])
tables.append(df)
return tables
except FileNotFoundError:
print(f"Ошибка: файл по пути {pdf_path} не найден.")
return tables
except Exception as e:
print(f"Произошла непредвиденная ошибка: {e}")
return tables
# --- Пример использования ---
# Для этого примера понадобится pandas: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)
if all_tables:
print(f"Найдено таблиц на странице 0: {len(all_tables)}")
for i, table_df in enumerate(all_tables):
print(f"\n--- Таблица {i+1} ---")
print(table_df)
else:
print("На указанной странице таблицы не найдены.")
Плата за такую точность — скорость. pdfplumber делает больше работы по анализу структуры страницы, поэтому по природе медленнее библиотек, которые просто выгружают текст.
Метод 3: быстрое извлечение текста с PyMuPDF (Fitz)
Если вам нужно быстро обработать сотни или тысячи PDF, производительность становится решающим фактором. Здесь особенно силен PyMuPDF, который импортируется как fitz. Это Python-обертка над MuPDF — легковесной библиотекой на C, поэтому работает она действительно быстро.
У меня был проект, где нужно было обработать несколько тысяч многостраничных юридических документов. По первым оценкам, скрипт на pdfplumber должен был выполняться часами. После перехода на PyMuPDF время сократилось до менее чем 30 минут. Разница в скорости действительно настолько заметная.
Но дело не только в скорости. PyMuPDF — это очень мощная библиотека по возможностям. Она умеет рендерить страницы в изображения, что критично для OCR-сценариев, извлекать встроенные картинки и работать с аннотациями. Извлечение таблиц у нее не такое удобное «из коробки», как в pdfplumber, зато по скорости извлечения обычного текста ей почти нет равных.
Вот аналогичный пример на PyMuPDF для быстрого извлечения текста:
# requirements: pip install PyMuPDF
import fitz # Библиотека PyMuPDF
def extract_text_with_pymupdf(pdf_path):
"""
Извлекает текст из PDF-файла с помощью высокопроизводительной библиотеки PyMuPDF (Fitz).
Args:
pdf_path (str): Путь к PDF-файлу.
Returns:
str: Извлеченный текст или сообщение об ошибке.
"""
try:
doc = fitz.open(pdf_path)
full_text = ""
for page in doc:
# .get_text() — основная функция
full_text += page.get_text() + "\n"
doc.close()
return full_text
except FileNotFoundError:
return f"Ошибка: файл по пути {pdf_path} не найден."
except Exception as e:
# PyMuPDF может выбрасывать специфические ошибки, например fitz.fitz.FitzError
return f"Ошибка при работе с PyMuPDF: {e}"
# --- Пример использования ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)
if "Error" not in fast_extracted_text:
print("--- Извлеченный текст (быстрый метод) ---")
print(fast_extracted_text)
else:
print(fast_extracted_text)
Если нужен максимальный throughput на текстовых PDF, PyMuPDF — безусловный лидер.
Особый случай: как работать со сканированными PDF через OCR
Может возникнуть вопрос: что делать, если ни один из этих способов не сработал? Если запустить код выше на сканированном документе — например, на фотографии договора или оцифрованной странице книги, — на выходе вы получите пустую строку.
Так происходит потому, что в таком файле нет текстового слоя. PDF содержит изображение, а не символы. Чтобы решить эту задачу, нужен OCR — технология оптического распознавания символов, которая «прочитает» изображение и преобразует его в текст, пригодный для машинной обработки.
Стандартное решение в Python — pytesseract, обертка для движка Tesseract OCR от Google. Инструмент мощный, но с заметным минусом: Tesseract нужно отдельно устанавливать в систему (например, через brew на Mac или через установщик на Windows) и следить, чтобы Python видел исполняемый файл. Такая настройка бывает хрупкой, особенно если вы разворачиваете код на сервере или передаете его коллегам.
Альтернатива: предварительно обработать сложные PDF в no-code инструменте
Если сроки поджимают или вам просто не хочется возиться с зависимостями для OCR, практичный вариант — сначала вынести извлечение текста в отдельный специализированный инструмент. Так вы отделяете сложную OCR-часть от основной логики на Python.
AI-инструмент вроде извлекателя текста из PDF от Lynote может выступать как удобный этап предобработки. Вы загружаете проблемный сканированный PDF, сервис сам выполняет OCR в фоне и возвращает чистый текст, который потом можно передать в ваш скрипт. Это особенно удобно для разовых задач или небольшой пачки файлов, с которыми возникают проблемы.
Вот как выглядит этот процесс:
- Загрузите PDF-файл. Перейдите в рабочее пространство Lynote. На вкладке 'Upload File' можно перетащить PDF мышкой или выбрать файл с компьютера. Это работает и для обычных текстовых PDF, и для PDF на основе сканов.
- Извлеките текст из PDF. После загрузки файла нажмите кнопку "Create Note". AI-движок Lynote обработает документ, при необходимости автоматически применит OCR к файлу на основе изображения и создаст чистую текстовую версию с возможностью поиска.
- Скопируйте извлеченный текст. Когда текст появится в редакторе, вы сможете быстро его проверить, при необходимости внести мелкие правки и затем скопировать все содержимое одной кнопкой. После этого текст будет в буфере обмена и его можно вставить в Python-скрипт как строковую переменную.


Такой подход позволяет сосредоточиться на анализе данных в вашем коде, а не на инфраструктуре и обработке ошибок в локальной OCR-настройке.
Частые ошибки и продвинутые советы
Извлечение текста из PDF в Python редко проходит идеально. Вот с какими типичными проблемами вы, скорее всего, столкнётесь:
- Кодировка символов: Вы можете столкнуться с ошибкой
UnicodeDecodeError. Чаще всего это бывает со старыми PDF или файлами, созданными редким ПО. Большинство современных библиотек нормально работают сUTF-8, но если библиотека это поддерживает, иногда помогает явное указание кодировки. - PDF, защищённые паролем: Если для открытия PDF нужен пароль, ни одна из этих библиотек не сможет прочитать файл без него. Пароль нужно передать при открытии. Например:
PyPDF2.PdfReader(file, password='your_password'). - Потеря форматирования: Важно помнить, что при извлечении текста почти всегда теряется оформление: жирный шрифт, курсив, размер шрифта, цвет и другие визуальные элементы. Вы получаете сырой текст, а не визуальное представление документа.
- Перемешанный текст в колонках: Как уже упоминалось в случае с PyPDF2, в многостолбцовых макетах (например, в научных статьях) строки из разных колонок могут смешиваться.
pdfplumberсправляется с этим заметно лучше, потому что учитывает геометрию страницы.
Совет эксперта: Всегда проверяйте скрипт на репрезентативной выборке ваших документов. Решение, которое идеально работает с одним PDF, может полностью сломаться на другом файле из иного источника.
Часто задаваемые вопросы
Почему текст из таблицы превратился в одну длинную и беспорядочную строку?
Это классическая проблема библиотек вроде PyPDF2, которые не выполняют анализ структуры страницы. Они читают сырой текстовый поток в том порядке, в котором он записан в файле, а этот порядок часто не совпадает с визуальной структурой строк и столбцов. Чтобы исправить это, нужно использовать библиотеку с учётом макета страницы, например **pdfplumber**, которая специально создана для распознавания табличных данных.
Может ли Python извлекать текст из определённой области страницы PDF?
Да, но для этого нужна библиотека, которая предоставляет координаты элементов. pdfplumber и PyMuPDF отлично подходят для такой задачи. В pdfplumber можно использовать метод .crop((x0, top, x1, bottom)), чтобы задать ограничивающую область, а затем запускать .extract_text() или .extract_tables() только внутри этого фрагмента.
Почему в моём сканированном PDF извлечённый текст пустой?
Ваш PDF содержит изображение текста, а не реальные текстовые данные. Обычные библиотеки не умеют «читать» изображения. Здесь нужен процесс Optical Character Recognition (OCR). Можно либо настроить локальный OCR-движок через pytesseract, либо использовать инструмент предобработки, например Lynote, чтобы сначала преобразовать PDF на основе изображений в чистый текст.
Как работать с PDF, в которых несколько языков?
Современные библиотеки вроде PyMuPDF и pdfplumber обычно хорошо работают с Unicode, который поддерживает большинство языков. Основные сложности возникают на этапе OCR. Например, в Tesseract нужно заранее скачать и указать языковые пакеты, которые вы хотите использовать (например, -l eng+fra для английского и французского).
Итог: как выбрать подходящий инструмент Python для работы с PDF
Универсальной «лучшей» библиотеки для извлечения текста из PDF в Python не существует. Правильный выбор всегда зависит от типа ваших документов и задач проекта.
Если свести всё к простой схеме выбора, получится так:
- Если у вас простые PDF с обычным текстом и нужен только сырой текст, PyPDF2 — самый простой и быстрый вариант для внедрения.
- Если в PDF есть таблицы или структурированные макеты, которые нужно преобразовать в данные (например, для загрузки в базу данных или в DataFrame Pandas), pdfplumber — явный лидер.
- Если вы обрабатываете большой объём документов и на первом месте стоит скорость, PyMuPDF (Fitz) будет самым мощным и производительным вариантом.
- Если вы работаете со сканированными PDF на основе изображений, без OCR не обойтись. Если нужен быстрый и надёжный способ без сложной локальной настройки, часто практичнее сначала прогнать файл через внешний инструмент, получить чистый текст, а уже потом обрабатывать его в Python.
Начните с самого простого инструмента, который закрывает ваши задачи, и будьте готовы перейти на более мощное решение по мере того, как документы становятся сложнее.


