Перевод PDF с английского на русский нейросетью: текст, таблицы, формулы

Рабочий пайплайн перевода PDF: достаём текст, режем на части, переводим с глоссарием и собираем результат. Считаем, сколько стоит перевод 100 страниц.

5 мин · · автоматизация · разработка

Загрузить PDF в чат и попросить «переведи» работает, пока документ короткий. Статья на 40 страниц или руководство на 300 упирается в длину ответа, теряет таблицы и по-разному переводит один и тот же термин. Нейросеть для перевода PDF с английского на русский даёт предсказуемый результат, если разбить работу на этапы: достать текст, переводить частями с общим глоссарием и собрать результат. Ниже — такой пайплайн на Python и расчёт цены для 100 страниц.

Шаг 0. Определите тип PDF

От этого зависит способ извлечения:

  • PDF с текстовым слоем (скачан из журнала, собран из Word): текст можно вытащить программно. Проверка — выделить мышью фразу в просмотрщике.
  • Скан или фотографии страниц: текстового слоя нет, нужно либо распознавание, либо отправка страниц в модель как картинок.
  • Смешанный: часть страниц текстовая, часть — сканы. Разделяйте по страницам.

Переводите только те документы, на которые у вас есть право: чужие книги и закрытые материалы переводить для распространения нельзя.

Шаг 1. Извлечение текста

Для текстовых PDF подойдёт библиотека pypdf:

bash
pip install pypdf openai
bash
from pypdf import PdfReader

reader = PdfReader("paper.pdf")
pages = [(page.extract_text() or "").strip() for page in reader.pages]
empty = [i + 1 for i, text in enumerate(pages) if len(text) < 50]
print(f"Страниц: {len(pages)}, почти пустых: {empty}")

Страницы почти без текста — кандидаты на режим «картинка» (шаг 4). Колонки, сноски и таблицы после извлечения могут перемешаться: посмотрите две-три страницы глазами, прежде чем запускать всё.

Шаг 2. Деление на части

Модель надёжнее переводит куски среднего размера, чем весь документ за раз. Простое правило: набирайте страницы, пока не достигнете примерно 6 000 символов, и не режьте посреди страницы.

bash
def make_chunks(pages, limit=6000):
    chunks, current = [], ""
    for text in pages:
        if current and len(current) + len(text) > limit:
            chunks.append(current)
            current = ""
        current += text + "\n\n"
    if current.strip():
        chunks.append(current)
    return chunks

chunks = make_chunks(pages)

Если у документа есть главы, лучше резать по ним: смысловой контекст сохраняется.

Шаг 3. Перевод с глоссарием

Главная причина разнобоя в терминах — модель не знает, как вы переводили их в предыдущих частях. Решение — глоссарий в начале каждого запроса. Составьте его сами для 20–50 ключевых терминов или попросите модель выписать термины из первой главы и поправьте вручную.

bash
from openai import OpenAI

client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")

GLOSSARY = """attention head — голова внимания
fine-tuning — дообучение
loss function — функция потерь"""

