Безопасность PDF в браузере: преимущества локального слияния и разделения
Резюме (TL;DR)
В прошлом месяце мне нужно было склеить 47 отсканированных страниц договора (общим весом 230 МБ) в один файл. Я уже собирался загрузить их в привычный онлайновый PDF-сервис, но остановился, увидев в именах файлов настоящие ФИО контрагента. В итоге я сделал всё на pdf-lib (v1.17.1) прямо во вкладке браузера: около 18 секунд на M2 MacBook Air, кулер даже не раскрутился. С тех пор чувствительные PDF я сначала пробую обрабатывать именно в браузере.
Слияние и разделение PDF — это вовсе не «работа, для которой нужно обязательно загружать документ на чей-то сервер». Благодаря современным веб-стандартам и библиотекам на WebAssembly (pdf-lib, порты PDFium, MuPDF.js и др.) документы среднего размера обрабатываются в браузере достаточно быстро. Главное преимущество такого подхода — файл не покидает сеть устройства. Раз нет загрузки, радикально сокращаются и серверные логи, и временное хранение, и бэкапы, и возможные каналы утечки. При этом для файлов в несколько сотен мегабайт, CPU-ёмких задач вроде OCR и пересжатия сканов, а также сложных сценариев с подписью некоторых зашифрованных документов серверные инструменты по-прежнему могут быть уместнее. Итог: чем выше чувствительность и разумнее размер файла, тем лучше подходит обработка в браузере, а для большого объёма, комплексного OCR и сохранения сложных электронных подписей безопаснее выбирать проверенные серверные инструменты или локальные десктопные приложения.
Предыстория и концепции
PDF — это не простая картинка, а объектно-ориентированный формат документа. Файл состоит из множества indirect object (косвенных объектов), каждый из которых индексируется по байтовому смещению через перекрёстную таблицу XRef в конце файла. Современный PDF умеет паковать несколько объектов в потоки ObjStm, а ещё часто распространяется с инкрементальными обновлениями, добавленными сверху базовой ревизии. Поэтому слияние — это не «склеить два файла», а скорее перенести граф объектов одного PDF в пространство имён другого и переписать новую XRef-таблицу.
С разделением та же история. Оставляя только выбранные страницы, нужно аккуратно вычленить шрифты и изображения, на которые они ссылаются, и залатать оборванные ссылки — иначе получится невалидный PDF. Библиотеки для браузера вроде pdf-lib выполняют эту работу на чистом JavaScript и WebAssembly. То есть на уровне спецификации путь «в браузере» даёт эквивалентный результат, при этом байты документа не покидают устройство.
Сравнение и данные
| Критерий | Серверная обработка | Браузерная обработка |
|---|---|---|
| Приватность | Файл попадает на сервер, возможно временное хранение | Файл обрабатывается только на устройстве |
| Небольшие файлы (несколько МБ) | Задержка сетевых раундтрипов играет большую роль | Обычно ощущается быстрее |
| Большие файлы (100 МБ+) | Выигрыш за счёт выделенных CPU и памяти | Можно упереться в лимиты памяти браузера |
| Оффлайн | Невозможен | Возможна |
| Риск остаточных данных | Требует доверия к политикам и логам | В принципе очень низкий |
| Продвинутые функции (OCR, сложные подписи) | Много зрелых инструментов | Зависит от реализации, часто ограничена |
В таблице я привёл тенденции, а не конкретные цифры, потому что реальная скорость складывается из «размер файла × скорость сети × время обработки на сервере». В офисных сценариях — склеить 20–30 документов по несколько мегабайт — браузер часто выигрывает просто за счёт отсутствия сетевого раундтрипа.
Практические сценарии
Сценарий 1 — склейка подборки договоров. Когда договор, приложения и дополнительные соглашения надо прислать одним файлом, сила браузерной обработки в том, что файл никуда не уходит. Я видел, как юридические отделы двух компаний запрещали внешние PDF-мерджеры: в одном случае черновик попал в выдачу поисковика, в другом команда поздно заметила 30-дневное хранение данных в условиях бесплатного сервиса. Если внутренними правилами материал отнесён к «нельзя загружать вовне», такой подход идеально подходит.
Сценарий 2 — разбивка брошюры. Как-то я резал 100-страничный учебный материал на 14 глав и случайно задал неверный диапазон страниц. В браузере спасло простое обновление вкладки — можно начать заново; повторное редактирование давалось намного легче. Дополнительный бонус: даже при промахе оригинал не распылялся по сети.
Сценарий 3 — уменьшение размера сканов. Сканы по природе тяжёлые, потому что это изображения. Договор на 48 МБ, отсканированный на 650 dpi, я сжал до 11 МБ простой ресемплингом до 200 dpi. Если заранее привести картинки в порядок, итоговый PDF после слияния становится заметно легче.
Распространённые заблуждения
«В браузере медленно». Верно было в 2015 году, но с появлением WebAssembly SIMD и потоков воркеров картина поменялась. На моём ноутбуке слияние пяти PDF по 10 МБ занимает около 1,3 секунды, а та же задача через серверный сервис с учётом загрузки и скачивания — от 10 секунд и дольше.
«Сервер всегда быстрее». Из-за цепочки «загрузка → очередь → обработка → скачивание» при медленной сети или загруженном сервере браузер с мгновенной обработкой нередко оказывается быстрее.
«Браузерная обработка не годится для аудита и доказательств». Для потоков, где нужен журнал аудита, уместны специализированные серверные системы. Но обычные личные задачи вроде слияния, разделения и перестановки страниц не обязательно превращать в аудируемые документы.
«Зашифрованный PDF обязательно обрабатывать на сервере». Стандартные операции вроде расшифровки AES-128/256 без проблем делают и браузерные библиотеки. А вот нестандартные подписи и политики некоторых ведомств стоит заранее проверить в документации инструмента.
Чек-лист
- Содержит ли документ персональные данные или конфиденциальную информацию?
- Да — браузерная обработка как первый выбор.
- Каков общий объём файла?
- До 50–100 МБ: браузер вполне справится.
- Сотни мегабайт и выше: локальное десктоп-приложение или проверенный серверный инструмент.
- Нужны ли OCR, сложные подписи, аудит-трейл?
- Да — рассмотрите специализированные инструменты (локальные или корпоративные серверы).
- Это регулярная повторяющаяся задача?
- Да — удобнее держать под рукой закладку в браузере или PWA.
- Работа должна идти оффлайн?
- Да — подойдут только браузер с кэшированным веб-приложением или десктоп.
- Как вы будете делиться результатом? Если через ссылку — перепроверьте, что к ней не прицепились лишние трекеры.
Связанный инструмент
Сценарии слияния из этой статьи можно опробовать в инструменте слияния PDF от Patrache Studio. Если нужно сначала уменьшить размер изображений внутри сканов, лучше сперва заглянуть в полное руководство по сжатию изображений и привести форматы в порядок. А если в итоговый PDF вы планируете добавлять QR-коды для идентификации товара или документа, прочитайте также Безопасность QR-кодов — там разобраны риски при печати и повторном распространении.
Источники
- pdf-lib (JS-библиотека для создания и редактирования PDF в браузере) — https://github.com/Hopding/pdf-lib
- Mozilla PDF.js — https://mozilla.github.io/pdf.js/
- Adobe, обзор структуры PDF 32000-1:2008 — https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_1-7.pdf
- EFF, общие материалы о принципах приватности — https://www.eff.org/issues/privacy