pdfsizeopt уменьшает размер PDF за счёт повторной упаковки объектов, потоков, встроенных шрифтов и изображений, при этом стараясь не менять внешний вид страниц и не удалять интерактивные элементы. Пользователь задаёт исходный и выходной файл в командной строке, а при необходимости отключает отдельные этапы, выбирает оптимизаторы изображений, получает статистику структуры документа и включает диагностический вывод для поиска проблемного шрифта, потока или графического объекта.
Основной рабочий процесс строится вокруг одной команды: программа читает таблицу перекрёстных ссылок, находит реально используемые объекты, сравнивает варианты сжатия потоков, устраняет безопасные дубликаты и записывает новый PDF. Для документов, собранных TeX или LaTeX, особенно полезны операции со встроенными подмножествами Type1 и CFF-шрифтов, а для сканов и иллюстраций — подбор наиболее компактного представления каждого подходящего изображения.
Управление выполняется параметрами с явными значениями yes или no, поэтому результат легко повторить в пакетном сценарии. Начинать разумно с настроек по умолчанию, затем проверять размер и корректность выходного файла, а при медленной обработке или ошибке последовательно исключать pngout, оптимизацию изображений, объединение шрифтов и их регенерацию, не отключая остальные полезные проходы без необходимости.
Скачать pdfsizeopt
- Редактирование PDF
- Русский интерфейс
- Просто новичкам
- Нет графического интерфейса
- Сложная установка
- Медленная обработка
Как устроен рабочий процесс
В минимальном варианте достаточно передать два имени: сначала исходный PDF, затем путь для результата. Явное имя выходного файла защищает оригинал от случайной перезаписи и упрощает сравнение. Если второй аргумент не указан, в типовом сценарии рядом с исходником появляется файл с суффиксом pso, однако для автоматизации лучше не полагаться на неявное имя: его сложнее предсказать при обработке каталогов, а при повторном запуске можно спутать предыдущий результат с новым.
После запуска программа сначала разбирает структуру документа, а не рисует страницы в растровое изображение. Это принципиально для сохранения текста, векторной графики, закладок и гиперссылок. Далее отдельные оптимизаторы рассматривают объекты разных типов: шрифтовые программы, потоки команд страницы, изображения и служебные таблицы. Для каждого безопасного варианта выбирается более компактная сериализация; если новый поток не меньше исходного или не подходит по условиям, исходное представление остаётся предпочтительным.
Командная строка одновременно является интерфейсом и протоколом работы. Параметры можно сохранить в командном файле, Makefile, shell-скрипте или задании непрерывной сборки. Такой подход полезен, когда один и тот же комплект настроек применяется к десяткам выпусков отчёта: команда документирует точный профиль, а журнал выполнения показывает, на каком этапе возникла ошибка. Недостаток очевиден — нет интерактивного предпросмотра и ползунка качества, поэтому контроль результата выполняется внешней программой просмотра PDF.

Подготовка исходного документа
Перед первым запуском сохраните неизменяемую копию исходника и убедитесь, что файл открывается хотя бы в двух независимых просмотрщиках. Если документ уже повреждён, оптимизатор может остановиться на отсутствующем корневом объекте, неверной таблице ссылок или несовместимом фильтре. Такая остановка полезна: она не даёт записать результат, структура которого ещё менее предсказуема. Сначала восстановите документ специализированным инструментом, затем повторите уменьшение размера на исправленной копии.
Парольная защита требует отдельного внимания. Зашифрованный PDF нельзя считать обычным входом даже тогда, когда программа просмотра открывает его после ввода пароля. Внутри остаются зашифрованные потоки и ограничения доступа, а pdfsizeopt сообщает об этом как об отдельной ошибке. Корректная последовательность — получить разрешённую расшифрованную копию, проверить права на обработку и только затем запускать оптимизацию. Не пытайтесь обходить чужие ограничения доступа: программа не предназначена для восстановления паролей.
Имена файлов и каталогов лучше делать короткими. В Windows особенно надёжны пути из латинских букв, цифр, дефиса и подчёркивания. Пробелы допустимы, если каждый путь заключён в кавычки, но сочетание пробелов и национальных символов может усложнить передачу аргументов старым вспомогательным исполняемым файлам. Практичный рабочий каталог выглядит как C:\pdfwork или D:\jobs\report; исходник можно скопировать туда, а готовый файл вернуть в проект после проверки.
- Не запускайте обработку на единственной копии документа.
- Проверьте свободное место для временных файлов и нескольких вариантов потоков.
- Закройте программы, которые удерживают выходной файл открытым для записи.
- Запишите исходный размер, количество страниц и контрольную сумму.
- Выберите несколько контрольных страниц: титульную, страницу со шрифтами, скан и страницу с гиперссылками.
Основные режимы и справка
Режим optimize используется по умолчанию и выполняет полный проход. Параметр version завершает работу после вывода идентификационной информации, help показывает все флаги, helpshort — сокращённую справку без длинного перечня настроек, а stats анализирует распределение байтов по типам объектов. Эти режимы не следует смешивать в одном задании: статистика нужна для диагностики, а оптимизация — для создания нового файла. В пакетном сценарии каждый режим оформляют отдельной командой и проверяют код возврата.
Полная справка важнее случайного примера из форума, потому что в ней видны значения по умолчанию и допустимый синтаксис. Большинство переключателей требуют формы имя=yes или имя=no. Сокращение до одного имени может быть воспринято иначе или вызвать сообщение о неизвестном аргументе. При переносе команды между оболочками следите за символом продолжения строки: обратная косая черта подходит для Unix-оболочки, а в Windows команду проще держать одной строкой или использовать синтаксис конкретного командного процессора.
Статистика помогает определить, где находится реальный резерв. Если почти весь объём занимают JPEG-потоки, уже закодированные с потерями, структурные изменения дадут небольшой выигрыш. Если значительная доля приходится на повторяющиеся шрифтовые подмножества и служебные объекты, результат может быть заметнее. Для скана из двухцветных страниц перспективен JBIG2; для цветных PNG-подобных изображений важны sam2p, предикторы и дополнительные оптимизаторы без потерь.

