Извлечение текста из PDF-файлов с использованием PDFMiner в Python
Освойте извлечение текста из PDF с помощью Python
PDFMiner.six — это мощная библиотека на Python для извлечения текста, метаданных и информации о макете из PDF-документов. Это руководство является частью нашего Инструменты документации в 2026 году: Markdown, LaTeX, PDF и рабочие процессы печати хаба.
В отличие от простых читалок PDF, он предоставляет глубокий анализ структуры PDF и эффективно обрабатывает сложные макеты.

Что такое PDFMiner и зачем его использовать?
PDFMiner — это библиотека на чистом Python, предназначенная для извлечения и анализа текста из PDF-документов. Версия .six — это активно поддерживаемая ветвь, поддерживающая Python 3.x, в то время как оригинальный проект PDFMiner больше не обновляется.
Основные функции:
- Реализация на чистом Python (нет внешних зависимостей)
- Подробный анализ макета и позиционирование текста
- Обнаружение шрифтов и кодировки символов
- Поддержка зашифрованных PDF
- Включенные инструменты командной строки
- Расширяемая архитектура для пользовательской обработки
PDFMiner особенно полезен, когда вам нужен точный контроль над извлечением текста, необходимо сохранить информацию о макете или работать с сложными документами с несколькими колонками. Хотя он может быть медленнее, чем некоторые альтернативы, его точность и возможности детального анализа делают его предпочтительным выбором для потоковых процессов обработки документов. Для обратного потока вы также можете быть заинтересованы в генерации PDF программно на Python.
Установка и настройка
Установите PDFMiner.six с помощью pip:
pip install pdfminer.six
Для виртуальных сред (рекомендуется):
python -m venv venv
source venv/bin/activate # На Windows: venv\Scripts\activate
pip install pdfminer.six
Если вы новичок в управлении пакетами Python, ознакомьтесь с нашим Справочником по Python для получения дополнительной информации о pip и виртуальных средах.
Проверьте установку:
pdf2txt.py --version
Библиотека включает несколько инструментов командной строки:
pdf2txt.py— извлечение текста из PDFdumppdf.py— выгрузка внутренней структуры PDFlatin2ascii.py— преобразование латинских символов в ASCII
Эти инструменты дополняют другие инструменты для работы с PDF, такие как Poppler, которые обеспечивают дополнительные функции, такие как извлечение страниц и преобразование форматов.
Базовое извлечение текста
Простое извлечение текста
Самый простой способ извлечь текст из PDF:
from pdfminer.high_level import extract_text
# Извлечь весь текст из PDF
text = extract_text('document.pdf')
print(text)
Этот высокоуровневый API обрабатывает большинство распространенных случаев использования и возвращает весь документ в виде одного строки.
Извлечение текста с определенных страниц
Чтобы извлечь текст с определенных страниц:
from pdfminer.high_level import extract_text
# Извлечь текст со страниц 2-5 (0-индексированный)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Это особенно полезно для больших документов, где вам нужны только определенные разделы, значительно улучшая производительность.
Извлечение текста с итерацией по страницам
Для обработки страниц по отдельности:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
Этот подход дает вам больше контроля над тем, как обрабатывается каждая страница, что полезно при работе с документами, где структура страниц различается.
Расширенный анализ макета
Понимание LAParams
LAParams (параметры анализа макета) контролируют, как PDFMiner интерпретирует макет документа. Понимание различий между PDFMiner и более простыми библиотеками здесь критично — PDFMiner действительно анализирует пространственные отношения между элементами текста.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Создайте пользовательские LAParams
laparams = LAParams(
line_overlap=0.5, # Минимальное перекрытие для строк текста
char_margin=2.0, # Маржа между символами в одном слове
line_margin=0.5, # Маржа между строками в одном абзаце
word_margin=0.1, # Порог разделения слов
boxes_flow=0.5, # Порог направления потока текстовых блоков
detect_vertical=True, # Обнаружение вертикального текста
all_texts=False # Извлечение только текста в блоках
)
text = extract_text('document.pdf', laparams=laparams)
Объяснение параметров:
line_overlap: Какое минимальное перекрытие строк должно быть для их считывания как одной строки (0.0-1.0)char_margin: Максимальное расстояние между символами в одном слове (в долях ширины символа)line_margin: Максимальное расстояние между строками в одном абзацеword_margin: Порог разделения словboxes_flow: Порог направления потока текстовых блоковdetect_vertical: Включить обнаружение вертикального текста (часто используется в азиатских языках)
Извлечение информации о макете
Получите подробную информацию о позиции и шрифте:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBox, LTTextLine, LTChar
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextBox):
# Получить координаты bounding box
x0, y0, x1, y1 = element.bbox
print(f"Текст по координатам ({x0}, {y0}): {element.get_text()}")
# Пройтись по строкам
for text_line in element:
if isinstance(text_line, LTTextLine):
# Получить детали на уровне символов
for char in text_line:
if isinstance(char, LTChar):
print(f"Символ: {char.get_text()}, "
f"Шрифт: {char.fontname}, "
f"Размер: {char.height}")
Этот уровень детализации чрезвычайно полезен для анализа документов, извлечения форм или когда вам нужно понять структуру документа программно.
Обработка различных типов PDF
Зашифрованные PDF
PDFMiner может обрабатывать PDF-файлы с защитой паролем:
from pdfminer.high_level import extract_text
# Извлечь из зашифрованного PDF
text = extract_text('encrypted.pdf', password='your_password')
Обратите внимание, что PDFMiner может извлекать только текст из PDF-файлов — он не может обойти ограничения безопасности, которые предотвращают извлечение текста на уровне PDF.
Документы с несколькими колонками
Для документов с несколькими колонками настройте LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Оптимизация для макетов с несколькими колонками
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Меньшее значение для лучшего определения колонок
)
text = extract_text('multi_column.pdf', laparams=laparams)
Параметр boxes_flow особенно важен для документов с несколькими колонками — меньшие значения помогают PDFMiner различать отдельные колонки.
Неанглийский и Unicode-текст
PDFMiner хорошо обрабатывает Unicode, но убедитесь, что используется правильная кодировка:
from pdfminer.high_level import extract_text
# Извлечь текст с поддержкой Unicode
text = extract_text('multilingual.pdf', codec='utf-8')
# Сохранить в файл с кодировкой UTF-8
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Работа со сканированными PDF
PDFMiner не может напрямую извлекать текст из сканированных PDF (изображений). Для этого требуется OCR (оптическое распознавание символов). Однако вы можете интегрировать PDFMiner с инструментами OCR.
Вот как определить, является ли PDF сканированным и требует ли OCR:
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTFigure, LTImage
def is_scanned_pdf(pdf_path):
"""Проверить, является ли PDF сканированным (в основном изображениями)"""
text_count = 0
image_count = 0
for page_layout in extract_pages(pdf_path):
for element in page_layout:
if isinstance(element, (LTFigure, LTImage)):
image_count += 1
elif hasattr(element, 'get_text'):
if element.get_text().strip():
text_count += 1
# Если в основном изображения и мало текста, вероятно, сканированный
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Этот PDF, похоже, сканированный - используйте OCR")
else:
text = extract_text('document.pdf')
print(text)
Для сканированных PDF рассмотрите интеграцию с Tesseract OCR или сначала используйте инструменты для извлечения изображений из PDF, затем примените OCR к этим изображениям.
Использование в командной строке
PDFMiner включает мощные инструменты командной строки:
Извлечение текста с помощью инструментов командной строки
# Извлечь текст в stdout
pdf2txt.py document.pdf
# Сохранить в файл
pdf2txt.py -o output.txt document.pdf
# Извлечь определенные страницы
pdf2txt.py -p 1,2,3 document.pdf
# Извлечь как HTML
pdf2txt.py -t html -o output.html document.pdf
Расширенные параметры
# Пользовательские параметры макета
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Извлечь с подробным макетом (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Установить пароль для зашифрованного PDF
pdf2txt.py -P mypassword encrypted.pdf
Эти инструменты командной строки отлично подходят для быстрого тестирования, скриптов оболочки и интеграции в автоматизированные рабочие процессы.
Оптимизация производительности
Обработка больших PDF
Для больших документов рассмотрите следующие стратегии оптимизации:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Обрабатывать только нужные страницы
def extract_page_range(pdf_path, start_page, end_page):
text_content = []
for i, page_layout in enumerate(extract_pages(pdf_path)):
if i < start_page:
continue
if i >= end_page:
break
text_content.append(page_layout)
return text_content
# Отключить анализ макета для скорости
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Много быстрее
Пакетная обработка
Для эффективной обработки множества PDF:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Обработать один PDF-файл"""
try:
text = extract_text(pdf_path)
output_path = pdf_path.replace('.pdf', '.txt')
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
return f"Обработано: {pdf_path}"
except Exception as e:
return f"Ошибка при обработке {pdf_path}: {str(e)}"
# Обработать PDF параллельно
def batch_process_pdfs(pdf_directory, num_workers=4):
pdf_files = [os.path.join(pdf_directory, f)
for f in os.listdir(pdf_directory)
if f.endswith('.pdf')]
with Pool(num_workers) as pool:
results = pool.map(process_pdf, pdf_files)
for result in results:
print(result)
# Использование
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Частые проблемы и решения
Проблема: Неправильный порядок текста
Проблема: Извлеченный текст выглядит запутанным или в неправильном порядке.
Решение: Настройте LAParams, особенно boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Попробуйте разные значения
text = extract_text('document.pdf', laparam仁=laparams)
Проблема: Отсутствие пробелов между словами
Проблема: Слова сливаются без пробелов.
Решение: Увеличьте word_margin:
laparams = LAParams(word_margin=0.2) # Увеличьте от значения по умолчанию 0.1
text = extract_text('document.pdf', laparams=laparams)
Проблема: Ошибки кодирования
Проблема: Странные символы или ошибки кодирования.
Решение: Укажите кодировку явно:
text = extract_text('document.pdf', codec='utf-8')
Проблема: Ошибки памяти при обработке больших PDF
Проблема: Ошибки переполнения памяти при работе с большими файлами.
Решение: Обрабатывайте страницы по отдельности:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Извлечь текст по частям для уменьшения использования памяти"""
all_text = []
page_count = 0
for page_layout in extract_pages(pdf_path):
page_text = []
for element in page_layout:
if hasattr(element, 'get_text'):
page_text.append(element.get_text())
all_text.append(''.join(page_text))
page_count += 1
# Обрабатывать по частям
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Обработать оставшийся текст
if all_text:
yield ''.join(all_text)
Сравнение PDFMiner с альтернативами
Понимание того, когда использовать PDFMiner, а когда другие библиотеки, важно:
PDFMiner против PyPDF2
PyPDF2 проще и быстрее, но менее точен:
- Используйте PyPDF2 для: простых PDF, быстрого извлечения, объединения/разделения PDF
- Используйте PDFMiner для: сложных макетов, точного позиционирования текста, детального анализа
PDFMiner против pdfplumber
pdfplumber строится на основе PDFMiner с более высоким уровнем API:
- Используйте pdfplumber для: извлечения таблиц, более простого API, быстрого прототипирования
- Используйте PDFMiner для: максимального контроля, пользовательской обработки, производственных систем
PDFMiner против PyMuPDF (fitz)
PyMuPDF значительно быстрее, но имеет зависимости на языке C:
- Используйте PyMuPDF для: приложений с критическими требованиями к производительности, массовой обработки
- Используйте PDFMiner для: требования к чистому Python, детального анализа макета
Практический пример: извлечение и анализ документа
Вот полный пример, который извлекает текст и предоставляет статистику документа:
from pdfminer.high_level import extract_pages, extract_text
from pdfminer.layout import LTTextBox, LTChar
from collections import Counter
import re
def analyze_pdf(pdf_path):
"""Извлечь текст и предоставить анализ документа"""
# Извлечь полный текст
full_text = extract_text(pdf_path)
# Статистика
stats = {
'total_chars': len(full_text),
'total_words': len(full_text.split()),
'total_lines': full_text.count('\n'),
'fonts': Counter(),
'font_sizes': Counter(),
'pages': 0
}
# Детальный анализ
for page_layout in extract_pages(pdf_path):
stats['pages'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['fonts'][char.fontname] += 1
stats['font_sizes'][round(char.height, 1)] += 1
return {
'text': full_text,
'stats': stats,
'most_common_font': stats['fonts'].most_common(1)[0] if stats['fonts'] else None,
'most_common_size': stats['font_sizes'].most_common(1)[0] if stats['font_sizes'] else None
}
# Использование
result = analyze_pdf('document.pdf')
print(f"Страницы: {result['stats']['pages']}")
print(f"Слова: {result['stats']['total_words']}")
print(f"Основной шрифт: {result['most_common_font']}")
print(f"Основной размер: {result['most_common_size']}")
Интеграция с потоками обработки документов
PDFMiner хорошо работает в более крупных потоках обработки документов. Например, при создании RAG (Retrieval-Augmented Generation) систем или решений для управления документами, вы можете объединить его с другими инструментами Python для создания полного потока.
После того, как вы извлекли текст из PDF, часто нужно преобразовать его в другие форматы. Вы можете преобразовать HTML-контент в Markdown с помощью библиотек Python или даже использовать преобразование с помощью LLM с помощью Ollama для интеллектуального преобразования документов. Эти техники особенно полезны, когда извлечение текста из PDF производит структурированный текст, похожий на HTML, который нужно очистить и переформатировать.
Для комплексных потоков преобразования документов вы также можете обрабатывать преобразование документов Word в Markdown, создавая унифицированный рабочий процесс, который обрабатывает различные форматы документов в общий выходной формат.
Рекомендации
-
Всегда используйте LAParams для сложных документов — Настройки по умолчанию работают для простых документов, но настройка LAParams значительно улучшает результаты для сложных макетов.
-
Тестируйте с образцовыми страницами сначала — Перед обработкой больших партий тестируйте настройки извлечения на представительных образцах.
-
Обрабатывайте исключения грациозно — PDF-файлы могут быть повреждены или неправильно сформированы. Всегда оборачивайте код извлечения в блоки try-except.
-
Кэшируйте извлеченный текст — Для повторной обработки кэшируйте извлеченный текст, чтобы избежать повторной обработки.
-
Проверяйте качество извлеченного текста — Реализуйте проверки для проверки качества извлечения (например, минимальная длина текста, ожидаемые ключевые слова).
-
Рассмотрите альтернативы для определенных случаев использования — Хотя PDFMiner мощный, иногда специализированные инструменты (например, tabula-py для таблиц) более подходящие.
-
Обновляйте PDFMiner — Версия
.sixактивно поддерживается. Обновляйте ее для исправления ошибок и улучшений. -
Правильно документируйте свой код — При совместном использовании скриптов извлечения PDF используйте правильные Markdown-кодовые блоки с подсветкой синтаксиса для лучшей читаемости.
Заключение
PDFMiner.six — это необходимый инструмент для разработчиков Python, работающих с PDF-документами. Его реализация на чистом Python, подробный анализ макета и расширяемая архитектура делают его идеальным для систем обработки документов в производственной среде. Хотя у него может быть более крутая кривая обучения, чем у более простых библиотек, точность и контроль, которые он предоставляет, не имеют себе равных для сложных задач извлечения текста из PDF.
Независимо от того, строите ли вы систему управления документами, анализируете научные статьи или извлекаете данные для потоков машинного обучения, PDFMiner предоставляет основу для надежного извлечения текста из PDF на Python.
Связанные ресурсы
Связанные статьи на этом сайте
- Инструменты документации в 2026 году: Markdown, LaTeX, PDF и рабочие процессы печати
- Инструменты для работы с PDF в Ubuntu - Poppler — подробное руководство по инструментам командной строки для работы с PDF, включая pdftotext, pdfimages и другие утилиты poppler, которые работают вместе с PDFMiner в потоках обработки документов
- Как извлечь изображения из PDF - Чек-лист — узнайте, как извлекать встроенные изображения из PDF с помощью утилит poppler командной строки, дополняя возможности PDFMiner по извлечению текста
- Генерация PDF на Python - Библиотеки и примеры — изучите библиотеки Python для генерации PDF, включая ReportLab, PyPDF2 и FPDF, чтобы создать обратный поток извлечения текста из PDF
- Чек-лист Python — необходимая справка по синтаксису Python, включая обработку файлов, операции со строками и лучшие практики для написания чистых скриптов обработки PDF