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

Объединить PDF файлы — Склеить несколько PDF онлайн

Соедините несколько документов PDF в один файл в нужном вам порядке. Быстрое, безопасное и бесплатное объединение прямо на вашем устройстве.

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

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

01

Загрузите PDF файлы

Добавьте два или более PDF — их можно перетащить в нужном порядке.

02

Упорядочьте документы

Перетаскивайте файлы, чтобы установить нужную очерёдность страниц.

03

Скачайте единый PDF

Все документы объединяются в один файл и скачиваются на устройство.

Почему pdfredX

🔒

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

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

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

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

🆓

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

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

📱

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

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

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

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

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


Шаг 01. Загрузить PDF-файлы

Откройте pdfredx.com и перетащите два или больше PDF в зону загрузки — или выберите их через проводник. Файлы читаются локально через FileReader, страницы рендерятся на Canvas через PDF.js. Ни один байт не уходит на сервер.

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


Шаг 02. Упорядочить страницы

Порядок страниц в итоговом файле — это порядок карточек в галерее. Перетаскивайте карточки мышью или пальцем: страница встаёт на новое место, остальные сдвигаются. Лишние листы можно удалить кнопкой 🗑 на карточке.

Перетаскивание работает и на тач-экранах: короткий порог срабатывания (~9 px) отличает перетаскивание от случайного касания, так что на телефоне галерея не «прыгает» при скролле.


Шаг 03. Скачать единый PDF

Нажмите «Создать PDF». Приложение проходит по галерее и собирает все страницы в один файл через jsPDF: для каждой страницы автоматически определяется ориентация (книжная или альбомная) по пропорциям, лист формата A4. Готовый документ скачивается напрямую из браузера. Бесплатно, без регистрации, без ожидания серверной очереди.


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

Объединение идёт через растровый пайплайн, а не слияние бинарной структуры PDF. PDF.js рендерит каждую страницу каждого файла в Canvas и сохраняет как dataURL в общий массив items[] — с ключом источника pdfSrcKey. Порядок в массиве = порядок в галерее; Drag & Drop на Pointer Events просто переставляет элементы items[], без повторного рендера.

На выходе jsPDF проходит по items[]: на каждую страницу вызывает addImage(editUrl, ...) и подбирает ориентацию A4 по пропорциям изображения. Файл собирается целиком в памяти вкладки и отдаётся на скачивание.


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

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

Гиперссылки и закладки не переносятся. Растеризация сохраняет вид страницы, но интерактивные элементы исходных PDF (ссылки, оглавление, поля форм) в изображение не попадают.

Память на больших подборках. Сотни страниц — это сотни изображений в оперативной памяти вкладки. На слабых устройствах при 200+ страницах возможны подтормаживания прокрутки.


Нужна обратная операция — разрезать большой документ на части или извлечь отдельные страницы? Это инструмент Разделить PDF.

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

Склеить PDF без риска: как объединить финансовые отчёты и сканы документов конфиденциально
Собрать в один файл финансовые отчёты, сканы паспортов, кадровые документы, выписки — задача рутинная. Но чтобы просто склеить несколько PDF, обычный онлайн-сервис просит загрузить **все файлы сразу** на свой сервер. То есть весь пакет конфиденциальных документов уезжает на чужую машину — ради операции, которая по сути сводится к расстановке страниц по порядку. Разберём риск и локальную альтернативу.

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


Куда уходят документы на серверных сервисах склейки

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

  • файлы сохраняются во временном хранилище подрядчика (AWS, GCP, Azure);
  • обрабатываются на чужом сервере;
  • хранятся от нескольких часов до нескольких суток «для надёжности»;
  • логируются вместе с метаданными — IP, время, имена и размеры файлов.

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


Полная изоляция в браузере: как объединяет pdfredX

pdfredX не загружает ваши файлы ни на какой сервер. Это следствие архитектуры, которое можно проверить.

