Перевод PDF-документов на Laravel: почему мы отказались от OCR и перешли на DeepL API

Технический кейс · Laravel · PDF · DeepL API · очереди

Backend должен был принимать документы, переводить их в фоне и хранить исходные и готовые файлы. Первую версию мы спроектировали как цепочку OCR и перевода текста, но затем заменили её интеграцией с DeepL Document API.

Главная мысль: смена архитектуры не всегда означает добавление ещё одного слоя. Иногда полезнее передать целостную задачу специализированному API и оставить приложению то, что оно делает лучше: доступ, статусы, очереди и хранение.

Схема Было и Стало: отдельные OCR и перевод заменены DeepL Document API
«Было → Стало»: вместо собственного конвейера извлечения и повторной сборки документа приложение управляет одной операцией перевода файла.

Задача заказчика

Пользователь загружает документ, выбирает язык и позже получает готовый файл. Оригинал и результат сохраняются, длительная обработка не блокирует HTTP-запрос, а сбой внешнего сервиса не теряет задачу.

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

Первоначальная архитектура: OCR и перевод как отдельные этапы

Laravel управлял процессом, PostgreSQL хранил пользователей и статусы, MinIO — файлы. Google Cloud Vision извлекал текст из PDF, Google Translate переводил его, Laravel Queue выполнял длительные операции.

  1. Принять файл

    Проверить загрузку, создать запись и сохранить оригинал.

  2. Запустить OCR

    Передать PDF в распознавание и дождаться текста со структурой страниц.

  3. Перевести текст

    Разбить материал на части, вызвать API и сохранить ответы.

  4. Собрать результат

    Сопоставить перевод со страницами и сохранить выходной файл.

Схема оправдана, если распознанный текст нужен и для других задач. Но файл, OCR-операция, JSON, фрагменты перевода и результат живут в разных состояниях.

Где появляется основная сложность

Документ — не строка

После OCR нужно связать перевод со страницами, таблицами, колонками и подписями.

Асинхронность

Для каждого внешнего этапа нужны статусы, таймауты и безопасные повторы.

Промежуточные данные

OCR-ответам и фрагментам перевода нужны хранение, права доступа и очистка.

Согласованность

База, MinIO и облачный API завершают операции в разное время, но дублей быть не должно.

Для PDF и TIFF Google описывает OCR как асинхронную операцию: исходный файл и JSON-результат размещаются в Cloud Storage, а состояние проверяется отдельно. Это ещё один полноценный workflow внутри общего workflow приложения.

Почему архитектуру изменили

Заказчик предложил перейти на DeepL Document API. Смысл был не в том, что «один сервис всегда лучше двух»: приложению не требовался распознанный текст для поиска или аналитики. Ценностью оставался готовый файл.

Document API принимает и возвращает документ. Из нашего кода исчезают модель OCR-результата, нарезка текста и собственная сборка PDF — меньше переходов и промежуточных форматов.

Что здесь нельзя утверждать без отдельного теста: что новая схема всегда дешевле, быстрее или точнее. Эти показатели зависят от типов файлов, языков, объёма и критериев качества. В проекте подтверждена передача изменений заказчику, но окончательная приёмка и измеренные production-результаты не подтверждены.

Новая реализация на DeepL Document API

  1. Загрузка

    Laravel валидирует файл, создаёт запись и сохраняет оригинал в S3.

    uploaded
  2. Отправка

    Job передаёт файл и язык в DeepL, затем сохраняет document ID и ключ.

    submitted
  3. Проверка состояния

    Очередь опрашивает API с задержкой, не создавая повторный перевод.

    translating
  4. Получение

    Worker скачивает готовый файл и сохраняет его в S3.

    completed
  5. Ошибка

    Документ получает явный статус, а журнал — причину без ключей и содержимого.

    failed

У DeepL это штатный трёхшаговый протокол: загрузить документ, проверить состояние, скачать результат. Но очередь всё равно нужна. Она отделяет пользовательский запрос от внешнего API, управляет задержками и позволяет восстанавливать обработку после сбоя worker.

