Формат ZIP
ZIP — контейнер, а не способ сжатия: каждый вложенный файл получает собственный локальный заголовок, а общий список всех записей лежит в конце файла, в центральном каталоге. Отсюда все свойства формата, включая неприятные. У нас ZIP появляется только как форма выдачи: когда инструмент сделал больше одного файла, они складываются в архив, а один-единственный результат скачивается напрямую.
Коротко о цифрах
- Сигнатура записи
- PK 03 04 в начале каждого вложенного файла
- Где список файлов
- в конце архива — обрыв закачки ломает его целиком
- Пределы классического ZIP
- 4 ГБ и 65 535 записей, снимаются ZIP64
- Режим нашей упаковки
- хранение без сжатия — содержимое уже сжато
- Когда архива не будет
- результат из одного файла скачивается напрямую
- Имена с кириллицей
- помечаются флагом UTF-8 при упаковке
Оглавление в конце, а не в начале
Список файлов дописывается последним, когда все записи уже уложены. Такое устройство удобно при упаковке: архиватор пишет данные потоком и не возвращается к началу. Но у него есть обратная сторона — недокачанный архив не открывается целиком, потому что оглавление находится ровно там, где закачка оборвалась, а без него распаковщик не знает, что внутри.
Практический вывод: если архив «битый», первым делом сравните его размер с тем, который называет отправитель. Расхождение означает обрыв, и чинить тут нечего — нужно скачать заново. Исторические пределы в четыре гигабайта и 65 535 записей давно сняты расширением ZIP64, но старые программы про него не знают и на большом архиве спотыкаются.
Когда наши инструменты отдают архив
- Разделение PDF: архив называется по исходному файлу с окончанием _split, внутри страницы с окончанием _page_ и номером.
- Перевод PDF в JPG или PNG: архив с окончанием _images, внутри по одной картинке на страницу с тем же принципом имён.
- Пакетный перевод изображений: имя вида converted_формат_дата, до тридцати файлов за раз, по 100 МБ на каждый.
- Результат из одного файла архивом не оборачивается: страница или картинка скачивается как есть.
- Исходный PDF на разделении принимается размером до гигабайта — вся работа идёт в браузере.
Наш архив ничего не сжимает — и это правильно
Складывание идёт в режиме хранения без сжатия: библиотека, которой мы собираем архив, использует его по умолчанию. Причина простая — внутри лежат JPEG, PNG и PDF, то есть данные, уже прошедшие через собственные упаковщики. Сжимать их повторно означает потратить время и память вкладки ради долей процента.
Отсюда честный ответ на частый вопрос: архив весит примерно столько же, сколько файлы внутри. Если задача — уменьшить объём, работать нужно с самими документами: сжать PDF растеризацией или оптимизировать его структуру, а изображения перевести в более экономный формат. Архив на это не влияет.
Имена файлов внутри
- Сам формат допускает две записи с одинаковым путём, а распаковщики ведут себя по-разному: одни перезаписывают, другие переименовывают.
- Поэтому при пакетном переводе изображений совпадающие имена разводятся добавлением номера перед расширением.
- Кириллица в именах когда-то была больным местом: старые архиваторы считали их записанными в кодировке той эпохи и показывали крякозябры.
- Современные архивы помечают такие имена флагом кодировки UTF-8, и наша выдача этот флаг ставит.
- Кодировка имён и содержимое — разные вещи: даже у зашифрованного архива список имён обычно виден.
Частые вопросы
Почему я скачал не архив, а один файл?
Значит, инструмент сделал ровно один файл: разделили по одному диапазону, перевели одностраничный PDF или конвертировали единственное изображение. Заворачивать один файл в архив бессмысленно, поэтому он приходит напрямую.
Почему архив весит столько же, сколько файлы внутри?
Потому что он их не сжимает, а просто складывает. Картинки и PDF уже упакованы своими алгоритмами, и повторное сжатие дало бы доли процента ценой заметного расхода памяти во вкладке.
Архив не открывается — что делать?
Сравните размер файла с тем, что видит отправитель: список записей лежит в самом конце, поэтому недокачанный архив не открывается целиком. При расхождении скачайте заново, чинить в этом случае нечего.
Можно ли загрузить ZIP к вам на обработку?
Нет, инструменты принимают сами документы, а не контейнеры с ними. Распакуйте архив у себя и загрузите файлы — PDF из него потом можно объединить в один документ.