Что оптимизируется без перерисовки страниц
PDF состоит не из готовых кадров, а из графа объектов. Страница ссылается на словари ресурсов, шрифты, XObject-изображения, потоки команд рисования, аннотации и общие служебные элементы. Один объект может использоваться многими страницами, а после последовательного редактирования в файле могут остаться недостижимые записи. pdfsizeopt проходит по ссылкам от корневого каталога, сохраняет нужные элементы и получает возможность не переносить мусор, который больше не участвует в отображении документа.
В потоках с Flate-сжатием одна и та же последовательность байтов может быть упакована с разной эффективностью. Программа декодирует подходящий поток, формирует альтернативное представление и оставляет меньший вариант. Декодирование JPEG или JPEG 2000 не используется как универсальный путь, потому что повторное кодирование способно изменить изображение. Здесь цель отличается от привычного уменьшения разрешения: важнее сохранить визуальное содержимое и интерактивность, даже если итоговый выигрыш окажется скромнее.
Служебные заголовки объектов сериализуются без лишних пробелов и комментариев, одинаковые объекты могут объединяться, а небольшие не потоковые объекты — упаковываться в object stream. Таблица перекрёстных ссылок также может быть записана как компактный поток. Эти операции не меняют смысл графических команд, но требуют совместимого просмотрщика. Современные программы обычно понимают такую структуру, а для очень старого оборудования или встроенного ПО полезно заранее провести проверку либо отключить соответствующие генераторы.
Оптимизация изображений
Обработка изображений — самый затратный этап и одновременно основной источник экономии в сканах, слайдах и технических отчётах. Для каждого подходящего XObject программа извлекает параметры ширины, высоты, цветового пространства, глубины и фильтра, создаёт несколько допустимых вариантов и сравнивает размер. Выигрыш достигается не снижением числа пикселей, а более удачным выбором палитры, битности, предиктора и алгоритма упаковки. Если исходная форма уже лучше, она сохраняется.
Флаг do-optimize-images управляет всем этапом. Значение no полезно не только как способ ускорения, но и как диагностический тест: если без работы с картинками документ проходит, причина ошибки находится в конкретном изображении или внешнем оптимизаторе. Остальные операции — удаление неиспользуемых объектов, сжатие обычных потоков, работа со шрифтами — продолжают действовать. Поэтому отключение одного проблемного класса не превращает запуск в пустое копирование.
Изображения с DCTDecode и JPXDecode обычно не раскодируются ради повторного сжатия, поскольку это могло бы изменить пиксели. Ограничения действуют и для сложных цветовых пространств, масок и глубины выше восьми бит на компонент: безопасный вариант может оказаться исходным потоком. Это объясняет, почему каталог фотографий, уже хорошо сжатый JPEG, уменьшается слабее, чем документ с неэффективно записанной индексированной графикой.

sam2p и предикторы
sam2p используется для получения компактного PDF-представления растровых данных и умеет выбирать подходящую палитру, глубину и Flate-сжатие. Переключатель use-sam2p-pr включает работу с предикторами, которые преобразуют строки пикселей так, чтобы повторяющиеся значения лучше сжимались. На схемах, интерфейсных снимках и изображениях с плоскими областями это часто полезнее простого повторного запуска Deflate. При непредвиденной ошибке сначала проверьте наличие правильного исполняемого файла, затем временно исключите sam2p из явного списка оптимизаторов.
Оптимизатор не обязан всегда выбирать результат sam2p. Его поток конкурирует с исходным и другими кандидатами. Такая стратегия защищает от редкого случая, когда более сложная перекодировка увеличивает данные из-за заголовков или неудачного предиктора. В журнале высокой подробности можно увидеть, какие инструменты запускаются, но окончательный вывод оценивайте по готовому файлу и визуальной проверке, а не по самому факту выполнения внешней команды.
pngout и скорость
pngout перебирает способы упаковки PNG-подобных данных и нередко находит небольшой дополнительный выигрыш, однако работает медленно. На PDF с десятками крупных картинок суммарное время легко растёт непропорционально размеру файла. Первая практическая настройка для ускорения — use-pngout=no. Она сохраняет остальные варианты, включая sam2p и структурные проходы, поэтому часто даёт лучший баланс между временем и размером. Сравните два результата на одном документе, прежде чем закреплять профиль для всей серии.
Если отключение pngout почти не меняет итоговый размер, оставлять его в ежедневном процессе нет смысла. Для архивной финальной сборки, которую выполняют редко, медленный проход можно вернуть. Так профили разделяются на быстрый производственный и максимальный архивный. Важно не называть любой меньший файл лучшим: разница в несколько килобайт не оправдывает часы обработки, особенно если выход создаётся после каждого изменения исходного документа.
JBIG2 для двухцветных страниц
JBIG2 применяется только к изображениям с двумя цветами. Типичный кандидат — чёрно-белая страница после бинаризации, где фон и штрихи представлены одним битом на пиксель. Для оттенков серого и цветных фотографий этот путь не используется. Флаг use-jbig2 позволяет исключить инструмент, если он отсутствует или вызывает проблему, а do-fast-bilevel-images сокращает перебор медленных альтернатив, когда JBIG2 заведомо остаётся основным кандидатом.
Перед массовой обработкой сканов проверьте мелкие знаки, формулы, точки над буквами и тонкие линии. Сам алгоритм может использоваться в без потерь режиме, но качество исходной бинаризации уже задано до запуска pdfsizeopt. Программа не восстанавливает детали, потерянные сканером или предыдущим конвертером. Сравнивать нужно не только общий вид страницы, но и фрагменты с мелким кеглем при увеличении, а также результаты OCR, если текстовый слой критичен.
Явный список оптимизаторов
Параметр use-image-optimizer принимает перечень известных программ: sam2p, imgdataopt, pngout, jbig2, zopflipng, optipng, ECT и advpng. Повтор одного имени означает повторный запуск, а не усиление режима, поэтому дубликаты только тратят время. Специальные значения no или none очищают список; после них можно добавить выбранные инструменты. Такой профиль удобен для воспроизводимого сравнения, когда требуется исключить зависимость от набора файлов, случайно оказавшихся в каталоге.
Для нестандартного оптимизатора поддерживается шаблон команды с подстановками временных имён. Это мощная, но рискованная возможность: шаблон передаётся оболочке, а значит, нуждается в строгом экранировании и доверенном окружении. Не подставляйте в него данные от внешнего пользователя и не запускайте неизвестные исполняемые файлы. Сначала включите do-debug-image-optimizers, проверьте развёрнутые шаблоны и убедитесь, что целевой файл создаётся именно там, где его ожидает программа.

Оптимизация встроенных шрифтов
Наибольшее внимание уделяется Type1 и Type1C, то есть CFF-шрифтам. В документах TeX один гарнитурный набор может быть встроен несколькими подмножествами, каждое со своим префиксом и повторяющимися контурами глифов. Объединение совместимых подмножеств уменьшает дублирование, но требует точного сопоставления кодировок и имён. TrueType, представленный как Type42, не получает аналогичного полного набора шрифтовых оптимизаций, поэтому ожидания от файла с такими ресурсами должны быть умеренными.
do-optimize-fonts включает общий этап. do-unify-fonts пытается объединить шрифты с похожими именами, а do-regenerate-all-fonts заставляет разобрать и заново сериализовать поддерживаемые программы шрифтов. Регенерация делает представление последовательнее и иногда меньше, но зависит от Ghostscript. do-keep-font-optionals сохраняет необязательные поля, прежде всего CharSet, если они нужны внешнему процессу. Обычно начинать следует со значений по умолчанию, а не с ручного включения каждого флага.
Главный риск обнаруживается не по размеру, а по отображению. Ошибочное объединение или несовместимая регенерация может проявиться заменой символа, отсутствующей формулой или нарушенной таблицей поиска Unicode. Поэтому после оптимизации документа с нестандартными шрифтами проверьте страницы на разных гарнитурах, скопируйте текст в редактор и сравните извлечённую строку. В научной работе отдельно просмотрите математические знаки, лигатуры, диакритику и символы из пользовательских шрифтов.

Безопасная последовательность при ошибке шрифта
Если журнал указывает на разбор, объединение или регенерацию шрифта, сначала оставьте оптимизацию шрифтов включённой, но задайте do-unify-fonts=no и do-regenerate-all-fonts=no. Так сохраняются более осторожные операции, а два наиболее сложных преобразования исключаются. Если ошибка остаётся, повторите запуск с do-optimize-fonts=no. Выход может быть немного больше, зато изображения, обычные потоки и граф объектов всё ещё будут обработаны.
Не копируйте команду обхода во все задания навсегда. Проблема часто относится к одному PDF с повреждённой или необычно закодированной гарнитурой. Сохраните имя файла, диагностический фрагмент и минимальный профиль, который срабатывает. Для следующего документа вернитесь к стандартным настройкам. Иначе постепенно получится чрезмерно осторожный профиль, отключающий большую часть преимуществ без фактической необходимости.

