Как конвертировать PDF в Markdown на Python
Конвертация PDF в Markdown стала стандартным шагом препроцессинга для RAG-пайплайнов и LLM-задач: Markdown сохраняет заголовки и таблицы, по которым модели понимают структуру, при заметно меньшем числе токенов. В Python есть несколько хороших вариантов, и у каждого — реальные компромиссы. Вот четыре, которые действительно имеют значение, с рабочим кодом для каждого.
Почему Markdown — и почему это сложнее, чем кажется
LLM отлично работают с Markdown: заголовки размечают границы разделов, pipe-таблицы держат табличные данные выровненными, списки остаются списками. Скормить модели сырой текст, вытащенный из PDF, — значит потерять всё это, а передать сам PDF-бинарник в большинстве пайплайнов просто невозможно. Поэтому почти каждый серьёзный RAG-стек конвертирует документы в Markdown перед чанкингом и эмбеддингом.
Сложность в том, что в PDF нет структуры — там есть символы, расставленные по координатам x/y. Конвертеру приходится восстанавливать её обратной разработкой: какие строки — заголовки (по размеру шрифта), какие слова образуют таблицу (по выравниванию), каков порядок чтения (по анализу вёрстки). Библиотеки справляются с этим очень по-разному — именно поэтому выбор так важен.
Второе осложнение: в сканированных PDF текста нет вовсе — только картинки страниц. С ними справляются лишь некоторые из вариантов ниже, через OCR.
Вариант 1: PyMuPDF4LLM — быстро и легковесно
PyMuPDF4LLM — тонкая обёртка над PyMuPDF (fitz), сделанная специально под LLM-пайплайны: pip install pymupdf4llm, затем md = pymupdf4llm.to_markdown("doc.pdf") — одна строка, и очень быстро: большинство документов обрабатывается значительно меньше чем за секунду.
Она определяет заголовки по размерам шрифта, выводит таблицы как pipe-таблицы и умеет отдавать постраничные чанки с метаданными для прямой загрузки в LlamaIndex или LangChain. Для «цифровых» PDF с несложной вёрсткой — отчётов, документации, статей без экзотического форматирования — это отличный вариант по умолчанию.
Ограничения: нет OCR, поэтому сканированные страницы возвращаются пустыми. Сложные многоколоночные макеты и замысловатые таблицы могут выйти перепутанными — эвристики внутри рассчитаны на скорость, а не на глубокий анализ вёрстки. Про лицензию: PyMuPDF распространяется под AGPL — для внутренних инструментов это нормально, но перед включением в коммерческий продукт посоветуйтесь с юристами.
Вариант 2: Marker — максимальное качество, нужен GPU
Marker использует пайплайн из глубоких нейросетей для детекции вёрстки, порядка чтения и структуры таблиц и выдаёт самый точный Markdown среди open-source-вариантов — он справляется с многоколоночными научными статьями, сложными таблицами и даже формулами.
Цена — инфраструктура: веса моделей на несколько гигабайт, GPU для приемлемой скорости (на CPU работает, но медленно — зачастую десятки секунд на документ) и тяжёлое дерево зависимостей, которое требует реальных усилий при деплое в продакшен или serverless-окружения.
Выбирайте Marker, когда качество вывода на сложных документах — главный приоритет и есть железо: массовая конвертация научного корпуса на машине с GPU — его идеальный сценарий. Для лёгкого сервиса или serverless-функции операционный вес обычно ставит на нём крест.
Вариант 3: MarkItDown — всеядный конвертер от Microsoft
MarkItDown — open-source-библиотека Microsoft, конвертирующая «всё в Markdown»: pip install markitdown, затем MarkItDown().convert("doc.pdf").text_content. Её сила — широта: один и тот же API конвертирует PDF, DOCX, PPTX, XLSX, HTML и не только — именно поэтому она стала вирусной для подготовки данных под LLM.
Конкретно для PDF её извлечение проще, чем у специализированных вариантов: она опирается на базовое извлечение текста, поэтому по детекции заголовков и точности таблиц уступает PyMuPDF4LLM и Marker, а для сканированных PDF нужна дополнительная настройка OCR.
Выбирайте MarkItDown, когда нужна одна зависимость, покрывающая много типов файлов при среднем качестве — например, внутренний скрипт-инжестор, который должен принимать «всё, что загрузят», — а не максимально точный вывод для PDF.
Вариант 4: размещённый API — вообще без зависимостей
Четвёртый вариант — не запускать конвертацию локально: отправить PDF в парсинг-API и получить Markdown в ответ. С ParseJet это выглядит так: resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": open("doc.pdf", "rb")}) — поле "text" в JSON-ответе и есть Markdown.
У этого пути встроенный OCR для сканированных страниц, никаких весов моделей и нативных библиотек, и он одинаково работает в serverless-функции, контейнере и ноутбуке. Вопрос AGPL он тоже снимает полностью. Компромисс — сетевой запрос и стоимость за документ после бесплатного лимита (300 кредитов/мес бесплатно; PDF стоит 3 кредита).
Выбирайте API, когда пайплайн нужен уже сегодня, когда среди PDF есть сканы или когда вы деплоитесь туда, где тяжёлые зависимости больно бьют — Lambda, Cloud Run, Vercel.
Что в итоге выбрать?
«Цифровые» PDF, простая или средняя вёрстка, важна скорость: PyMuPDF4LLM. Лучшее соотношение усилий и качества в чистом Python.
Сложные документы (многоколоночные статьи, замысловатые таблицы) и есть GPU: Marker. По качеству вывода его не обходит ничто из open source.
Много разных типов файлов через одну библиотеку, среднее качество устраивает: MarkItDown.
В потоке есть сканированные PDF, деплой в serverless или ноль желания возиться с зависимостями: размещённый API. Один HTTP-вызов, OCR включён, одна и та же схема вывода для любого документа.
Полный пример: папка PDF в Markdown-файлы
Какой бы путь вы ни выбрали, форма пайплайна одна и та же: итерируем, конвертируем, записываем. Вот версия с API (замените внутренний вызов на pymupdf4llm.to_markdown(), чтобы выполнять локально):
import httpx; from pathlib import Path — затем для каждого pdf в Path("pdfs/").glob("*.pdf"): resp = httpx.post("https://api.parsejet.com/v1/parse/auto/file", headers={"Authorization": "Bearer KEY"}, files={"file": pdf.read_bytes()}); Path("md/", pdf.stem + ".md").write_text(resp.json()["text"], encoding="utf-8").
Для загрузки в RAG чанкуйте Markdown по заголовкам, а не по фиксированному числу символов — чанки, учитывающие заголовки, сохраняют разделы целиком и извлекаются заметно лучше. Ради этой структурной точности и стоило делать конвертацию аккуратно.
Попробуйте конвертацию без единой строки кода
Загрузите PDF и посмотрите, какой Markdown выдаёт этот API — с заголовками, таблицами и OCR для сканированных страниц.
Конвертировать PDF в Markdown бесплатноЧасто задаваемые вопросы
Какая Python-библиотека лучше всего конвертирует PDF в Markdown?
Для «цифровых» PDF лучшее соотношение скорости и качества у PyMuPDF4LLM. Для сложной вёрстки при наличии GPU максимальное качество даёт Marker. Для сканированных PDF или деплоя без зависимостей размещённый API вроде ParseJet делает OCR и структуру одним HTTP-вызовом.
Как конвертировать сканированный PDF в Markdown на Python?
На сканированных страницах нет текста, поэтому нужен OCR. Локально это значит самостоятельно подключать OCR-движок; проще взять API со встроенным OCR — ParseJet сам находит страницы-изображения и распознаёт их в том же запросе.
Хорош ли MarkItDown для конвертации PDF в Markdown?
Сила MarkItDown — конвертация множества форматов (PDF, DOCX, PPTX, XLSX) через одну библиотеку. Конкретно для PDF его детекция структуры проще, чем у PyMuPDF4LLM или Marker: для средних требований к качеству подойдёт, но для точного извлечения заголовков и таблиц — не лучший выбор.
Почему для RAG конвертируют PDF в Markdown, а не в обычный текст?
Markdown сохраняет заголовки, списки и таблицы, которые обычный текст сплющивает. Чанкинг с учётом заголовков извлекается лучше, а LLM используют структуру для понимания контекста — при примерно той же стоимости в токенах.
Можно ли конвертировать PDF в Markdown на Python, ничего не устанавливая?
Да — вызовите парсинг-API по HTTP через httpx или requests. Отправьте файл методом POST на /v1/parse/auto/file ParseJet — поле "text" в ответе и есть Markdown. Бесплатные API-ключи включают 300 кредитов в месяц.
Связанные инструменты
PDF to Markdown Converter
Convert PDF to Markdown online for free. Preserves headings, lists, tables, and code blocks. No signup required — try it instantly or automate via API.
PDF to JSON Converter
Convert PDF to JSON online for free. Get text, title, and metadata as structured JSON — ready for your app, database, or AI pipeline. API included.
Word to Markdown Converter
Convert Word documents (DOCX) to Markdown online for free. Headings, lists, and tables preserved. No signup — or automate DOCX to MD conversion via API.
Начните извлекать текст бесплатно
Регистрация не требуется. Обработайте первый файл за секунды.