← Все инструменты
🔤

Распознавание текста в PDF (OCR) — Бесплатно онлайн

Превратите отсканированные PDF-документы в текстовый формат. Умный локальный OCR распознает текст прямо в вашем браузере бесплатно.

+Загрузить PDF или фотоили перетащите файлы сюда🚀 Запустить OCR бесплатно

Как это работает

01

Загрузите отсканированный PDF

Откройте отсканированный PDF или фото документа прямо в браузере.

02

Выберите инструмент OCR

Нажмите 🖌 на странице, в редакторе выберите инструмент ✏️ OCR.

03

Обведите область с текстом

Нарисуйте прямоугольник вокруг нужного текста или таблицы и нажмите «Распознать».

04

Редактируйте и сохраните

Распознанный текст появляется как редактируемый слой прямо на странице.

Почему pdfredX

🔒

Полная конфиденциальность

Файлы не покидают ваш браузер. Никакой загрузки на сторонние серверы.

Обработка на стороне клиента

Все вычисления выполняются локально — быстро, безопасно и бесплатно.

🆓

Без регистрации

Просто откройте браузер и приступайте. Никаких аккаунтов не нужно.

📱

На любом устройстве

Работает на ПК, планшете и смартфоне без установки.

Полезные материалы по теме

OCR по области: распознать и заменить текст в отсканированном PDF прямо в браузере
Если у вас скан договора, акта или справки — и нужно поменять в нём одну строку, — не нужно перепечатывать документ заново. Достаточно выделить область с нужным текстом, дождаться распознавания и отредактировать результат прямо поверх страницы. Файл при этом не покидает браузер.

Если у вас скан договора, акта или справки — и нужно поменять в нём одну строку, — не нужно перепечатывать документ заново. Достаточно выделить область с нужным текстом, дождаться распознавания и отредактировать результат прямо поверх страницы. Файл при этом не покидает браузер.


Шаг 01. Открыть файл

Откройте pdfredx.com и перетащите PDF или фотографию со сканом в зону загрузки. Принимаются JPEG, PNG, HEIC, WebP и многостраничные PDF. Если документ уже открыт — нажмите карточку нужной страницы.

Браузер конвертирует страницу в Canvas-изображение через PDF.js. Это происходит локально — никакой отправки на сервер.


Шаг 02. Выбрать инструмент OCR и выделить область

В редакторе страницы выберите инструмент OCR — курсор сменится на прицел. Нажмите и потяните прямоугольник вокруг нужного текста: одной строки, абзаца или целого блока. Чем точнее рамка, тем меньше посторонних символов попадёт в результат.

После отпускания кнопки мыши появится кнопка Распознать. Нажмите её.


Шаг 03. Проверить и отредактировать текст

Tesseract.js обрабатывает выделенную область прямо в браузере. Прогресс виден в строке состояния. Через несколько секунд на странице появится:

  • Чёрный прямоугольник — перекрывает исходный текст (замазка)
  • Редактируемый текстовый слой — распознанные строки поверх замазки

Кликните по тексту и правьте прямо на странице. Размер, положение и стиль корректируются стандартными инструментами редактора.


Шаг 04. Сохранить страницу в PDF

Нажмите Сохранить — страница экспортируется через Canvas API с полным разрешением оригинала (множитель масштаба рассчитывается как fabNativeW / fabCanvas.getWidth()). Уменьшение до 1500px затрагивает только копию, которая уходила в OCR, — на итоговый файл оно не влияет. Затем нажмите Создать PDF — все страницы документа упакуются в один файл.


Как это реализовано технически

Tesseract.js 5.x загружается лениво — только при первом использовании инструмента. Это около 2,5 МБ. Перед распознаванием до 1500px по длинной стороне уменьшается только вырезанный фрагмент — копия выделенной вами области, которая отправляется в Tesseract.js. Иначе на мобильных устройствах обработчик упирается в лимит оперативной памяти. Важно: это сжатие касается исключительно той копии, что уходит в распознавание. Сам холст Fabric.js, фоновое изображение страницы и итоговый экспорт PDF остаются в оригинальном высоком разрешении — финальный файл в качестве не теряет. По умолчанию используется комбинированная языковая модель rus+eng — она лучше справляется со смешанными документами, чем монолингвальный режим. Язык переключается автоматически по языку интерфейса сайта.

На каждую распознанную строку создаются два объекта Fabric.js: fabric.Rect с непрозрачной заливкой цветом фона (замазка) и fabric.IText с распознанным текстом поверх. Оба объекта попадают в стек Undo — их можно отменить нажатием Ctrl+Z.


Известные ограничения