Файлы читаются локально. PDF.js открывает каждый документ во вкладке через FileReader и рисует страницы на Canvas. Сетевого запроса с вашими файлами нет.

Сборка идёт в памяти вкладки. Порядок страниц, перестановки Drag & Drop, финальная компоновка jsPDF — всё это операции над данными уже загруженных файлов. Ничего не отправляется.

Готовый файл собирается на клиенте. Единый PDF формирует jsPDF прямо во вкладке и отдаёт браузеру на скачивание — в папку «Загрузки», а не на сервер и обратно.

Работает офлайн. Загрузите файлы, отключите интернет и соберите документ — всё продолжит работать. Сеть нужна только чтобы один раз загрузить приложение.


Пошагово, без отправки на сервер

01. Загрузите PDF. Перетащите файлы в зону загрузки на pdfredx.com. FileReader читает их локально — они не покидают устройство.

02. Задайте порядок. Перетаскивайте карточки страниц в нужную последовательность; лишние удалите. Цветные метки помогают не спутать документы-источники.

03. Сохраните и закройте. Нажмите «Создать PDF» — jsPDF соберёт единый файл локально. После закрытия вкладки данные файлов исчезают из памяти.


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

Клиентская обработка защищает документы от ухода на внешние серверы, но это не щит от всех угроз, и обещать обратное было бы нечестно.

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

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

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

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


Объедините пакет документов без загрузки на сервер — pdfredx.com, бесплатно, без регистрации.

Как устроено объединение PDF в браузере: пайплайн PDF.js → items[] → jsPDF без сервера
Склеить несколько PDF на сервере просто: принять файлы, распарсить структуру, слить деревья объектов, вернуть результат. В браузере, без бэкенда и без отправки файлов, набор ограничений другой — и выбор архитектуры не очевиден. Разберём, как устроен инструмент `merge` в pdfredX: почему растровый пайплайн вместо слияния бинарной структуры, как порядок страниц держится на одном массиве и где это упирается в память.

Склеить несколько PDF на сервере просто: принять файлы, распарсить структуру, слить деревья объектов, вернуть результат. В браузере, без бэкенда и без отправки файлов, набор ограничений другой — и выбор архитектуры не очевиден. Разберём, как устроен инструмент merge в pdfredX: почему растровый пайплайн вместо слияния бинарной структуры, как порядок страниц держится на одном массиве и где это упирается в память.


Архитектурный вызов и выбор стека

Слияние структуры PDF против растеризации. Формат PDF — сложный бинарный граф: таблицы перекрёстных ссылок, потоки объектов, шрифты, ресурсы. Библиотеки вроде pdf-lib умеют сливать такие структуры без растеризации, сохраняя текстовый слой. Но на реальных файлах — со сканами, нестандартными метаданными, повреждёнными xref — стабильность такого слияния ниже, а в браузер приходится тащить полноценный парсер.

Почему выбран путь PDF.js → jsPDF. pdfredX рендерит страницы через PDF.js (индустриальный стандарт отрисовки PDF) и собирает результат через jsPDF. Пайплайн предсказуем на файлах любого происхождения: если PDF.js смог показать страницу — она попадёт в итог. Плата за надёжность — потеря текстового слоя: каждая страница становится изображением. Для склейки сканов, где исходники и так растровые, это приемлемый компромисс.

Почему всё локально. PDF.js рендерит во вкладке, jsPDF собирает там же. Файлы не уходят на сервер — это и быстрее (нет round-trip), и приватнее (пакет документов остаётся на устройстве).


Разбор реализации

Единый источник истины — массив items[]

Каждый загруженный PDF рендерится постранично. Результат рендера каждой страницы конвертируется в dataURL и кладётся в общий массив items[]. Каждый элемент несёт ключ источника:

items.push({
  id, name,
  origUrl,             // dataURL оригинала — не мутируется
  editUrl,             // текущий dataURL (для merge = origUrl)
  fromPdf: true,
  pdfSrcKey,           // ключ исходного файла → цвет метки в галерее
});