Потоки, объекты и дубликаты
do-optimize-streams отвечает за обычные не графические потоки. Программа пробует повторное сжатие и оставляет меньший вариант, не меняя декодированное содержимое. Это касается потоков команд страницы, некоторых карт, служебных данных и других объектов, которые допускают безопасную обработку. Результат заметен в файлах, созданных инструментами с быстрыми, но неэффективными настройками Deflate. Если поток уже оптимален, дополнительная упаковка почти ничего не даст.
do-optimize-objs выполняет общие операции: удаляет недостижимые объекты, объединяет одинаковые значения и заново записывает заголовки. do-optimize-obj-heads отдельно нормализует заголовки, когда полный объектный проход отключён. Игнорирование поколений и работа с generational objects нужны для упрощения ссылок, но нетипичная структура требует проверки. Документ с нестандартными ненулевыми номерами поколений лучше сначала проанализировать, а не считать автоматически исправленным.
do-unify-pages ищет одинаковые объекты Page. Это полезно, когда несколько страниц действительно ссылаются на эквивалентное содержимое и ресурсы. У старых просмотрщиков встречались проблемы с объединёнными страницами, поэтому для оборудования с древним встроенным интерпретатором флаг можно отключить. Проверять нужно именно целевую среду: печатный сервер, терминал или прошивку устройства, а не только современный просмотрщик на рабочем компьютере.

XRef stream и object stream
do-generate-xref-stream заменяет традиционную текстовую таблицу ссылок компактным потоком, а do-generate-object-stream упаковывает небольшие не потоковые объекты в общий контейнер. Оба механизма входят в более современные варианты формата PDF и уменьшают накладные расходы, особенно при тысячах коротких словарей. Для обычного просмотра оставляйте их включёнными. Отключение оправдано при диагностике несовместимости или при обмене с программой, которая принимает только старую структуру.
Если готовый файл открывается в одном просмотрщике и не открывается в другом, проведите A/B-тест: сначала выключите генерацию object stream, затем при необходимости xref stream. Не отключайте одновременно все функции, иначе будет непонятно, что именно влияло на совместимость. После каждого запуска проверяйте не только открытие первой страницы, но и переход к последней, поиск текста, печать и обработку внешней системой.
Декомпрессия только для диагностики
Флаги do-decompress-flate и do-decompress-most-streams способны резко увеличить выходной файл. Они нужны для исследования содержимого и сравнения потоков, а не для окончательной оптимизации. При их использовании одновременно отключают do-compress-uncompressed-streams, иначе диагностический эффект будет частично отменён повторным сжатием. Не включайте такие параметры в постоянный профиль: большое промежуточное представление быстрее заполняет диск и не решает задачу уменьшения размера.
DCT и JPX обычно исключаются из полной декомпрессии, потому что обратное преобразование не гарантирует точного восстановления исходного кодированного потока. Это важное ограничение при отладке: отсутствие распакованного JPEG в диагностическом файле не означает, что изображение потеряно. Для его анализа извлеките исходный поток специализированным инструментом и проверяйте отдельно, не заставляя pdfsizeopt выполнять преобразование, противоречащее цели сохранения качества.
Статистика перед выбором настроек
Режим stats полезно запускать до серии экспериментов. Он показывает, какую долю занимают изображения, шрифты, прочие потоки и служебные структуры. Если изображения составляют девяносто процентов, отключение их оптимизации почти гарантированно оставит основной объём нетронутым. Если же они невелики, медленный pngout можно исключить без серьёзного ущерба. Статистика не предсказывает точное сжатие, но отсекает бессмысленные гипотезы.
Снимайте показатели и после обработки. Уменьшение категории может сопровождаться ростом другой: например, компактное представление изображения требует дополнительной палитры или DecodeParms. Итог важнее каждой строки по отдельности. Полезная таблица для проекта содержит исходный размер, итоговый размер, время, профиль параметров, преобладающий тип объектов и результат проверки. Через несколько запусков становится видно, какие настройки подходят именно вашим документам.
При автоматизации сохраняйте статистику как артефакт сборки. Если размер выпуска внезапно вырос, сравнение категорий помогает найти причину: новый шрифт встроился полностью, изображения стали цветными вместо двухцветных, редактор добавил дубликаты или изменился способ экспорта. Такой анализ эффективнее случайного перебора флагов, потому что связывает рост с конкретной частью PDF.