Качество распознавания зависит от качества скана. Если страница снята под углом, с бликами или в слишком низком разрешении — результат будет хуже, чем с хорошо откалиброванного планшетного сканера. Tesseract.js — не нейросеть последнего поколения, а классический OCR-движок. Для критически важных документов сверяйте результат вручную.

Рукописный текст не распознаётся. Инструмент работает только с печатными шрифтами. Рукопись, прочерки и таблицы с тонкими линейками часто дают ошибки.

Страницы с тёмным фоном. Если фон документа не белый, автоматически подобранный цвет замазки может не совпасть. В этом случае настройте цвет вручную через цветовую панель редактора.


Попробуйте OCR по области — pdfredx.com, без регистрации, файл остаётся у вас.

Медкарта, договор, паспорт в PDF — что происходит с вашим текстом, когда вы нажимаете «Загрузить»
Сканы с личными данными загружают на онлайн-сервисы каждый день. Большинство делает это не задумываясь. Если вам нужно поменять одну строку в отсканированном документе — давайте честно разберём, что происходит с файлом на обоих путях.

Сканы с личными данными загружают на онлайн-сервисы каждый день. Большинство делает это не задумываясь. Если вам нужно поменять одну строку в отсканированном документе — давайте честно разберём, что происходит с файлом на обоих путях.


Что происходит с файлом на стандартных серверных сервисах

Когда вы нажимаете кнопку загрузки на обычном PDF-редакторе — файл уходит на сервер. Дальше всё зависит от политики конкретной компании, которую большинство людей не читает.

Типичная цепочка:

  • Файл сохраняется во временном хранилище на серверах подрядчика (AWS, GCP, Azure).
  • Обрабатывается на удалённой машине — OCR, конвертация, аннотирование.
  • Хранится от нескольких часов до нескольких суток «для надёжности» или «улучшения сервиса».
  • В лучшем случае удаляется по расписанию. В худшем — логируется вместе с метаданными.

Конкретные сроки хранения обычно написаны мелким шрифтом в политике конфиденциальности. Если вы обрабатываете медицинскую карту, договор с суммой сделки, паспортные данные или судебный документ — этот текст физически оказывается на машине, которую вы не контролируете.


Как устроена обработка в pdfredX: файл не покидает браузер

В pdfredX весь процесс — от открытия до сохранения — происходит внутри одной браузерной вкладки.

Загрузка: файл читается через стандартный FileReader API. Браузер создаёт объект ArrayBuffer в оперативной памяти. Никакого сетевого запроса нет — нет ни одного байта, который ушёл бы за пределы устройства.

Рендер: PDF.js 3.11.174 парсит документ и рисует страницы на <canvas> элементах прямо в браузере. Это тот же движок, что использует Firefox для встроенного просмотра PDF.

OCR: Tesseract.js 5.x — полноценный движок распознавания текста, скомпилированный в WebAssembly. Он работает в браузере так же, как работает в терминале. Языковая модель (~2,5 МБ) загружается один раз и кэшируется браузером.

Результат: редактируемые текстовые блоки существуют только внутри Canvas-холста текущей вкладки. При закрытии вкладки они исчезают вместе с документом.


Пошаговый процесс безопасной работы с чувствительными документами

Шаг 01. Открыть файл локально

Перетащить скан в зону загрузки на pdfredx.com. Никакого прогресс-бара загрузки на сервер: файл не уходит на чужую машину, а открывается локально. Скорость инициализации зависит от размера файла и мощности устройства — лёгкий скан открывается мгновенно, а тяжёлый PDF на 100+ МБ на старом смартфоне может занять пару секунд: FileReader сначала читает файл в память, а PDF.js парсит и рендерит страницы прямо в браузере.

Шаг 02. Выделить область с текстом

Выбрать инструмент OCR и обвести прямоугольником нужный фрагмент: строку, абзац, поле формы. Нажать Распознать.

Шаг 03. Отредактировать и сохранить

Исправить распознанный текст прямо на странице, нажать СохранитьСоздать PDF. Файл скачивается напрямую из браузера через стандартный <a download>.


Что мы гарантировать не можем — честный дисклеймер

Мы не пишем на главной странице «100% приватность» — потому что это невозможно гарантировать в отрыве от пользовательского окружения.

Браузерные расширения с широкими правами (особенно с разрешением «читать данные на всех сайтах») теоретически могут перехватывать содержимое вкладок. Перед работой с конфиденциальными документами разумно проверить установленные расширения.

Кейлоггеры и вредоносное ПО на машине пользователя — вне нашего контроля. Если устройство скомпрометировано, это касается любого локального инструмента, не только браузерного.

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