Управление доступом

Регистрация не открывает перевод: учётную запись активирует администратор. Сервер проверяет право при создании задания, просмотре статуса и скачивании результата.

  • АктивацияДоступ включается администратором для конкретного пользователя.
  • ПринадлежностьПользователь видит и скачивает только собственные документы.
  • Ключ APIСекрет хранится на backend и никогда не передаётся в браузер.
  • ЖурналированиеФиксируются переходы статусов и ошибки, но не содержимое конфиденциальных документов.

Сколько стоит перевод документов через API

Считать нужно полную стоимость. У цепочки OCR + перевод складываются OCR, перевод символов, хранилище, workers, трафик и сопровождение сборки результата. Если текст нужен другим функциям, расходы могут быть оправданы.

У Document API расчёт проще, но есть особенности тарифа. В правилах учёта DeepL API указано, что для PDF, DOC/DOCX, PPTX и XLSX при файловом переводе учитывается минимум 50 000 символов на документ, даже если фактического текста меньше. Поэтому множество коротких PDF может оказаться менее выгодным сценарием, чем несколько крупных документов.

Что считатьOCR + переводDocument API
Облачная обработкаСтраницы OCR + символы переводаТарифицируемые символы с правилами для файлов
ХранениеОригинал, OCR-данные, фрагменты, результатОригинал и результат
РазработкаСвязать несколько API и собрать документРеализовать жизненный цикл одной операции
ЭксплуатацияБольше состояний, повторов и точек диагностикиМеньше состояний, но зависимость от возможностей провайдера

Оценка строится на тестовой выборке: документы в месяц × форматы и объём × целевые языки, плюс хранение, трафик и сопровождение. Тарифы и лимиты нужно проверять перед расчётом.

Когда OCR + перевод всё ещё оправданы

Собственная цепочка нужна, если текст используется для поиска, извлечения полей, RAG, ручной корректуры или особой сборки результата. Она позволяет независимо выбирать OCR и переводчик.

Document API подходит, когда вход и выход — целые поддерживаемые файлы, а промежуточный текст не нужен. Это не универсальная победа сервиса, а точное совпадение API с задачей.

Частые вопросы о переводе документов

Почему нельзя просто извлечь текст из PDF?

Потому что PDF хранит представление страницы, а не обязательно логическую структуру документа. Колонки, таблицы и подписи требуют дополнительных правил.

Нужна ли Laravel Queue при использовании DeepL?

Да. Перевод документа — длительная внешняя операция. Очередь управляет проверкой статуса, повторами и восстановлением после временных ошибок.

Где хранятся готовые переводы?

После скачивания из API результат сохраняется в S3-совместимом хранилище рядом с исходным документом, но с отдельным ключом и статусом.

Всегда ли Document API дешевле?

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

Когда следует оставить отдельный OCR?

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

Можно ли вызывать DeepL прямо из браузера?

Нет, API-ключ должен оставаться на сервере. Backend также проверяет права пользователя, формат файла и принадлежность документа.

Как избежать повторного перевода одного файла?

Задание связывается с локальной записью и внешним document ID. Worker проверяет текущее состояние перед отправкой и не создаёт новую операцию при обычном retry.

Где заказать похожий backend?

Я разрабатываю Laravel backend и API: загрузку файлов, очереди, интеграции внешних сервисов, управление доступом и хранение результатов.

Нужно автоматизировать обработку документов?

Спроектирую backend для загрузки, распознавания, перевода и хранения файлов — с очередями, статусами, доступом и интеграцией подходящего API без лишних технологических слоёв.

Обсудить обработку документов

Laravel · PostgreSQL · S3 / MinIO · DeepL Document API · OCR · Google Cloud Vision · Google Translate · Queue


Давайте обсудим проект

Расскажите, что хотите сделать. Я отвечу на вашу почту.

Или напишите в Telegram @ifwcom