Управление скоростью
Скорость зависит не только от мегабайт, но и от количества изображений и вариантов, которые приходится сравнивать. Документ из тысячи небольших иллюстраций может обрабатываться дольше одного крупного скана того же размера из-за запуска внешних программ для каждого объекта. Python координирует процесс, а тяжёлые операции передаются отдельным исполняемым файлам. Накладные расходы особенно заметны на медленном диске, в антивирусной песочнице и при работе через сетевой каталог.
Первый уровень ускорения — use-pngout=no. Второй — do-fast-bilevel-images=yes для двухцветных материалов. Третий — явный короткий список оптимизаторов. Полное do-optimize-images=no оставляйте для диагностики или для PDF, где статистика показывает ничтожную долю изображений. Одновременно измеряйте результат: быстрый профиль хорош только тогда, когда рост выходного размера приемлем для вашего процесса.
Храните исходник, временный каталог и результат на локальном SSD. Сетевой ресурс увеличивает задержки при создании множества psotmp-файлов и добавляет риск кратковременного разрыва. После успешной проверки перенесите готовый файл в архив. Если запуск завершился аварийно, удалите оставшиеся временные файлы только после сохранения журнала: имя конкретного промежуточного объекта иногда помогает понять, на каком этапе произошёл сбой.
Временный каталог
Параметр tmp-dir задаёт место для промежуточных данных. Без него используются переменные TMPDIR или TEMP, а в некоторых сценариях — каталог выходного файла. Выбранная папка должна быть доступна на запись и иметь запас, превышающий размер исходника: несколько кандидатов изображения могут существовать одновременно. На сервере задавайте отдельный каталог для каждого параллельного задания, чтобы одинаковые временные имена не пересекались.
Для контейнера особенно важно смонтировать записываемую рабочую папку. Временные данные внутри неизменяемого слоя или малого системного раздела приводят к ошибкам, которые легко спутать с повреждением PDF. В журнале проверяйте путь, свободное место и права пользователя. После нормального завершения временные объекты удаляются; их систематическое накопление означает аварийные остановки или недостаточную обработку сигналов завершения.
Практический профиль для PDF из TeX и LaTeX
Начинайте со стандартной команды и отдельного выходного имени. Такие документы часто содержат векторный текст, математические шрифты, схемы и несколько повторяющихся подмножеств. После обработки сравните все страницы с формулами и нестандартными символами. Визуальная идентичность основного текста недостаточна: один отсутствующий глиф в формуле делает результат непригодным, даже если файл уменьшился значительно.
Если шрифты занимают большую долю, сохраните включёнными do-optimize-fonts, do-unify-fonts и do-regenerate-all-fonts. При ошибке применяйте осторожную последовательность отключения, а не переходите сразу к запрету всей шрифтовой обработки. Изображения научного отчёта часто представлены схемами с небольшим числом цветов; для них sam2p и предикторы могут быть полезны, тогда как pngout стоит оценивать по времени.
Соберите контрольный набор: страница с обычным текстом, страница с формулами, таблица, векторный график, растровая иллюстрация и список литературы с гиперссылками. Открывайте исходник и результат на одинаковом масштабе, проверяйте выделение текста, переходы по внутренним ссылкам и копирование символов. Для издательского процесса дополнительно проведите пробную печать страницы с тонкими линиями и прозрачностями.
Практический профиль для сканов
Сканированный PDF может состоять из одного изображения на страницу, изображения плюс OCR-слой или набора фрагментов. Сначала режим stats должен подтвердить, что объём действительно сосредоточен в image streams. Для чёрно-белых страниц оставьте use-jbig2=yes и рассмотрите do-fast-bilevel-images=yes. Для цветных и серых страниц используйте обычный набор без ожидания, что JBIG2 будет задействован.
pdfsizeopt не меняет разрешение страницы по принципу 300 или 150 dpi и не предлагает ползунок качества JPEG. Если исходные сканы избыточно велики из-за высокого разрешения или несжатого цвета, без потерь можно выиграть меньше, чем при осознанной пересъёмке или даунсемплинге. Это не ошибка. Решите, является ли точное сохранение пикселей обязательным. Если нет, сначала создайте качественно подготовленный PDF с нужным разрешением, а затем используйте структурную оптимизацию как финальный проход.
Проверяйте OCR отдельно от изображения. Выделите абзац, выполните поиск по редкому слову, экспортируйте текст и сравните порядок. Слой распознавания может быть невидимым и потому не проявиться при обычном просмотре. Также убедитесь, что поворот, размер MediaBox и CropBox не изменили фактическую ориентацию страницы. Для архивного скана сохраняйте исходный мастер независимо от результата уменьшения.
Практический профиль для презентаций и схем
Экспорт презентации часто содержит повторяющиеся фоны, векторные формы, растровые снимки интерфейса и встроенные шрифты. Дубликаты объектов и компактные object streams дают полезный выигрыш, но фотографии, уже записанные как JPEG, могут почти не измениться. Сравните слайды с прозрачностями, тенями и обрезанными изображениями: визуальный результат зависит от исходного PDF и интерпретации просмотрщика, а не только от размера потока.
Если одинаковый фон физически продублирован на каждом слайде, общий объектный проход способен объединить эквивалентные представления только при полном совпадении. Малейшее различие в словаре или трансформации мешает дедупликации. Не ожидайте, что программа распознает визуально похожие, но технически разные картинки. Для максимального эффекта лучше исправить шаблон экспорта, а затем применить pdfsizeopt к более чистому исходнику.
Снимки интерфейса с плоскими областями хорошо подходят для палитры и Flate-предикторов. Здесь pngout иногда приносит дополнительную экономию, но время растёт с количеством слайдов. Настройте быстрый профиль для ежедневных сборок и расширенный — для публикации. В обоих случаях тестируйте кликабельные ссылки, заметки, аннотации и встроенные действия, если они используются в презентации.
Пакетная обработка каталога
Никогда не записывайте результат поверх исходника в том же цикле. Создайте отдельный каталог output, формируйте предсказуемые имена и после каждого запуска проверяйте код возврата и наличие непустого файла. Затем выполняйте структурную и визуальную проверку. Только после прохождения всех шагов допускается перемещение результата в рабочее хранилище. Такой порядок предотвращает потерю исходника при аварии внешнего оптимизатора.
В shell-скрипте заключайте переменные путей в кавычки и не собирайте команду конкатенацией недоверенных строк. В Windows командный файл должен учитывать пробелы и символы оболочки. Для каждой пары файлов сохраняйте отдельный журнал. Если один документ не проходит, очередь должна продолжить обработку остальных, но итоговый отчёт обязан перечислить ошибку, профиль и путь к исходнику.
Параллелизм ограничивайте. Каждый процесс запускает собственные внешние программы и создаёт временные файлы; десятки одновременных заданий перегружают диск и память, а не ускоряют очередь. Начните с одного процесса на физическое ядро или даже меньшего числа, измерьте загрузку и время. Для тяжёлых сканов часто лучше два стабильных процесса, чем восемь конкурирующих за ввод-вывод.
- Пропускайте файлы, для которых уже существует проверенный результат с той же контрольной суммой исходника.
- Фиксируйте полный набор параметров рядом с журналом.
- Не считайте уменьшение успешным, если выход открывается только частично.
- Устанавливайте разумный предел времени и корректно завершайте зависшие внешние процессы.
- Отдельно отмечайте документы, обработанные с отключёнными шрифтами или изображениями.
Запуск в Windows
В рабочей папке должны находиться скрипт pdfsizeopt.single и комплект исполняемых зависимостей. Команда запускается из этой папки, чтобы поиск Ghostscript, sam2p, pngout и jbig2 не зависел от глобального PATH. Для первого теста скопируйте небольшой PDF с простым латинским именем, откройте командную строку в каталоге и задайте два явных пути. После успеха переходите к документам с более сложной структурой.
Архив бинарных программ не следует воспринимать как мастер установки с ярлыками. Его распаковывают в отдельный каталог, а скрипт размещают рядом. Это объясняет минус про сложную установку: пользователь сам собирает комплект из официальных файлов и работает с консолью. Не заменяйте архив случайной portable-сборкой стороннего автора — в ней невозможно проверить состав и соответствие документации.
При сообщении, что команда или зависимость не найдена, проверьте текущий каталог, расширение файла и результат распаковки. Проводник может скрывать расширения, из-за чего pdfsizeopt.single сохраняется под неверным именем. Если путь содержит национальные символы, перенесите комплект и тестовый PDF в короткий ASCII-каталог. Кавычки обязательны для пробелов, но не исправляют проблему несовместимой кодировки старого инструмента.

Запуск в Linux, macOS и контейнере
Для Linux и macOS используются платформенные наборы вспомогательных программ и тот же основной скрипт. После распаковки проверьте право выполнения, архитектуру процессора и доступность команды из рабочего каталога. На системах с другой архитектурой бинарник может не запуститься даже при правильных правах. В macOS на Apple Silicon совместимость достигается через слой запуска x86_64-программ, поэтому перед пакетной работой следует проверить небольшой файл и фактическое время.
Самостоятельная сборка зависимостей сложнее, чем обычная установка пакета. Основной код рассчитан на Python 2.4–2.7 и не работает под Python 3 без портирования; для универсального Unix в документации также указывается совместимая версия Ghostscript и другие старые инструменты. Этот факт важен именно как условие запуска из исходников. Готовые платформенные наборы уменьшают число ручных шагов, но всё равно требуют правильного размещения файлов.
Контейнер изолирует зависимости, однако добавляет накладные расходы. Смонтируйте каталог с исходником и результатом, назначьте его рабочим и убедитесь, что пользователь внутри контейнера может писать временные файлы. Не помещайте секретные документы в случайный образ из публичного реестра: используйте проверенный Dockerfile и контролируемые бинарники. После завершения проверьте владельца выходного файла на хосте.