Мы обеспечиваем изоляцию на уровне браузерной вкладки. Остальное — на стороне пользователя.


Обрабатывайте чувствительные PDF без отправки на сервер — pdfredx.com, без регистрации.

Tesseract.js 5.x в браузере: как устроен Area OCR с заменой текста поверх Fabric.js
Задача звучала прямолинейно: пользователь выделяет прямоугольник на отсканированном PDF, нажимает кнопку, и поверх оригинала появляется редактируемый текстовый слой — точно там, где был нечитаемый или ошибочный текст. Никакого сервера, никакой загрузки файлов. Вот как это собрано.

Задача звучала прямолинейно: пользователь выделяет прямоугольник на отсканированном PDF, нажимает кнопку, и поверх оригинала появляется редактируемый текстовый слой — точно там, где был нечитаемый или ошибочный текст. Никакого сервера, никакой загрузки файлов. Вот как это собрано.


Архитектурный вызов: OCR в браузере без бэкенда

Первый вопрос при проектировании: что тяжелее — гонять изображения на сервер для OCR или тащить движок в браузер?

Серверный OCR решает проблему вычислений, но создаёт другую: файл с чувствительными данными улетает на чужую машину, появляются задержки на round-trip, нужна инфраструктура. Для инструмента, где конфиденциальность — главный посыл, это не подходит.

Tesseract.js 5.x — WebAssembly-компиляция классического OCR-движка Tesseract. Он запускается прямо в браузере через Web Workers, не блокирует UI-поток и не требует никакого сервера. Языковые пакеты (~2,5 МБ каждый) скачиваются один раз и кэшируются. Это не нейросеть последнего поколения — Tesseract работает на основе классических алгоритмов сегментации, LSTM и обученных языковых моделей. Он хорошо справляется с качественными сканами и плохо — с рукописным текстом или сильно сжатыми JPEG.


Ленивая загрузка: не грузить то, что не нужно

Tesseract.js весит несколько мегабайт. Грузить его при открытии сайта — неоправданно, большинство пользователей никогда не откроет OCR. Поэтому загрузка отложена:

async function fabStartOCR(areaRect = null) {
  if (!window.Tesseract) {
    await new Promise((res, rej) => {
      const s  = document.createElement('script');
      s.src    = 'https://unpkg.com/tesseract.js@5/dist/tesseract.min.js';
      s.onload = res;
      // При сбое сети — удаляем битый тег из DOM, иначе window.Tesseract
      // останется undefined, а при повторном вызове скрипт продублируется.
      s.onerror = (e) => { s.remove(); rej(e); };
      document.head.appendChild(s);
    });
  }
  // ...
}

Первый вызов fabStartOCR() — скрипт подгружается, браузер кэширует. Второй вызов — работает мгновенно.

Тонкий момент — обработка ошибки. Если s.onerror сработал (у пользователя проблемы с сетью), промис отклоняется, но сам тег <script> остаётся в <head>. При следующем вызове функции window.Tesseract всё ещё undefined — условие if (!window.Tesseract) снова истинно, и в DOM добавляется второй битый тег, потом третий. Поэтому в onerror мы сначала удаляем элемент (s.remove()), и только затем отклоняем промис: каждая новая попытка стартует с чистого <head>.


Downscale до 1500px: почему это не маркетинг, а необходимость

Отсканированные документы часто имеют разрешение 300 DPI и выше. Лист A4 при 300 DPI — это 2480×3508 пикселей. Обработка такого изображения Tesseract.js в браузере требует от 300 до 600 МБ RAM только на декодирование и создание внутренних буферов движка.

На десктопах это ещё терпимо. На мобильных устройствах с 2–4 ГБ общей памяти — гарантированный краш или зависание вкладки.

Поэтому перед передачей в Tesseract изображение уменьшается:

const MAX_SIDE = 1500;
const scale    = Math.min(1, MAX_SIDE / Math.max(imgW, imgH));
const scaledW  = Math.floor(imgW * scale);
const scaledH  = Math.floor(imgH * scale);

1500px — эмпирически подобранный порог, при котором Tesseract стабильно работает на iPhone 12 и Android-устройствах с 3 ГБ RAM. При уменьшении качество распознавания деградирует незначительно для большинства сканов: Tesseract сам нормализует изображение перед обработкой.


Языковые модели и совмещённый режим

Пользователи pdfredX часто работают с документами, где смешаны русский и английский текст: договоры с латинскими аббревиатурами, медицинские заключения с латинскими терминами, финансовые отчёты.