pdfSrcKey привязывает страницу к её файлу-источнику: в галерее это цветная полоска, а в коде — гарантия, что при перестановках не перепутаются документы. Порядок элементов массива и есть порядок будущего документа.

Перестановка страниц: Drag & Drop на Pointer Events

Порядок задаётся перетаскиванием карточек. Реализация — на Pointer Events (единый код для мыши и тача), с порогом старта перетаскивания:

if (Math.hypot(dx, dy) < 9) return;   // ещё не перетаскивание, а дрожание/тап
// иначе: поднимаем ghost-клон карточки, двигаем, по отпусканию — splice в items[]

Порог в 9 px отделяет намеренное перетаскивание от случайного касания при скролле — критично на телефонах. Само перемещение не перерисовывает страницы: меняется только позиция элемента в items[].

Сборка: jsPDF по массиву

Финальный файл собирает makePDF():

let pdf = null;
for (let i = 0; i < items.length; i++) {
  const { w, h } = await imgDims(items[i].editUrl); // пропорции страницы
  const orient = w > h ? 'landscape' : 'portrait';  // ориентация по пропорциям
  if (i === 0) pdf = new jsPDF({ orientation: orient, unit: 'mm', format: 'a4' });
  else         pdf.addPage('a4', orient);

  // Вписываем страницу в лист с сохранением пропорций (contain), центрируем
  const pw = pdf.internal.pageSize.getWidth();
  const ph = pdf.internal.pageSize.getHeight();
  const ratio = w / h;
  let dw, dh;
  if (ratio > pw / ph) { dw = pw; dh = pw / ratio; }
  else                  { dh = ph; dw = ph * ratio; }
  const x = (pw - dw) / 2, y = (ph - dh) / 2;

  const fmt = items[i].editUrl.startsWith('data:image/png') ? 'PNG' : 'JPEG';
  pdf.addImage(items[i].editUrl, fmt, x, y, dw, dh, '', 'FAST');
}
pdf.save('merged.pdf');

Две ключевые детали. Во-первых, imgDims вызывается для каждой страницы отдельно — это важно для смешанных подборок: договор в книжной ориентации, приложения в альбомной (частый случай при склейке разнородных сканов). Во-вторых, страница вписывается в лист с сохранением пропорций (contain) и центрируется — размеры dw/dh считаются от соотношения сторон, поля остаются белыми. Изображение не растягивается на весь A4, поэтому пропорции скана не искажаются.


Компромиссы производительности и лимиты по памяти

Стоимость растрового хранения. Каждая страница — JPEG dataURL. Лист A4 при 150 DPI в декодированном виде — это ~8,7 МБ RGBA-битмапа в памяти. На подборке в 100 страниц декодированные битмапы занимают под 870 МБ; Chrome ограничивает вкладку примерно 2–4 ГБ и при приближении к лимиту начинает выгружать неактивные объекты, вызывая повторные рендеры при прокрутке.

Пик при экспорте. jsPDF держит весь документ в памяти до save(). На 200+ страницах пиковое потребление в момент сборки в 2–3 раза выше, чем при обычном просмотре галереи: одновременно живут декодированные битмапы, внутренние буферы jsPDF и финальный blob.

Что можно улучшить. Потоковый экспорт через WritableStream снял бы пиковый скачок памяти на очень больших подборках — это в планах.


Что дальше

Опциональное сохранение текстового слоя для чисто цифровых (не сканированных) PDF — отдельная ветка через слияние структуры, когда исходники это позволяют.

LRU-кэш декодированных битмапов — держать в полном разрешении только последние N страниц, остальные — сжатыми, чтобы снизить пиковую память на порядок.


Хотите проверить под нагрузкой — загрузите несколько многостраничных PDF на pdfredx.com и соберите единый документ. Без регистрации, без загрузки файлов на сервер.

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