Диагностика внешних программ
do-require-image-optimizers=yes проверяет наличие необходимых оптимизаторов до чтения исходного PDF. Это экономит время: отсутствие pngout или jbig2 обнаруживается сразу, а не после разбора большого документа. Если вы намеренно задали сокращённый список, согласуйте проверку с ним. Сообщение об отсутствующей программе не означает повреждение PDF; оно относится к окружению и решается установкой правильного файла либо исключением необязательного оптимизатора.
do-debug-image-optimizers выводит шаблоны команд. Сверьте путь к исполняемому файлу, кавычки, подстановку временного имени и перенаправление вывода. Особенно внимательно относитесь к jbig2, который может писать поток в стандартный вывод. Ошибка перенаправления создаёт пустой кандидат и приводит к дальнейшему сбою. Диагностический режим полезен до чтения входа, поэтому его удобно запускать на маленьком тестовом файле.
Уровень подробности задаётся параметром v. Низкий уровень показывает основные этапы, высокий — больше внутренней информации. quiet соответствует ограниченному выводу и подходит только для стабильной автоматизации, где журнал всё равно фиксирует код возврата. При расследовании не используйте quiet: он скрывает контекст, необходимый для понимания, какой объект, фильтр или внешний процесс вызвал ошибку.
Типичные ошибки и порядок действий
Файл зашифрован
Сообщение о зашифрованном PDF означает, что оптимизатор не может безопасно получить обычные потоки и объекты. Откройте документ разрешённым инструментом, создайте незашифрованную копию в соответствии с правами владельца и проверьте её. Простое переименование или печать в PDF может удалить интерактивность и изменить качество, поэтому лучше использовать контролируемое снятие защиты с известным паролем, а не виртуальный принтер.
Повреждена таблица ссылок или корневой объект
Ошибки xref, trailer или Root относятся к структуре. Сначала попробуйте открыть и пересохранить документ надёжным восстановителем, затем запустите проверку синтаксиса. Не заставляйте pdfsizeopt продолжать на неизвестном графе: удаление якобы недостижимых объектов в повреждённом файле может исключить реально нужное содержимое. Сохраняйте исходник и журнал для анализа.
Неизвестный или некорректный фильтр
Поток PDF может иметь цепочку фильтров и параметры DecodeParms. Если комбинация не поддерживается или расходится с фактическими данными, декодирование прекращается. Определите номер объекта по журналу, извлеките его и проверьте специализированным парсером. Иногда исправление выполняется пересохранением в другом редакторе. Отключение оптимизации изображений помогает только тогда, когда проблемный поток является изображением; для обычного потока потребуется структурное исправление.
Сбой оптимизатора изображения
Сначала запустите с use-pngout=no: медленный инструмент часто является отдельным источником проблем. Затем задайте явный список из sam2p и необходимых программ. Если сбой остаётся, используйте do-optimize-images=no и убедитесь, что остальные проходы завершаются. Такой результат можно использовать, если он проходит проверку, но в журнале проекта отметьте, что растровые потоки не оптимизированы.

Выходной файл занят
Просмотрщик, индексатор или синхронизация могут удерживать файл. Выберите новое имя, закройте открытые экземпляры и повторите запуск. В пакетном задании сначала пишите во временное имя в том же файловом разделе, затем после проверки выполняйте атомарное переименование. Это снижает вероятность того, что другой процесс увидит частично записанный PDF.
Не хватает места
Сравнение нескольких вариантов изображения требует временного пространства больше размера исходника. Освободите диск, задайте tmp-dir на подходящем томе и повторите. Не направляйте временные данные в сетевую папку без необходимости: сбой соединения оставляет неполные кандидаты. После аварии удалите psotmp-файлы, но сначала сохраните журнал и проверьте, нет ли среди них полезного диагностического объекта.
Почему размер иногда почти не меняется
Небольшой выигрыш закономерен для PDF, где основной объём занимают уже оптимизированные JPEG-фотографии. Без изменения качества нельзя гарантировать существенное уменьшение такого потока. Служебные объекты и таблица ссылок составляют малую долю, поэтому даже идеальная их упаковка меняет общий размер лишь на проценты. Режим stats подтверждает эту причину лучше, чем повторный запуск с теми же параметрами.
Другой случай — файл уже прошёл через качественный оптимизатор. Повторное сжатие Deflate не обязано находить новую экономию, а дубликаты могли быть удалены ранее. Не стоит включать отладочную декомпрессию или случайные внешние программы ради любой ценой меньшего результата. Сравните время, размер и риск совместимости. Иногда правильное решение — оставить исходный PDF.
Большой документ может содержать вложения, мультимедиа или необычные потоки, которые не затрагиваются выбранными проходами. Если они нужны, удалять их нельзя. Если не нужны, их следует убрать осознанно в редакторе до оптимизации. pdfsizeopt не является интерактивным инспектором содержимого и не принимает редакторское решение, какие вложения допустимо удалить.
Проверка готового PDF
Успешный код возврата означает, что программа завершила свои операции, но не заменяет приёмочное тестирование. Сравните количество страниц, геометрию MediaBox и CropBox, ориентацию, метаданные, закладки, аннотации и формы. Откройте первую, среднюю и последнюю страницы, затем контрольные страницы со сложными объектами. Быстрый просмотр миниатюр не обнаруживает заменённый глиф или неработающую ссылку.
Для визуального сравнения отрисуйте обе версии одним и тем же движком в изображения одинакового разрешения и вычислите различия. Любое отличие требует интерпретации: метка времени или сглаживание может дать пиксельный шум, но исчезнувшая линия или символ — реальная проблема. Для критичных материалов повторите сравнение вторым движком, поскольку один просмотрщик может одинаково ошибочно интерпретировать оба файла.
Структурная проверка должна читать все объекты и переходить по всем страницам. Дополнительно извлеките текст, посчитайте страницы и протестируйте ссылки. Для форм отправьте тестовые значения, если документ допускает ввод, и убедитесь, что поля не превратились в статическую графику. Для электронной подписи учитывайте, что любая перезапись PDF обычно нарушает криптографическую подпись; оптимизацию выполняют до подписания, а не после.

