Как вы парсите сложные PDF с таблицами и колонками? Назовите инструменты (pdfplumber, pymupdf, Camelot, Unstructured.io)
Краткий тезис
Парсинг сложных PDF-документов с многоколоночной вёрсткой и таблицами требует комбинации инструментов, каждый из которых решает свою подзадачу: извлечение текста с координатами (pdfplumber, PyMuPDF), детекция и извлечение таблиц (Camelot), универсальная сегментация документа (Unstructured.io) и ML-модели для понимания макета (LayoutLM). В production-пайплайнах эти инструменты часто используются последовательно: сначала определяется структура страницы, затем применяется специализированный парсер для каждого элемента.
2. Camelot: извлечение таблиц
Camelot — специализированная библиотека для извлечения таблиц из PDF. Работает в двух режимах: lattice (по линиям сетки) и stream (по пробелам между данными). Для сложных PDF с таблицами без чётких границ часто требуется комбинация обоих.
Основные возможности:
- Детекция таблиц на странице.
- Извлечение ячеек с координатами.
- Экспорт в pandas DataFrame, CSV, Excel.
- Визуализация найденных таблиц (метод
plot()).
Пример:
import camelot
tables = camelot.read_pdf("doc.pdf", pages="1-3", flavor="lattice")
for table in tables:
print(table.df) # pandas DataFrame
table.to_csv("table.csv")
Ограничения:
- Требует установки Ghostscript (для обработки PostScript).
- Неэффективен на сканированных PDF (нужен предварительный OCR).
- Может пропускать таблицы, встроенные в сложный макет (например, с объединёнными ячейками без линий).
Рекомендация: Используйте flavor="stream" для таблиц без линий, предварительно настроив параметры edge_tol и row_tol.
3. Unstructured.io: универсальный парсер документов
Unstructured.io — фреймворк для обработки неструктурированных документов (PDF, DOCX, HTML, изображения). Он автоматически определяет тип контента: заголовки, абзацы, списки, таблицы, изображения.
Ключевая функция: partition_pdf() — сегментирует PDF на элементы с метаданными (тип, координаты, связи).
Пример:
from unstructured.partition.pdf import partition_pdf
elements = partition_pdf("doc.pdf", strategy="auto")
for element in elements:
print(element.category, element.text[:50])
Стратегии:
"auto"— пытается извлечь текст напрямую; если не удаётся, подключает OCR (Tesseract)."ocr_only"— принудительный OCR."hi_res"— использует детектор таблиц (YOLO) для высокоточного распознавания.
Преимущества:
- Встроенная поддержка OCR (через Tesseract или paddleocr).
- Автоматическое определение колонок и порядка чтения.
- Интеграция с RAG-пайплайнами (например, LlamaIndex и LangChain).
Недостатки:
- Тяжеловесность (зависимости: detectron2, torch).
- Не всегда корректно обрабатывает сложные таблицы (лучше комбинировать с Camelot).
4. LayoutLM: ML-подход для сложных макетов
LayoutLM — семейство моделей (LayoutLMv2, LayoutLMv3) от Microsoft, которые объединяют текстовую, визуальную и позиционную информацию. Они решают задачу понимания макета документа (Document Layout Analysis) как задачу sequence labeling или object detection.
Применение для парсинга:
- Детекция таблиц, колонок, заголовков, списков.
- Извлечение пар "ключ-значение" из форм.
- Восстановление порядка чтения.
Пример использования (через Hugging Face):
from transformers import LayoutLMv3Processor, LayoutLMv3ForTokenClassification
processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
# Далее — предобработка изображения страницы и инференс
Когда использовать:
- PDF с нестандартной вёрсткой (газеты, журналы, рекламные буклеты).
- Сканированные документы (после OCR).
- Высокие требования к точности (например, юридические документы).
Ограничения:
- Требует GPU для инференса.
- Необходимость разметки данных для fine-tuning под конкретный домен.
- Медленнее классических методов.
Сравнение подходов:
| Инструмент | Тип | Скорость | Точность на сложных макетах | Требования |
|---|---|---|---|---|
| pdfplumber | Правила | Высокая | Средняя (зависит от качества PDF) | Нет |
| PyMuPDF | Правила | Очень высокая | Средняя | Нет |
| Camelot | Правила + эвристики | Средняя | Высокая (для таблиц с линиями) | Ghostscript |
| Unstructured.io | Правила + ML | Средняя | Высокая (благодаря OCR и детекции) | Tesseract, torch |
| LayoutLM | ML (Transformer) | Низкая | Очень высокая | GPU, размеченные данные |
5. Пет-проект для закрепления
Задача: Разработать пайплайн парсинга сложного PDF-документа (например, научной статьи в двухколоночном формате IEEE с таблицами и формулами) и преобразовать его в структурированный JSON с полями: title, sections, tables, figures.
Инструменты:
- PyMuPDF для извлечения текста с координатами.
- Camelot для таблиц.
- Unstructured.io (стратегия
hi_res) для сегментации. - pandas для обработки таблиц.
- json для вывода.
Шаги:
- Загрузить PDF и определить количество колонок на каждой странице (анализ гистограммы x-координат слов).
- Разделить страницу на колонки, извлечь текст в правильном порядке (слева направо, сверху вниз).
- Для каждой страницы запустить Camelot (
flavor="lattice"или"stream"), сохранить найденные таблицы как DataFrame. - Использовать Unstructured.io для детекции заголовков разделов и изображений.
- Объединить результаты: текст колонок + таблицы + метаданные.
- Сохранить в JSON.
Ожидаемый результат:
- JSON-файл, где каждый раздел документа представлен как объект с полями
type("text", "table", "figure"),contentиpage_number. - Возможность загрузить этот JSON в RAG-систему для поиска по документу.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 542 | Общие подходы к парсингу PDF, сравнение библиотек |
| 553 | Специфика извлечения таблиц, Camelot vs Tabula |
Навигация
- Предыдущий: 918
- Следующий: 920
- Индекс: 00. Индекс разборов