Когда сканируете стопку двусторонних листов через автоподатчик, сканер делает два прогона: сначала все лицевые страницы, потом все оборотные. На выходе — два PDF вместо одного. Стандартные онлайн-сервисы не понимают эту структуру и не умеют её восстанавливать. Инструмент дуплексного скана в pdfredX делает именно это — прямо в браузере, без отправки ваших документов куда бы то ни было.
Шаг 01. Загрузка файлов
Откройте pdfredX и перетащите оба PDF в зону загрузки — или выберите их через проводник. Загружайте файлы в правильном порядке: сначала фронт (нечётные, лицевые), затем бэк (чётные, оборотные). Порядок загрузки имеет значение: именно он определяет, какой файл алгоритм считает первым.
После загрузки галерея сразу покажет цветовую маркировку: зелёная полоса на карточках — страницы фронта, синяя — страницы бэка. Это не декоративная деталь. Маркировка отражает внутренние ключи pdfSrcKey: 'duplex:front:...' и 'duplex:back:...' в массиве items[] — по ним алгоритм чередования будет собирать правильный порядок. Если цвета перепутаны — значит, файлы загружены в обратном порядке; просто удалите их и загрузите заново.
Шаг 02. Настройка дуплексного режима
Нажмите кнопку «Дуплексный скан» на тулбаре. Откроется боковая панель #DM с тремя элементами управления.
Назначение файлов. Два выпадающих списка: «Фронт» и «Бэк». Если вы загрузили файлы в правильном порядке, назначение проставляется автоматически по порядку поступления. Если нет — переназначьте вручную, это занимает пять секунд.
Реверс бэка (dmReverseBack). Самый важный переключатель. Большинство АПД после первого прогона переворачивают стопку — оборотные страницы сканируются в обратном порядке: последний лист становится первым. Если не учесть это, чередование сломается: Front₁ → Back₅ → Front₂ → Back₄ вместо Front₁ → Back₁ → Front₂ → Back₂.
При включённом реверсе алгоритм читает бэк-массив справа налево: backLen - 1 - i вместо i. Это единственное математическое изменение, но оно полностью восстанавливает правильный порядок. Как понять, нужен ли реверс вашему сканеру: включите его и посмотрите на превью в галерее. Если страница 2 стала оборотной страницы 1 — всё правильно. Если нет — выключите.
Предпросмотр порядка. Ещё до нажатия «Применить» галерея обновляет порядок карточек в реальном времени по мере изменения настроек. Вы можете прокрутить все страницы и убедиться в правильности чередования до финальной сборки.
Шаг 03. Сборка и переход к экспорту
Нажмите «Применить». Алгоритм за доли секунды перестраивает массив items[] — это чисто индексная операция без повторного рендера страниц. Галерея перестраивается и показывает финальный порядок: Front₁ / Back₁ / Front₂ / Back₂ / ...
Быстрый старт с лендинга. Если вы пришли на главную страницу pdfredX через лендинг инструмента «Дуплексный скан», браузер уже сделал за вас один шаг. js/features-landing.js записывает в sessionStorage параметр openTool=duplex и перенаправляет на главную страницу. При загрузке приложение читает этот параметр и автоматически открывает боковую панель дуплекса — вам не нужно искать кнопку в тулбаре. Просто перетащите файлы и настройте реверс.
Экспорт. Нажмите «Скачать PDF». jsPDF 2.5.1 итерирует по обновлённому массиву items[]: для каждой страницы вызывается addImage(editUrl, ...) с автоматическим определением ориентации A4 по пропорциям изображения. Файл собирается полностью в памяти браузера и скачивается напрямую — без очереди, без ожидания серверного ответа.
Как это устроено под капотом
Каждый загруженный PDF рендерится постранично через PDF.js 3.11.174. Каждая страница превращается в растровый dataURL в Canvas и сохраняется в массив items[] с меткой источника. Два PDF дают два отдельных массива с разными pdfSrcKey.
При сборке дуплекса ничего не рендерится заново. Алгоритм строит новый индексный массив: попеременно берёт items[i] из фронт-массива и items[j] из бэк-массива, где j = i или j = backLen - 1 - i в зависимости от флага dmReverseBack. Вся операция — переупорядочивание ссылок в JavaScript, а не тяжёлый рендер. На 200 страницах это занимает меньше 100 миллисекунд.
Известные ограничения
Только растровый результат. PDF.js рендерит страницы в Canvas, поэтому на выходе мы работаем с растровыми изображениями. Текст в итоговом PDF нельзя выделить как текст — он является частью растра. Если нужен редактируемый текстовый слой, используйте инструмент OCR по области поверх нужных страниц.
Производительность на мобильных. Документы толще 80–100 страниц на слабых смартфонах рендерятся с заметной задержкой: PDF.js держит каждую страницу в памяти как ImageData. На десктопе это практически незаметно.
Разное разрешение фронта и бэка. Если оба прогона отсканированы с разным DPI или в разной ориентации, чередование сработает корректно, но визуально документ будет непоследовательным. Выровняйте ориентацию страниц через инструмент поворота перед сборкой дуплекса.
Лимит памяти браузера. Практический предел — около 200–300 страниц на вкладку в зависимости от объёма RAM устройства. Сверх этого — Chrome начинает выгружать кэш, и повторный рендер замедляет сборку.
Если вы сканировали книгу в режиме разворота — каждая страница содержит два листа — задача другая, и у нас есть отдельный гайд: Разделить разворот книги PDF на две страницы.
Попробуйте прямо сейчас — pdfredx.com, без регистрации, файлы остаются у вас.