SYSTEM = f"""Ты технический переводчик с английского на русский.
Правила:
1. Переводи точно, без пересказа и сокращений. Ничего не добавляй от себя.
2. Формулы, LaTeX, код, имена переменных, ссылки и числа оставляй без изменений.
3. Таблицы возвращай в формате Markdown, сохраняя порядок строк и столбцов.
4. Сохраняй заголовки и списки как Markdown.

Замечания по коду:

  • Параметр temperature поддерживают не все модели. Если запрос вернул ошибку на этом параметре, уберите его.
  • Для сотен кусков запускайте перевод параллельно с повторами: пример в статье асинхронные запросы в Python.
  • Сохраняйте промежуточные результаты на диск, чтобы после сбоя не переводить всё заново.
  • Параметры запроса и работа с Python описаны в руководстве по SDK.

Шаг 4. Сканы и сложная вёрстка: страницы как картинки

Если текстового слоя нет или вёрстка сломала порядок строк, отправляйте страницы в модель картинками. Страницу можно отрисовать библиотекой PyMuPDF (pip install pymupdf, в старых версиях импорт называется fitz):

bash
import base64
import pymupdf

doc = pymupdf.open("scan.pdf")

def translate_page_image(page_index: int, model: str = "claude-sonnet-5-5") -> str:
    png = doc[page_index].get_pixmap(dpi=150).tobytes("png")
    b64 = base64.b64encode(png).decode()
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": [
                {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
                {"type": "text", "text": "Переведи текст на странице на русский по правилам выше."},
            ]},
        ],
    )
    return response.choices[0].message.content

Картинки на вход принимают не все модели. По таблице на 18 октября 2026 это, например, claude-sonnet-5-5 и gpt-6.1-sol, а deepseek-v4.1-flash и glm-5.3-flash изображения не принимают. Подробный разбор распознавания — в статье как распознать PDF нейросетью. Страница-картинка стоит дороже страницы-текста: сколько именно токенов уходит на одну страницу, проверьте по полю usage на одном запросе.

Таблицы и формулы

  • Таблицы. Просите Markdown-таблицу и сверяйте число строк и столбцов с оригиналом. Для больших таблиц надёжнее переводить только ячейки с текстом, а числа не трогать.
  • Формулы. Если формулы извлеклись как мусор, это проблема извлечения, а не перевода. В режиме картинок модель обычно сохраняет вид формулы, но проверьте выборочно.
  • Подписи к рисункам и ссылки на литературу. Номера и ссылки не переводите: это прописано в правилах.

Проверка качества

Нейросетевой перевод ошибается в терминологии и числах, поэтому:

  1. Сравните количество чисел в оригинале и переводе кусок за куском: расхождение — повод открыть место.
  2. Выборочно прочитайте 5–10% страниц, особенно таблицы и определения.
  3. Просканируйте итог на английские слова, которые должны были быть переведены.
  4. Для важных документов отдайте перевод специалисту: нейросеть не заменяет заверенный перевод.

Сколько стоит перевод 100 страниц

Допущения для примера: 100 страниц по 500 слов, около 650 токенов на страницу в оригинале, то есть 65 000 токенов текста. К нему добавляются инструкция и глоссарий в каждом из примерно 50 запросов (по 500 токенов): 25 000 токенов. Итого вход 90 000 токенов. Русский перевод занимает больше токенов, чем английский оригинал (см. почему русский текст считается иначе); примем выход 130 000 токенов. Точные числа зависят от документа, это оценка.

Цены Zukko на 18 октября 2026, $ за 1M токенов:

МодельВходВыходРасчётИтого
claude-sonnet-5-50.4290 000 × 0.4 / 1M + 130 000 × 2 / 1M = $0.036 + $0.26около $0.30
gpt-6.1-sol0.271.3290 000 × 0.27 / 1M + 130 000 × 1.32 / 1M = $0.0243 + $0.1716около $0.20
deepseek-v4.1-flash0.0130.03890 000 × 0.013 / 1M + 130 000 × 0.038 / 1M = $0.00117 + $0.00494около $0.006

Из таблицы видно, что цена перевода определяется в основном выходом. Выбирая модель, ориентируйтесь на цену, индекс силы и свой тест: переведите одну главу на двух моделях и сравните. Актуальные цены — GET https://api.zukko.pro/v1/models.

Частые вопросы

Можно ли переводить PDF без программирования?

Для небольших файлов можно использовать чат в браузере: вставляйте текст по частям вместе с глоссарием. Для больших документов скрипт удобнее.

Сохранится ли оформление PDF?

Нет. Вы получите Markdown с заголовками, списками и таблицами. Вёрстку исходного PDF придётся воссоздавать отдельно, например конвертацией Markdown в нужный формат.

Какую модель выбрать?

Начните с недорогой и сравните результат с более сильной на одной главе. Для скан-страниц нужна модель с поддержкой изображений.

Как начать?

Создайте ключ в кабинете Zukko, запустите скрипт на 3–5 страницах и посмотрите расход на странице «Использование».

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.