Монолингвальный режим в таких случаях ломается на переходах между языками. Поэтому по умолчанию используется комбинированная модель:

const lang = currentLang === 'de' ? 'deu+eng' : 'rus+eng';
const { data } = await Tesseract.recognize(croppedCanvas, lang, { ... });

currentLang — это язык интерфейса сайта, который пользователь выбрал кнопками RU/EN/DE. Немецкие пользователи получают deu+eng, остальные — rus+eng. Это не идеально (англоязычный пользователь с русским документом получит rus+eng только если переключится), но покрывает 90% реальных кейсов.


Область распознавания: координаты в двух системах отсчёта

Это самое тонкое место в реализации. У нас два масштабных пространства:

1. Canvas-холст Fabric.js — рабочий размер, масштабируется под экран 2. Нативное изображение — полное разрешение оригинальной страницы

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

// Условие корректности: areaRect (fabric.Rect) создан с originX:'left' и
// originY:'top', а areaRect.x/y — координаты его левого верхнего угла в
// глобальном пространстве Viewport холста (не относительно родителя/группы).
const scNX = fabNativeW / fabBaseW;  // коэффициент X
const scNY = fabNativeH / fabBaseH;  // коэффициент Y
ocrOffX = Math.floor(areaRect.x * scNX);
ocrOffY = Math.floor(areaRect.y * scNY);
ocrW    = Math.min(Math.ceil(areaRect.w * scNX), fabNativeW - ocrOffX);
ocrH    = Math.min(Math.ceil(areaRect.h * scNY), fabNativeH - ocrOffY);

fabNativeW/H — размер оригинала. fabBaseW/H — размер Canvas-холста. Кроп делается из оригинального изображения, а не из масштабированного — поэтому качество распознавания не зависит от размера окна браузера.

Важное условие: формула верна только если areaRect создан с originX: 'left' и originY: 'top' (точка отсчёта объекта — левый верхний угол), а areaRect.x/y берутся в глобальном пространстве Viewport холста. Если точку отсчёта сместить в центр (originX: 'center') или считать координаты относительно группы/родителя — ocrOffX/ocrOffY уедут на полширины-полвысоты, и кроп уйдёт мимо выделенной области.


Слой замазки + редактируемый текст: два объекта Fabric на строку

Tesseract возвращает структуру data.lines — массив строк с координатами bbox и распознанным текстом. Для каждой строки создаётся пара объектов:

data.lines.forEach(line => {
  // Масштабируем bbox обратно в пространство Canvas
  const x = (line.bbox.x0 / scNX) + areaRect.x;
  const y = (line.bbox.y0 / scNY) + areaRect.y;
  const w = (line.bbox.x1 - line.bbox.x0) / scNX;
  const h = (line.bbox.y1 - line.bbox.y0) / scNY;

  // Замазка — перекрывает оригинальный текст
  const rect = new fabric.Rect({
    left: x, top: y, width: w, height: h,
    fill: '#ffffff', selectable: true, evented: true,
  });

  // Редактируемый текст поверх
  const itext = new fabric.IText(line.text.trim(), {
    left: x, top: y,
    fontSize: Math.round(h * 0.8),
    fill: '#000000',
    fontFamily: 'Arial, sans-serif',
    selectable: true, editable: true,
  });

  fabCanvas.add(rect);
  fabCanvas.add(itext);
});
fabCanvas.renderAll();  // принудительный рендер: фиксируем все объекты ДО снимка
fabPushUndo();          // весь блок — одно состояние в стеке отмены

Порядок здесь важен. fabPushUndo() делает моментальный снимок состояния холста (через toJSON). Если вызвать его сразу после синхронного добавления объектов в цикле, Fabric.js может ещё не отрисовать новые rect и itext — он откладывает перерисовку до следующего кадра. Поэтому перед снимком мы форсируем fabCanvas.renderAll(): он синхронно прогоняет рендер, и в Undo-стек попадает уже актуальное состояние со всеми добавленными строками.

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


Ограничения, с которыми мы живём

Точность позиционирования bbox. Tesseract не всегда точно определяет границы строк, особенно в документах с нестандартным межстрочным интервалом. Иногда bbox немного смещён — приходится двигать текстовый блок вручную в режиме Select.

Таблицы. Tesseract в режиме PAGE_SEG_MODE_AUTO часто неправильно сегментирует строки внутри таблиц. Для таблиц лучше работает постолбцовое выделение и ручная корректировка.

Рукопись. Не распознаётся. Точка.

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


Попробовать Area OCR в браузере — pdfredx.com, без регистрации, без загрузки файлов на сервер.

🚀 Запустить OCR бесплатно