Контрольные суммы и хранение
Запишите SHA-256 исходника и результата вместе с командой. Контрольная сумма не подтверждает визуальную корректность, но однозначно связывает отчёт с конкретными файлами. Если документ передаётся между системами, повторное вычисление показывает, что байты не изменились. Храните исходный мастер отдельно, потому что будущая задача может требовать другого профиля, совместимости или повторной подписи.
Итоговую копию не называйте просто final без контекста. Укажите базовое имя, профиль и при необходимости дату сборки, а в метаданных проекта сохраните полную команду. Для сайта можно публиковать короткое стабильное имя, но внутренний архив должен позволять восстановить происхождение. Это особенно важно, когда часть документов прошла с отключённой оптимизацией шрифтов или изображений.
Безопасность обработки недоверенных PDF
PDF и внешние декодеры работают со сложными бинарными форматами. Обрабатывайте недоверенные файлы под отдельным пользователем, без административных прав и доступа к секретным каталогам. Контейнер или виртуальная машина ограничивают последствия уязвимости, но только при корректных настройках: не монтируйте весь домашний каталог и не передавайте сокет управления контейнерами. Рабочая папка должна содержать минимум необходимых данных.
Шаблон собственного image optimizer выполняется через системную оболочку, поэтому недоверенные имена и строки нельзя включать без экранирования. Используйте фиксированную команду, контролируемый путь и автоматически созданные временные имена. Не загружайте оптимизатор из неизвестного зеркала. Официальный архив на GitHub предпочтительнее каталогов, которые оборачивают файл рекламным установщиком.
Ограничивайте процесс по времени, памяти и диску. Специально сформированный PDF способен создать чрезмерную нагрузку при декомпрессии или породить множество объектов. После остановки не доверяйте частично записанному выходу. Удалите его, сохраните журнал, проверьте временную папку и повторяйте только в изолированной среде с более строгими лимитами.
Профили настроек
Стандартный профиль
Стандартный профиль — команда без дополнительных флагов, явные имена входа и выхода, отдельный временный каталог при больших документах. Он включает изображения, шрифты, объекты, потоки, xref stream и object stream. Такой запуск даёт базовую точку, с которой сравнивают любые изменения. Не начинайте с десятка отключений, иначе не узнаете, какие возможности работали на вашем PDF.
Быстрый профиль
Для ежедневной сборки сначала отключите только pngout. Если сканы двухцветные, включите быстрый режим bilevel. Остальные оптимизаторы оставьте. Измерьте время на репрезентативном наборе, а не на одном маленьком файле. Быстрый профиль должен завершаться предсказуемо и давать размер, достаточный для внутреннего обмена; финальную публикацию можно прогонять расширенным профилем.
Осторожный профиль для проблемных шрифтов
Сохраните объектные, потоковые и графические проходы, но отключите объединение и регенерацию шрифтов. Полное do-optimize-fonts=no используйте только после повторной ошибки. В отчёте укажите причину и контрольные страницы. Такой профиль не универсально лучше: он уменьшает риск для конкретного нестандартного шрифта ценой потенциально большего результата.
Профиль без изображений
do-optimize-images=no нужен для диагностики повреждённого XObject, отсутствующей зависимости или жёсткого лимита времени. Он полезен и для PDF, где stats показывает почти нулевую долю графики. Не применяйте его автоматически к сканам: тогда основной объём останется без обработки. После успешного обхода попробуйте вернуть изображения с укороченным списком оптимизаторов, чтобы локализовать проблему точнее.
Профиль совместимости
Если старый просмотрщик не понимает результат, последовательно отключайте object stream, xref stream и объединение страниц. Меняйте один параметр за запуск. Совместимый профиль определяется целевым устройством, а не возрастом файла. Обязательно проверяйте печать, переход к произвольной странице и поиск: устройство может открыть титульный лист, но ошибиться при обращении к объекту из середины.
Сравнение pdfsizeopt с аналогами
| Программа | Лучше подходит для | Главное ограничение |
|---|---|---|
| pdfsizeopt | Воспроизводимой оптимизации структуры, шрифтов и изображений без намеренного снижения качества | Командная строка и сложный набор зависимостей |
| PDF Commander | Ручного сжатия, просмотра и редактирования PDF в понятном графическом интерфейсе | Меньше возможностей для детальной пакетной настройки внутренних потоков |
| Ghostscript | Пересоздания PDF с контролем разрешения, качества и совместимости | Может переинтерпретировать содержимое и изменить представление |
| qpdf | Ремонта структуры, линейзации, шифрования и безопасной перепаковки объектов | Не специализируется на глубокой оптимизации изображений и шрифтов |
| pikepdf | Программируемых процессов на Python поверх возможностей qpdf | Требует написания кода и самостоятельного выбора преобразований |
pdfsizeopt выбирают, когда важны повторяемая команда, сохранение визуального представления и специализированная работа с TeX-шрифтами и растровыми потоками. PDF Commander удобнее пользователю, которому нужно вручную открыть документ, увидеть результат и одновременно отредактировать страницы. Ghostscript подходит, если допустимо управляемое пересоздание с даунсемплингом или изменением качества. qpdf рационален для исправления структуры и линейзации, а pikepdf — для разработчика, который строит собственный конвейер и готов описать правила кодом.
Когда лучше выбрать другой инструмент
Если главная причина объёма — фотографии с чрезмерным разрешением, а допустима потеря деталей, нужен инструмент с явным даунсемплингом и настройкой JPEG. pdfsizeopt сознательно не превращает такую задачу в ползунок качества. Сначала определите целевое разрешение и требования печати, создайте новый PDF контролируемым способом, затем при необходимости выполните финальную структурную оптимизацию.
Если требуется удалить страницы, обрезать поля, отредактировать текст, скрыть данные, объединить файлы или увидеть результат до сохранения, используйте полноценный редактор. Командные флаги pdfsizeopt не заменяют эти операции. Оптимизатор предполагает, что содержимое уже утверждено и нужно упаковать его компактнее. Редактирование после оптимизации часто снова раздувает структуру, поэтому правильный порядок — правки, проверка, оптимизация, подпись и публикация.
Если нужен только ремонт повреждённой таблицы ссылок или линейзация для быстрой загрузки по сети, qpdf может быть проще и предсказуемее. Если создаётся PDF/A, выполняется цветовая конверсия или меняется совместимость, выбирайте специализированный конвертер и валидатор. Размер — лишь один критерий; формат архива, подписи, доступность и требования типографии могут быть важнее нескольких процентов экономии.
Ответы на практические вопросы
Можно ли обрабатывать PDF с формами и ссылками?
Цель программы — сохранить интерактивные элементы, но конкретный результат необходимо тестировать. Заполните поля, проверьте действия кнопок, внешние и внутренние ссылки, закладки и аннотации. Оптимизацию выполняйте до цифровой подписи. Если документ использует нестандартный JavaScript или редкую форму XFA, включите его в отдельный контрольный набор и не полагайтесь на обычное открытие страниц.
Можно ли гарантировать меньший файл?
Нет. Для каждого безопасного преобразования есть локальный выбор, однако весь документ может почти не измениться, а отдельные накладные расходы способны компенсировать небольшую экономию. Уже оптимизированные JPEG и компактная структура оставляют мало резерва. Решение принимают по измерению, а не по обещанию. Если результат больше или выигрыш не оправдывает время, сохраняйте исходник.
Почему обработка одного скана длится очень долго?
Каждая страница может запускать несколько внешних алгоритмов, включая медленный pngout. Отключите его, затем оцените do-fast-bilevel-images для двухцветных страниц. Проверьте локальный диск и временную папку. Если скорость всё ещё неприемлема, сравните профиль без оптимизации изображений, но помните, что для скана он, скорее всего, оставит основную часть объёма.
Как понять, что проблема в шрифтах?
Журнал обычно указывает этап разбора или регенерации. Повторите запуск без объединения и регенерации, затем при необходимости без всей оптимизации шрифтов. Если документ проходит, локализация подтверждена. После этого особенно тщательно проверяйте глифы и извлечение текста. Не считайте исчезновение ошибки достаточным доказательством корректности.
Нужно ли оставлять Multivalent?
use-multivalent по умолчанию выключен. Внешний Multivalent.jar трудно получить из надёжного источника, а в документации отмечены проблемы с изображениями, поэтому строить основной профиль на нём не следует. Если проверенная копия уже есть в контролируемой среде, запускайте отдельный эксперимент, используйте защиту изображений и сравнивайте результат. Не подменяйте отсутствующий компонент неизвестным файлом из случайного архива.
Можно ли запускать несколько файлов одновременно?
Да, через внешний скрипт, но число процессов ограничивают по CPU, памяти и диску. Каждый экземпляр должен иметь собственное выходное имя и желательно отдельный временный каталог. Логи не смешивают. На первом этапе используйте последовательную очередь; параллелизм добавляйте только после измерения и проверки, что внешние оптимизаторы не используют общие фиксированные имена.
Что делать с временными файлами после сбоя?
Сохраните журнал, завершите оставшиеся процессы, проверьте, что другой запуск не использует папку, и удалите psotmp-объекты. Не открывайте случайный промежуточный поток как готовый PDF. Если сбой повторяется, имя временного файла и номер объекта помогут локализовать изображение или шрифт; тогда перенесите тест в изолированный каталог и включите подробный вывод.
Рабочая методика для стабильного результата
Сформируйте небольшой, но разнообразный набор PDF из реальной работы: TeX-отчёт, скан, презентацию, документ с формами, файл со сложными шрифтами и уже оптимизированный PDF. Для каждого храните ожидаемые свойства и контрольные страницы. Прогоняйте новый профиль на всём наборе. Один успешный файл не доказывает совместимость, а один проблемный не требует отключать функцию для остальных классов.
Автоматический этап должен проверять код возврата, наличие результата, число страниц, возможность полного чтения и хотя бы базовое извлечение текста. Визуальный этап выполняют для контрольных страниц. Размер и время заносятся в таблицу. Порог уменьшения не должен быть единственным условием: выход на сорок процентов меньше, но с испорченным символом, является отказом; выход на два процента меньше и полностью корректный может быть полезен при массовом архиве.
После выбора профиля зафиксируйте комплект зависимостей, контрольные суммы архивов и скрипта, команду и особенности среды. Не обновляйте один внешний оптимизатор незаметно: даже при том же интерфейсе изменится выбор кандидатов и время. Сначала повторите контрольный набор, затем переводите обновлённое окружение в рабочий процесс. Такая дисциплина важнее попытки найти один универсальный флаг для всех документов.
Как программа выбирает вариант изображения
Внутренний конвейер не ограничивается передачей картинки одному архиватору. Из исходного XObject сохраняются геометрия и параметры, необходимые для точного отображения, после чего создаются кандидаты с разными сочетаниями цветового пространства, глубины и фильтра. Для PNG-подобного варианта данные отделяются от контейнера и возвращаются в PDF как поток FlateDecode с соответствующими DecodeParms. Такой подход убирает лишние оболочки, но сохраняет согласованность словаря и закодированных байтов.
До преобразования проверяются условия безопасности. Поддерживаются обычные DeviceRGB, DeviceGray и индексированные варианты на их основе; сложные пространства, непустые маски и глубина выше восьми бит могут оставить объект без изменения. Ограничение предотвращает тихую подмену цвета или прозрачности. Если документ рассчитан на типографский CMYK-процесс, отсутствие оптимизации конкретного изображения лучше, чем автоматическое преобразование в RGB без профиля и контроля цветопередачи.
После создания кандидата ширина и высота сверяются с исходным объектом. При изменении битности обновляются ColorSpace, BitsPerComponent, DecodeParms и фильтр. Вариант принимается только как согласованный набор; нельзя взять меньшие байты и оставить старый словарь. Затем сравнивается полный размер PDF-объекта, а не только сырой поток, потому что палитра и дополнительные параметры тоже занимают место. Для маленьких изображений накладные данные могут сделать сложный вариант невыгодным.
Одинаковые изображения и палитры дают отдельный резерв. Если потоки совпадают, ссылки могут быть сведены к одному объекту, но визуальное сходство недостаточно: два снимка с одинаковым видом после масштабирования могут иметь разные пиксели или цветовые параметры. Программа не выполняет приблизительный поиск и не решает, допустима ли замена. Это сохраняет точность, хотя оставляет дубликаты, различающиеся хотя бы одним байтом декодированного содержимого.
Фильтры PDF и причины отказа от перекодирования
Фильтр в PDF описывает способ получения исходных данных из потока. FlateDecode является обратимым и хорошо подходит для повторной упаковки. DCTDecode обычно содержит JPEG, а JPXDecode — JPEG 2000; полное декодирование и последующее кодирование не гарантируют те же пиксели и служебные параметры. Поэтому сохранение качества требует осторожности. ASCIIHexDecode и ASCII85Decode являются транспортными оболочками и могут быть устранены, если внутренняя цепочка корректно разобрана.
DecodeParms влияют на восстановление строк и компонентов. Предиктор может хранить разности между соседними пикселями, благодаря чему Deflate получает больше повторов. Ошибка в Colors, BitsPerComponent или Columns делает поток формально декодируемым, но визуально неверным. Оптимизатор должен обновлять эти поля вместе с содержимым. При диагностике неизвестного фильтра полезно смотреть всю цепочку, а не только последнее имя: проблема может возникнуть на комбинации двух последовательных декодеров.
Поток с ImageMask имеет особую семантику: его единицы и нули управляют нанесением текущего цвета, а не задают обычную серую картинку. Простое преобразование в DeviceGray изменит поведение. Аналогично словарь Mask может задавать прозрачный диапазон. Поэтому сложные маски часто остаются в исходном виде. Для пользователя это означает, что файл со множеством вырезанных изображений может сжаться слабее, но риск белых прямоугольников и утраченной прозрачности ниже.
Совместимость с просмотрщиками и печатными системами
Формально корректный PDF может встретить ограниченный интерпретатор в старом принтере, терминале или промышленной системе. Наиболее заметные различия связаны с xref stream, object stream и повторным использованием объектов Page. Современный настольный просмотрщик обычно принимает их, но целевая среда должна входить в тест. Если файл готовится для типографии, запросите технический профиль и проверьте пробный вывод до массовой отправки.
Профиль совместимости строят минимальными изменениями. Сначала создают стандартный результат. При сбое отключают object stream и повторяют тест; затем xref stream; затем объединение страниц. Если проблема исчезла, последний параметр считается причиной, а остальные оптимизации возвращают. Одновременное отключение трёх механизмов даёт рабочий файл, но лишает возможности установить точное ограничение и может неоправданно увеличить размер.
Печать проверяет больше, чем экран. Драйвер может иначе обрабатывать прозрачность, встроенные шрифты и большие изображения. Напечатайте страницу с мелким текстом, векторной сеткой, полупрозрачными объектами и цветным фоном. Для аппаратного RIP полезно отправить тестовый файл тем же каналом, который будет использоваться в производстве. Успех при печати из другого приложения не подтверждает совместимость всей цепочки.
Линейзация для быстрого показа первой страницы не является основной задачей pdfsizeopt. Если веб-сервер и просмотрщик требуют Fast Web View, после оптимизации примените инструмент, который явно создаёт линейный PDF, и снова проверьте размер и структуру. Порядок важен: последующая полная перезапись может разрушить линейзацию, поэтому её выполняют последним структурным шагом перед публикацией.
Методика сравнения профилей
Сравнивать команды следует на неизменном исходнике и в одинаковом окружении. Кэш диска, параллельная нагрузка и антивирус могут исказить время, поэтому проведите несколько запусков и используйте медиану. Для каждого профиля фиксируйте размер, длительность, максимальный объём временной папки, код возврата и результат проверок. Один параметр меняется за эксперимент; иначе нельзя связать разницу с конкретной функцией.
Относительное уменьшение рассчитывают от исходного размера, но при принятии решения учитывают абсолютные байты. Экономия пяти процентов на гигабайтном архиве значительна, а на двухсоткилобайтном документе может не оправдать сложность. Для веб-публикации измерьте также время передачи и открытия первой страницы. Для внутреннего архива важнее суммарная экономия по тысячам файлов и воспроизводимость процесса.
Нельзя сравнивать pdfsizeopt с профилем Ghostscript, который снижает разрешение и качество, только по размеру. Это разные условия. Сначала определите ограничения: допускается ли изменение пикселей, необходимо ли сохранить формы и ссылки, нужен ли точный шрифтовый текст. Затем сравнивайте решения внутри одной категории. Если потери допустимы, укажите целевое качество; если нет, сравнивайте только обратимые и структурные операции.
- Профиль A: стандартные параметры и полный контроль результата.
- Профиль B: pngout отключён для оценки ускорения.
- Профиль C: сокращённый список оптимизаторов изображений.
- Профиль D: осторожная обработка проблемных шрифтов.
- Профиль E: параметры совместимости для конкретного устройства.
Автоматические критерии приёмки
В производственном конвейере недостаточно проверить, что выход существует. Минимальный набор включает ненулевой код возврата при ошибке, размер больше нуля, возможность полного разбора, совпадение числа страниц и отсутствие неожиданных изменений размеров страниц. Для документа с текстом сравнивается объём извлечённого текста или контрольные фрагменты. Для ссылок и форм нужен отдельный тест, потому что обычный парсер страниц может не проверить аннотации.
Порог размера задавайте как предупреждение, а не как единственный запрет. Выход больше исходника можно автоматически отклонить и оставить исходный файл. Слишком сильное уменьшение также подозрительно: если стомегабайтный скан внезапно стал несколькими килобайтами, вероятна потеря страниц или изображений. Диапазон ожиданий зависит от класса документа, поэтому сканы, TeX-отчёты и формы должны иметь разные правила.
Визуальный тест можно автоматизировать рендерингом выбранных страниц. Сравниваются изображения одной геометрии и разрешения, после чего превышение порога различий отправляет файл на ручную проверку. Порог нельзя делать нулевым: разные структуры и порядок вычислений могут дать незначительные отличия сглаживания. Одновременно анализируйте карту различий, чтобы отделить шум по краям символов от исчезнувшего объекта.
Сохраняйте отчёт в машиночитаемом виде: контрольные суммы, команду, версии зависимостей, длительность, исходный и итоговый размеры, результаты парсера и список проверенных страниц. Это позволяет воспроизвести решение после обновления окружения. Сам PDF не должен содержать редакторские метки о профиле; данные относятся к журналу обработки, а не к публикуемому документу.
Работа с цифровыми подписями, формами и метаданными
Криптографическая подпись защищает определённый диапазон байтов. Любая полноценная оптимизация перезаписывает структуру и делает существующую подпись недействительной, даже если страницы визуально совпадают. Правильная последовательность: подготовить содержимое, оптимизировать, проверить, затем подписать. Уже подписанный экземпляр сохраняют неизменным; для нового компактного выпуска создают отдельную неподписанную копию и получают новую подпись.
Интерактивные формы состоят из словарей полей, виджетов, внешнего вида и иногда сценариев. Удаление недостижимых объектов безопасно только при корректных ссылках. После обработки проверьте пустые и заполненные состояния, переключатели, выпадающие списки, вычисляемые поля и сохранение введённых данных. Если форма отправляет данные, тест выполняют в изолированной среде или на тестовом адресе, чтобы не отправить реальную заявку.
Метаданные могут находиться в Info, XMP-потоке и пользовательских словарях. Оптимизация размера не должна использоваться как средство удаления персональных данных. Если требуется очистка, выполните её специализированным редактором, проверьте вложения, комментарии и скрытые слои, затем запускайте уменьшение. Отсутствие строки в видимом тексте не доказывает, что она удалена из всех объектов.
Закладки и аннотации проверяются переходами, а не только наличием словаря. Внутренняя ссылка может ссылаться на именованное назначение или явный массив с номером страницы и координатой. Объединение и перенумерация объектов должны сохранить смысл, но тестовая навигация остаётся обязательной. Для длинного руководства проверьте несколько закладок из начала, середины и конца дерева.
Доступность и извлечение текста
Визуальная идентичность не гарантирует доступность. Программа чтения с экрана использует структуру тегов, порядок содержимого и таблицы сопоставления символов. После оптимизации проверьте, что текст извлекается в ожидаемом порядке, заголовки и альтернативные описания не исчезли, а поиск находит слова с диакритикой. Особое внимание требуется документам со шрифтами без корректного ToUnicode.
Объединение шрифтов может сохранить контуры, но ошибка кодовой карты проявится при копировании: на экране символ выглядит правильно, а в буфер попадает другой код. Контроль включает копирование нескольких фрагментов, автоматическое извлечение и сравнение редких символов. Для многоязычного документа выбирайте фрагменты каждого алфавита. Если проблема связана с шрифтовым проходом, используйте осторожный профиль и сохраните доказательство проверки.
Тегированный PDF может содержать логическую структуру, не совпадающую с порядком графических команд. Удаление только действительно недостижимых объектов не должно её разрушать, но повреждённые исходные ссылки создают риск. Запустите валидатор доступности до и после, сравните количество ошибок и вручную пройдите документ с клавиатуры. Оптимизация не исправляет отсутствующие теги; доступность должна быть создана на этапе авторинга.
Публикация и долгосрочное хранение
Для сайта храните мастер и публикуемую копию отдельно. Мастер нужен для повторной оптимизации, изменения профиля и восстановления метаданных. Публикуемая копия должна иметь стабильное имя, правильный MIME-тип и заголовок Content-Length. После загрузки скачайте файл обратно и сравните SHA-256: прокси, CMS или антивирусный шлюз не должны незаметно изменить содержимое.
Для архива определите, требуется ли PDF/A. Уменьшение размера само по себе не подтверждает соответствие архивному стандарту. После pdfsizeopt запустите профильный валидатор; если он обнаружил проблему, выясните, была ли она в исходнике или появилась после перезаписи. Не добавляйте произвольный идентификатор PDF/A без реальной проверки. Архивная пригодность включает шрифты, цветовые профили, метаданные и запрет определённых интерактивных функций.
При массовом хранении экономию оценивают на всём корпусе. Сохраните распределение процентов уменьшения, число отказов, число документов с обходными профилями и суммарное время. Если большинство уже компактно, постоянный запуск может расходовать больше ресурсов, чем экономит. Тогда применяйте предварительный фильтр по размеру, типу источника или статистике объектов, а маленькие файлы оставляйте без изменения.
Политика хранения должна отвечать, когда удаляются временные данные и как долго остаются журналы. Временные изображения могут содержать конфиденциальные страницы в декодированном виде. Используйте защищённый каталог, ограниченные права и гарантированное удаление после успешного или аварийного завершения. Для особо чувствительных материалов выполняйте работу на зашифрованном томе и не переносите временную папку в облачную синхронизацию.
Итоговый порядок действий
- Скопируйте исходный PDF в короткий рабочий путь и сохраните контрольную сумму.
- Проверьте открытие, число страниц, ссылки, формы и несколько сложных фрагментов.
- Запустите stats, если нужно понять распределение объёма.
- Выполните стандартную оптимизацию с отдельным именем результата.
- При медленной работе сначала отключите pngout, не выключая весь этап изображений.
- При ошибке локализуйте класс: шрифты, изображения, структура, зависимость или файловая система.
- Меняйте по одному параметру и сохраняйте команду каждого эксперимента.
- Проверьте готовый PDF структурно, визуально и функционально.
- Сравните размер и время, затем выберите профиль по реальной пользе.
- Архивируйте исходник, результат, журнал, контрольные суммы и точный набор параметров.
pdfsizeopt наиболее полезен как финальный технический проход после завершения редактирования. Он не принимает решения за автора, не снижает разрешение по скрытому профилю и не заменяет просмотр результата. Сильная сторона программы раскрывается в контролируемом конвейере: пользователь понимает, какие классы объектов занимают место, выбирает допустимые преобразования, сохраняет воспроизводимую команду и подтверждает корректность независимыми проверками. При таком подходе уменьшение размера становится измеряемой операцией, а не случайным экспортом с непонятными последствиями.