Coherent PDF Command Line Tools

Coherent PDF Command Line Tools позволяет собирать и разбирать PDF, выбирать страницы по диапазонам, менять геометрию листов, шифровать документы, ставить водяные знаки и нумерацию, работать с закладками, аннотациями, вложениями, изображениями и метаданными. Основной инструмент — команда cpdf: пользователь задаёт входной файл, операцию, страницы и имя результата, а сложные цепочки объединяет оператором AND или выносит в файл аргументов.

Рабочая схема строится вокруг явного результата: cpdf не меняет исходник незаметно, а читает один или несколько документов и записывает новый PDF через параметр -o. Перед обработкой можно ограничить диапазон страниц, передать пароль входного файла, выбрать единицы измерения и проверить служебные данные. Такой порядок удобен для сценариев, где один и тот же набор действий должен повторяться для десятков или тысяч документов без ручного открытия каждого файла.

Вместо окон, панелей и диалогов здесь используются короткие операции: -merge, -split, -rotate, -encrypt, -add-text, -list-bookmarks и другие. Это даёт точный контроль и хорошо подходит для пакетных заданий, но требует внимательно относиться к кавычкам, путям, порядку параметров и различиям командной оболочки. Ниже разобраны реальные команды, ограничения и способы проверки результата.

Скачать Coherent PDF Command Line Tools

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
Coherent PDF Command Line Tools
Оценка 8.5
  • Нет графического интерфейса
  • Команды только на английском
  • AGPL требует раскрытия кода
Скачать Coherent PDF Command Line Tools
Загрузка начнётся после нажатия

Как устроена команда cpdf

Базовая команда состоит из имени утилиты, входного PDF, необязательного диапазона страниц, операции и выходного файла. Например, запись cpdf in.pdf 1-3,6 -o out.pdf берёт первую, вторую, третью и шестую страницы и создаёт из них новый документ. Если операция не указана, выбор страниц фактически работает как извлечение. На Windows исполняемый файл вызывается как cpdf.exe, но синтаксис параметров остаётся тем же.

cpdf in.pdf 1-3,6 -o out.pdf
cpdf in.pdf even -o even-pages.pdf
cpdf in.pdf odd -o odd-pages.pdf

Порядок аргументов важен. Имя входного файла обычно ставят рядом с диапазоном, а -o отделяет имя результата. Если путь содержит пробелы, его заключают в кавычки. Для проверки установки используется cpdf -version; для просмотра доступных операций — запуск без полноценной команды или справочный вывод. В сценариях автоматизации полезно сначала выполнить команду на копии небольшого файла и убедиться, что число страниц, ориентация и закладки сохранились ожидаемым образом.

Справочный список операций cpdf в командной строке

Входные диапазоны

Диапазоны принимают отдельные номера, интервалы через дефис и объединения через запятую. Ключевые слова odd и even выбирают нечётные и чётные листы. В выражениях можно обращаться к концу документа, поэтому диапазон вроде 2-end означает все страницы, начиная со второй. Это особенно полезно при удалении обложки, извлечении приложений или формировании нового комплекта из нескольких исходников.

Диапазон относится к ближайшему входному файлу. В команде объединения можно взять первую страницу из одного PDF и все страницы, кроме первой, из другого: cpdf -merge a.pdf 1 b.pdf 2-end -o result.pdf. Такая запись исключает промежуточные файлы и снижает риск перепутать порядок листов.

Объединение, чередование и разбиение PDF

Для обычного объединения перечисляют документы в нужной последовательности: cpdf -merge first.pdf second.pdf third.pdf -o combined.pdf. Закладки исходных файлов можно сохранить, а при необходимости добавить к результату закладки верхнего уровня, обозначающие границы присоединённых документов. Опция коллации нужна, когда страницы следует не дописать блоками, а чередовать: первая страница первого файла, первая страница второго, затем вторые страницы и так далее. Такой режим удобен для совмещения лицевых и оборотных сканов.

cpdf -merge front.pdf back.pdf -collate -o scans.pdf
cpdf -merge chapter1.pdf chapter2.pdf -merge-add-bookmarks -o book.pdf

Разбиение по фиксированному числу листов выполняется через -split и -chunk. Шаблон имени содержит знаки процента; число знаков задаёт ширину номера. Команда ниже создаёт файлы Chunk001.pdf, Chunk002.pdf и далее, по десять страниц в каждом:

cpdf -split in.pdf -o Chunk%%%.pdf -chunk 10

Для документов с корректной структурой удобнее -split-bookmarks. Уровень определяет, по каким закладкам начинать новый файл, а маркер @B в шаблоне имени подставляет текст закладки. При использовании не ASCII-символов добавляют -utf8. Перед массовым запуском стоит проверить названия: символы, запрещённые файловой системой, и повторяющиеся заголовки могут потребовать предварительного исправления закладок.

Операция -split-max делит документ так, чтобы части не превышали заданный размер. Это не равномерное распределение страниц: утилита оценивает фактический объём создаваемых PDF, поэтому часть с тяжёлыми изображениями может содержать меньше листов. Режим подходит для ограничений почтовых шлюзов и систем загрузки, однако итоговый размер следует перепроверить, поскольку служебные структуры и сжатие влияют на объём каждого фрагмента.

PDF-портфолио

Вместо последовательного слияния можно создать PDF-портфолио, где исходные документы хранятся как отдельные элементы контейнера. Такой результат зависит от возможностей просмотрщика: не каждый PDF-ридер одинаково показывает портфолио и вложенные файлы. Поэтому для обмена с неизвестным получателем безопаснее обычное объединение страниц, а портфолио использовать в контролируемой среде, где формат точно поддерживается.

Масштабирование, поворот, поля и рамки страницы

Геометрические операции разделяют размер самой страницы и положение её содержимого. -scale-page масштабирует лист вместе с содержимым, а -scale-to-fit вписывает исходную страницу в заданный формат. Для печатных заданий это принципиально: изменение MediaBox без пересчёта содержимого может обрезать объекты, а простое уменьшение контента оставит исходный размер бумаги.

cpdf -scale-page "1.1 1.1" in.pdf -o enlarged.pdf
cpdf -scale-to-fit a4portrait in.pdf -o a4.pdf
cpdf -shift "20pt 0pt" in.pdf -o shifted.pdf

Сдвиг применяют для изменения внутренних полей, подготовки места под переплёт или компенсации смещения сканера. Единицы можно задавать в пунктах, миллиметрах, сантиметрах и дюймах; если единица пропущена, нужно учитывать значение по умолчанию из синтаксиса операции. Для двусторонней печати часто выполняют разные сдвиги для нечётных и чётных страниц отдельными командами или цепочкой AND.

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

cpdf -rotate 90 in.pdf 2,4,6 -o rotated.pdf
cpdf -rotate-contents 90 in.pdf -o content-rotated.pdf
cpdf -hflip in.pdf -o mirrored.pdf

Отдельные операции работают с MediaBox, CropBox, TrimBox, BleedBox и ArtBox. CropBox определяет видимую область в большинстве просмотрщиков, но не удаляет скрытое содержимое за границей. Это важно для конфиденциальных данных: кадрирование не является редактированием или физическим удалением объектов. Для предпечатной подготовки можно задавать рамки и добавлять метки реза, а для диагностики — визуализировать границы боксов.

Вывод сведений о PDF и его метаданных командой cpdf

Команда -page-info показывает размер страницы, метку, MediaBox, CropBox и другие параметры для каждого листа. Её вывод удобен для поиска смешанных форматов внутри одного файла. Если часть страниц имеет нестандартный CropBox, пакетное масштабирование может давать разный визуальный результат; в таком случае сначала выравнивают боксы, затем выполняют основную операцию.

Шифрование, пароли и разрешения

Утилита умеет читать защищённые документы при наличии пароля и создавать новые PDF с RC4 или AES. Для современных рабочих процессов предпочтительно 256-битное AES-шифрование. В команде задаются пользовательский пароль для открытия, пароль владельца для изменения ограничений и набор разрешений: печать, копирование, редактирование, добавление аннотаций и другие действия.

cpdf -encrypt AES256 ownerpass userpass in.pdf -o protected.pdf
cpdf -decrypt -pw userpass protected.pdf -o open.pdf

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

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

При разбиении можно сразу шифровать создаваемые части. Такой подход уменьшает число проходов по документу и исключает появление незашифрованных промежуточных файлов. После выполнения рекомендуется открыть несколько частей обычным просмотрщиком, проверить оба пароля и убедиться, что разрешения соответствуют политике передачи документов.

Сжатие и уменьшение размера

Команды -decompress и -compress управляют потоками PDF без изменения визуального содержимого. Декомпрессия полезна для анализа структуры и сравнения, но обычно увеличивает файл. Обычное сжатие применяет FlateDecode к подходящим потокам. Более глубокая операция -squeeze удаляет неиспользуемые объекты, объединяет повторяющиеся данные и перестраивает внутреннюю структуру.

cpdf -squeeze in.pdf -o compact.pdf
cpdf -compress in.pdf -o compressed.pdf
cpdf -decompress in.pdf -o readable-structure.pdf

Потеря качества при -squeeze не должна быть целью: это в первую очередь структурная оптимизация. Если большую часть объёма занимают фотографии, заметное уменьшение требует обработки изображений. Для этого служит -process-images с правилами преобразования JPEG, JPEG2000, монохромных и несжатых картинок. Выбор качества влияет на читаемость мелкого текста и схем, поэтому один коэффициент нельзя без проверки применять к архиву разнородных сканов.

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

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

Закладки и автоматическое оглавление

Закладки можно вывести в текстовом или JSON-представлении, удалить, добавить заново и использовать как основу оглавления. Вывод содержит уровень вложенности, текст, номер страницы и параметры назначения. JSON удобнее для программной правки, потому что сохраняет структуру и позволяет однозначно работать с Unicode.

cpdf -list-bookmarks-json in.pdf > bookmarks.json
cpdf -add-bookmarks bookmarks.json in.pdf -o with-bookmarks.pdf
cpdf -remove-bookmarks in.pdf -o no-bookmarks.pdf

При редактировании важно различать номер страницы и сложное назначение. Закладка может открывать не просто лист, а определённую область с масштабом Fit, FitH, XYZ и другими параметрами. Если заменить все назначения только номерами, навигация станет менее точной. Для обычных отчётов этого достаточно, но в технических руководствах лучше сохранить исходные координаты.

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

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

Водяные знаки, текст, даты и Bates-нумерация

Штампом может быть страница другого PDF, размещённая поверх или под содержимым. Для фоновой подложки используют вариант under, для видимого поверх документа — on. Входной штамп масштабируется и повторяется в соответствии с параметрами операции. Такой способ подходит для фирменных бланков, отметок Черновик и графических печатей.

cpdf -stamp-on stamp.pdf in.pdf -o stamped.pdf
cpdf -stamp-under background.pdf in.pdf -o with-background.pdf

Текстовый штамп задаётся через -add-text. Можно выбрать позицию, размер, шрифт, цвет, прозрачность, угол, межстрочный интервал и диапазон страниц. В строках поддерживаются специальные коды номера страницы, общего числа страниц, даты и времени. Для кириллицы и других символов, отсутствующих в стандартном WinAnsi, следует подключать TrueType-шрифт; иначе часть знаков может пропасть или замениться.

cpdf -add-text "Страница %Page из %EndPage" -font-size 10      -bottom 24pt in.pdf -o numbered.pdf

При размещении текста координаты отсчитываются в системе страницы, а существующий поворот может менять ожидаемое направление. Если подпись оказалась сбоку или за пределами видимой области, сначала смотрят Rotate и CropBox, затем уточняют позицию и выравнивание. Для одинакового отступа на листах разного размера лучше использовать привязки к краям, а не абсолютные координаты центра.

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

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

Вставка пустых страниц, наложение и разрезание листов

Команды -pad-before и -pad-after добавляют пустые листы перед или после выбранных страниц. Это используют для выравнивания глав на правую сторону, вставки оборотов и подготовки двусторонней печати. Если нужно привести документ к чётному количеству страниц, сначала получают число листов, затем добавляют один пустой в конец только при нечётном результате.

cpdf -pad-after in.pdf 1,3,4 -o padded.pdf
cpdf -impose-xy "2 1" in.pdf -o two-up.pdf
cpdf -chop "2 2" in.pdf -o quarters.pdf

Импозиция размещает несколько исходных страниц на одном листе. Параметр 2 1 создаёт две страницы в ряд; другие сетки применяют для раздаточных материалов и экономной печати. Перед операцией стоит привести листы к одному размеру и ориентации, иначе масштаб и поля будут отличаться. Для брошюрной раскладки необходимо учитывать порядок страниц, двустороннюю печать и способ переворота бумаги; простая сетка n-up не решает всю задачу автоматически.

-chop делит каждый лист на секции и превращает их в отдельные страницы. Это полезно, когда сканер сохранил разворот как один широкий кадр или когда на листе размещено несколько карточек. Граница разреза геометрическая: программа не распознаёт содержание и не выравнивает его по объектам, поэтому перекошенные сканы сначала следует исправить.

Редактирование закрывающим прямоугольником

Функция redaction удаляет или закрывает содержимое в заданных областях в соответствии с параметрами операции. Нельзя подменять её простым белым прямоугольником поверх текста: такой прямоугольник может оставить исходные объекты доступными для копирования или извлечения. После редактирования результат проверяют поиском текста, копированием, экспортом содержимого и просмотром структуры, особенно если документ содержит формы, аннотации или альтернативные представления.

Аннотации через JSON

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

cpdf -list-annotations-json in.pdf > annotations.json
cpdf -set-annotations annotations.json in.pdf -o restored.pdf
cpdf -remove-annotations in.pdf -o clean.pdf

Координаты аннотаций связаны с геометрией страниц. Если перенести JSON на документ с другим размером, поворотом или порядком страниц, пометки окажутся не там, где ожидалось. Надёжная схема включает проверку идентичности страниц, а при изменениях — пересчёт координат или сопоставление по устойчивым признакам.

Удаление аннотаций не обязательно удаляет нарисованное содержимое, если комментарии предварительно были сведены в поток страницы другим приложением. И наоборот, удалённая аннотация может оставить связанную запись в бизнес-системе. Поэтому перед очисткой нужно определить, требуется ли убрать только интерактивные объекты или также визуальные следы.

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

Метаданные, свойства окна и метки страниц

-info -utf8 выводит заголовок, автора, тему, ключевые слова, даты, версию PDF, сведения о шифровании и часть XMP. Ключ -raw отключает обычную обработку строк, а -utf8 сохраняет Unicode. Для аудита лучше хранить вывод до и после преобразования: это показывает, какие поля изменились вместе с содержимым.

Список шрифтов и страниц в выводе cpdf
cpdf -info -utf8 in.pdf
cpdf -set-title "Отчёт" -also-set-xmp in.pdf -o titled.pdf
cpdf -set-metadata metadata.xml in.pdf -o metadata.pdf

Информационный словарь и XMP — разные хранилища. Если изменить только Title в одном месте, просмотрщики и поисковые системы могут показывать разные значения. Опция -also-set-xmp помогает синхронизировать стандартные поля. Для сложного XMP используется отдельный XML-файл; его корректность и кодировку нужно проверить до записи.

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

cpdf -set-page-layout TwoColumnRight in.pdf -o spread.pdf
cpdf -set-page-mode UseOutlines in.pdf -o bookmarks-open.pdf
cpdf -open-at-page-fit 5 in.pdf -o start-at-five.pdf

Метки страниц отличаются от напечатанных номеров. Они позволяют показывать римские цифры для вступления, обычные номера для основной части и префиксы для приложений. Например, страницы 1–4 получают i–iv, страницы 5–14 — 1–10, а последующие — A-0, A-1 и далее. Проверять метки следует в просмотрщике, который отображает их в панели миниатюр.

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

Файловые вложения

В PDF можно прикрепить таблицу, исходный документ, XML или другой файл на уровне документа либо страницы. -attach-file добавляет вложение, список позволяет проверить имя, размер, описание и отношение, а -dump-attachments извлекает содержимое в заданный каталог.

cpdf -attach-file sheet.xlsx in.pdf -o with-file.pdf
cpdf -list-attached-files-json with-file.pdf > files.json
cpdf -dump-attachments with-file.pdf -o extracted
cpdf -remove-files with-file.pdf -o without-files.pdf

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

Удаление вложений уменьшает риск передачи лишних исходников, но не очищает другие контейнеры данных: дополнительные потоки метаданных, JavaScript, формы и скрытые слои требуют собственных проверок. Для санитарной обработки полезно составить последовательность операций и после неё повторно вывести список вложений и JavaScript.

Отношения и описания вложений важны для специализированных форматов, где приложение должно понимать роль файла. Простое добавление XML без правильной метаинформации не превращает документ в соответствующий отраслевой стандарт.

Изображения, растеризация и внешние компоненты

-image-resolution находит изображения, эффективное разрешение которых ниже порога, например 300 или 600 dpi. Расчёт зависит от размера размещения на странице: одна и та же картинка может иметь разное эффективное dpi при разных масштабах. Вывод используют для предпечатной проверки и поиска сканов, которые станут нечитаемыми после печати.

cpdf -image-resolution 300 in.pdf
cpdf -extract-images in.pdf -im /usr/bin/magick -o output/%%%
cpdf -process-images -jpeg-to-jpeg 65 in.pdf -o smaller.pdf

Извлечение сохраняет встроенные изображения отдельно от страницы. Для некоторых преобразований документация предусматривает вызов ImageMagick через путь, указанный параметром -im. Растеризация страниц и вывод PNG или JPEG могут обращаться к Ghostscript через -gs. Если команда сообщает, что внешний инструмент не найден, проверяют путь к исполняемому файлу и права запуска, а не только наличие cpdf.

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

-process-images позволяет перепаковывать JPEG, применять JPEG2000 и CCITT Group 4 для подходящих монохромных данных. Ошибочный выбор кодека может увеличить размер или ухудшить совместимость. Текстовые сканы с чёрно-белым содержимым часто выигрывают от Group 4, а фотографии — от JPEG; схемы с резкими цветными границами требуют осторожности.

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

Шрифты и диагностика печати

-list-fonts выводит шрифты по страницам, внутреннее имя, тип, PDF-имя и кодировку. Это помогает понять, почему текст отображается по-разному на разных компьютерах. Команда -missing-fonts ищет ссылки на отсутствующие или некорректно встроенные ресурсы, а проверка разрешения изображений дополняет предпечатный аудит.

Наличие названия шрифта в списке ещё не гарантирует полное встраивание. Подмножество содержит только использованные символы; после редактирования текста сторонним инструментом нужного глифа может не оказаться. Для штампов cpdf умеет загружать TrueType-шрифт, что особенно важно для кириллицы. Путь к шрифту должен быть доступен процессу, выполняющему пакетное задание.

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

Черновой режим может упрощать документ для быстрой проверки, но не предназначен для финального архива. Любая операция, меняющая графические объекты, должна сопровождаться визуальным сравнением, особенно в договорах, схемах и формах.

PDF как JSON и обратная сборка

Экспорт в JSON открывает доступ к объектной структуре PDF: словарям, массивам, потокам, страницам и связанным данным. Дополнительный параметр разбирает потоки содержимого на отдельные команды рисования. Это мощный режим для расследования ошибок, миграции данных и точечных изменений, которые не представлены отдельной высокоуровневой операцией.

cpdf in.pdf -output-json -utf8      -output-json-parse-content-streams -o out.json
cpdf -j out.json -o rebuilt.pdf

JSON-представление нельзя редактировать как обычный список свойств без понимания ссылок и типов. Неправильный номер объекта, длина потока или ссылка на отсутствующий ресурс приведёт к ошибке сборки либо повреждённому документу. Перед изменениями сохраняют исходный JSON, вносят минимальный патч и сравнивают построенный PDF с оригиналом.

Round-trip полезен для тестирования: экспорт, немодифицированный импорт и сравнение поведения выявляют неподдержанные или нестандартные структуры. Побайтовое совпадение не ожидается, потому что объекты могут быть переупорядочены и пересжаты; проверять следует страницы, формы, аннотации, вложения, закладки, метаданные и визуальный рендер.

При обработке секретных документов JSON может содержать текст, метаданные и вложенные данные в легко читаемом виде. Временные файлы нужно защищать и удалять так же тщательно, как исходные PDF.

Слои и Optional Content Groups

Optional Content Groups управляют слоями, которые пользователь может включать и выключать в поддерживающем просмотрщике. Cpdf выводит список групп, меняет состояние, переименовывает и объединяет группы с одинаковыми именами после слияния или штампования.

cpdf -ocg-list in.pdf
cpdf -ocg-coalesce-on-name in.pdf -o normalized-layers.pdf

Слои часто встречаются в картах, чертежах и мультиязычных макетах. При объединении двух документов одинаковые названия не всегда означают одинаковый смысл, поэтому автоматическое coalesce следует применять только после проверки. Иначе слой Notes из разных источников станет одной группой и будет переключаться совместно.

Не все просмотрщики одинаково поддерживают OCG. При передаче на печать нужно проверить, какие слои включены по умолчанию, и при необходимости создать плоскую версию. Скрытый слой не следует считать удалённым: данные остаются в документе и могут быть включены или извлечены.

Создание новых PDF из текста и изображений

Утилита может создать пустой документ с заданным числом страниц и размером бумаги, сверстать текстовый файл или собрать PDF из JPEG и PNG. Это удобно для технических отчётов, автоматически генерируемых обложек и контейнеров, которые затем дополняются другими операциями.

cpdf -create-pdf -create-pdf-pages 20      -create-pdf-papersize a4portrait -o blank.pdf
cpdf -typeset report.txt -create-pdf-papersize a3portrait      -font Courier -font-size 10 -o report.pdf
cpdf -jpeg photo.jpg -png diagram.png -o images.pdf

Typeset предназначен для простого текста, а не для сложной разметки. Нужно контролировать кодировку, переносы строк, ширину страницы, размер шрифта и поля. Таблицы с пробелами могут разъехаться при пропорциональном шрифте, поэтому для фиксированных колонок выбирают моноширинный шрифт.

При сборке из изображений размер страницы зависит от параметров и характеристик растра. Метаданные dpi в картинке могут быть ненадёжны; для воспроизводимого результата лучше явно задавать бумагу и масштаб. Большие фотографии без предварительной оптимизации быстро увеличивают итоговый PDF.

Пустые страницы полезны как подложка для рисования и штампов. После создания к ним применяются те же операции: текст, пути, изображения, закладки, метаданные и PDF/UA-разметка.

Рисование и построение документов командами

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

Графическое состояние включает цвет, толщину линии, матрицу преобразования и область отсечения. Ошибка в сохранении и восстановлении состояния способна повлиять на все последующие элементы. Поэтому сложный рисунок разбивают на независимые блоки и проверяют после каждого этапа.

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

Текст при рисовании зависит от выбранного шрифта и доступных глифов. Для доступного документа недостаточно визуально нарисовать буквы: требуется структура, порядок чтения и семантические теги. Эти задачи рассматриваются отдельно в средствах PDF/UA.

PDF/UA и проверка доступности

Cpdf умеет создавать и обрабатывать структурированные документы, ставить маркеры PDF/UA, проверять требования и помогать исправлять отдельные ошибки протокола Matterhorn. Структурное дерево связывает содержимое страницы с ролями документа: заголовками, абзацами, списками, таблицами и альтернативным текстом.

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

При слиянии и разбиении структурированных файлов важно сохранять structure tree и идентификаторы marked content. Обычное копирование страниц без связанной структуры может сделать файл визуально правильным, но недоступным для экранного диктора. Для таких документов используют специализированные параметры сохранения структуры и повторно запускают проверку.

Растеризация, печать в PDF и некоторые оптимизаторы уничтожают теги. Поэтому операции следует планировать так, чтобы геометрические и содержательные изменения выполнялись до финальной ремедиации, а последний этап включал проверку PDF/UA и ручной просмотр с ассистивной технологией.

Цепочки AND, стандартные потоки и файлы аргументов

Оператор AND выполняет несколько преобразований последовательно в одном запуске. Например, можно объединить файлы, добавить текст и сжать результат, не создавая промежуточные PDF на диске. Порядок операций меняет итог: штамп до масштабирования будет масштабирован вместе со страницей, а штамп после масштабирования сохранит заданный размер.

cpdf -merge a.pdf b.pdf AND      -add-text "Архив" -top 20pt AND      -squeeze -o result.pdf

Стандартный ввод и вывод позволяют соединять cpdf с другими программами конвейером. Однако PDF часто требует произвольного доступа к данным, а оболочки по-разному обрабатывают бинарный поток. На Windows нужно избегать текстового преобразования конца строк и случайного вывода сообщений в тот же stdout, куда пишется PDF.

Длинные параметры выносят в файл через -args args.txt. Это уменьшает проблемы с максимальной длиной командной строки и делает задание воспроизводимым. Файл аргументов следует хранить в системе контроля версий вместе с пояснением ожидаемых входов и выходов, но не помещать в него открытые пароли.

Control files и JSON-файлы дают более структурированный способ управлять сложными действиями. При запуске из приложения нужно проверять код возврата и разделять stdout со служебными данными и stderr с ошибками. Простого наличия выходного файла недостаточно: он может быть создан частично до сбоя.

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

Ошибки, повреждённые PDF и безопасная проверка результата

Cpdf пытается реконструировать некоторые повреждённые файлы: восстанавливает таблицы перекрёстных ссылок и обрабатывает распространённые отклонения от спецификации. Это не гарантирует сохранность всех объектов. Если программа сообщает о malformed PDF, нужно сохранить оригинал, выполнить диагностический запуск и сравнить результат с рендером в нескольких просмотрщиках.

Типичные причины отказа — неверный пароль, недопустимый диапазон, отсутствующий входной файл, неправильные кавычки, невозможность записи результата и ошибка внешнего Ghostscript или ImageMagick. На сервере дополнительно проверяют рабочий каталог, права пользователя, лимит открытых файлов и свободное место.

Имя результата не должно совпадать с входным файлом, если операция не поддерживает безопасную замену. Надёжная схема записывает временный файл в том же файловом разделе, проверяет его и затем выполняет атомарное переименование. При сбое оригинал остаётся нетронутым.

После преобразования автоматический тест может включать: код возврата равен нулю; файл начинается с сигнатуры PDF; число страниц ожидаемое; документ открывается без пароля или с нужным паролем; закладки и вложения присутствуют; размер не равен нулю; рендер нескольких контрольных страниц не пуст. Для юридически значимых документов добавляют визуальное сравнение всех страниц и проверку цифровых подписей.

Любое изменение PDF обычно нарушает существующую цифровую подпись, если операция не оформлена как допустимое инкрементальное обновление и подпись не разрешает изменение. Cpdf предназначен для преобразования содержимого, поэтому подписанные файлы обрабатывают только после анализа требований и сохраняют оригинал как доказательство.

Установка и особенности запуска на разных системах

Исполняемый файл не требует отдельного графического мастера. Его помещают в каталог, доступный из PATH, либо вызывают по полному пути. На Windows пакетный файл должен учитывать имя cpdf.exe и правила кавычек cmd или PowerShell. В Linux и macOS файлу может понадобиться разрешение на выполнение.

На macOS бинарник подписан, но Gatekeeper способен показать предупреждение. Тогда пользователь открывает раздел Privacy & Security, разрешает запуск и повторно подтверждает открытие. Не следует отключать системную защиту целиком: достаточно разрешить конкретный проверенный файл.

Предупреждение macOS при первом запуске cpdf Разрешение запуска cpdf в Privacy and Security macOS Подтверждение открытия cpdf в macOS

Архитектура бинарника должна соответствовать системе. Для автоматического развёртывания удобны системные менеджеры пакетов, но после установки всё равно выполняют cpdf -version, поскольку репозиторий дистрибутива может отставать. При прямом скачивании сверяют SHA-256 и источник файла.

Пути к внешним программам задаются явно в командах, которые используют Ghostscript или ImageMagick. Это делает сценарий воспроизводимым и исключает запуск одноимённого файла из неожиданного каталога. В службах и планировщиках PATH часто отличается от интерактивного терминала, поэтому полный путь надёжнее.

Практические рабочие процессы

Сборка ежемесячного пакета отчётов

Сначала проверяют количество страниц и метаданные каждого файла, затем объединяют их с закладками верхнего уровня. После слияния добавляют единый футер с номером текущей и общей страницы, устанавливают заголовок документа и выполняют структурное сжатие. Контроль включает сравнение суммы страниц исходников с результатом и проверку переходов по закладкам.

cpdf -merge jan.pdf feb.pdf mar.pdf -merge-add-bookmarks AND      -add-text "%Page / %EndPage" -bottom 18pt AND      -set-title "Квартальный пакет" -also-set-xmp AND      -squeeze -o quarter.pdf

Разделение книги по главам

Перед разбиением выводят закладки в JSON, исправляют пустые и повторяющиеся заголовки, затем используют -split-bookmarks. Полученные имена очищают от запрещённых символов, а число страниц всех частей сравнивают с оригиналом. Если документ доступный, дополнительно проверяют сохранение структуры.

Подготовка сканов к передаче

Для двусторонних сканов сначала коллатируют лицевые и оборотные страницы, исправляют поворот и CropBox, затем проверяют разрешение изображений. Низкокачественные страницы не стоит автоматически ухудшать повторным JPEG-сжатием. После очистки удаляют лишние вложения и JavaScript, устанавливают метаданные и создают контрольную сумму.

Пакетная нумерация материалов дела

Список PDF сортируют по утверждённому порядку, для каждого вычисляют стартовый Bates-номер и записывают его в журнал. Команда добавляет префикс, фиксированное число разрядов и одинаковую позицию. После обработки скрипт извлекает текст или рендерит контрольные страницы, чтобы убедиться, что номера не вышли за CropBox и не перекрыли значимое содержание.

Очистка перед публикацией

Выводят документную информацию, вложения, аннотации, слои и наличие JavaScript. Затем удаляют только те элементы, которые признаны лишними, и повторяют аудит. Белые поля и скрытые слои не считаются удалением данных. Для секретного текста применяют redaction и проверяют невозможность поиска и копирования.

Ограничения, которые важно учитывать

Главное ограничение — отсутствие визуального редактора. Координаты, диапазоны и параметры задаются текстом, поэтому случайная ошибка может затронуть сотни файлов. Защита строится не на диалогах подтверждения, а на тестовой выборке, резервных копиях и автоматических проверках.

Команды и документация используют английские имена параметров. Русский текст в самих PDF поддерживается при правильной кодировке и шрифте, но сообщения ошибок и синтаксис не локализованы. В Windows различия между cmd и PowerShell особенно заметны в кавычках, перенаправлении и символе процента в пакетных файлах.

Некоторые функции зависят от внешних компонентов. Извлечение и преобразование изображений может требовать ImageMagick, а растеризация — Ghostscript. Отсутствие этих программ не мешает базовым операциям, но конкретная команда завершится ошибкой.

Лицензия AGPL требует учитывать способ использования и распространения. Если cpdf связывается с закрытым сервисом или предоставляется пользователям как часть сетевого приложения, условия раскрытия исходного кода могут быть несовместимы с проектом; тогда нужна коммерческая лицензия. Это юридическое ограничение следует оценить до внедрения в производственный конвейер.

Утилита преобразует PDF, но не заменяет визуальную проверку, валидатор PDF/A, полноценный редактор форм или систему электронной подписи. Сложные интерактивные документы, динамические XFA-формы и подписанные контейнеры требуют отдельного тестирования.

Проверка и удаление активного содержимого

PDF способен хранить JavaScript не только в очевидной кнопке формы. Сценарий может быть связан с открытием документа, действием аннотации, полем формы или адресом вида javascript:. Перед публикацией файла из неизвестного источника полезно сначала проверить наличие такого содержимого командой -contains-javascript, а затем решить, допустимо ли оно в рабочем процессе.

cpdf -contains-javascript incoming.pdf
cpdf -remove-javascript incoming.pdf -o cleaned.pdf

Удаление JavaScript снижает риск неожиданных действий в просмотрщике, но не является полной санитарной обработкой. В PDF остаются вложенные файлы, действия перехода, мультимедиа, аннотации, формы, слои и метаданные. Поэтому сценарий очистки строят как аудит нескольких классов объектов, а не как одну универсальную команду.

Для файлов, пришедших из веб-архивов, старых издательских систем и графических редакторов, можно удалить служебные структуры: -remove-web-capture, -remove-article-threads, -remove-page-piece и -remove-procsets. Эти операции уменьшают объём скрытых данных, но каждая затрагивает отдельный механизм PDF. Например, article threads описывают логическую последовательность фрагментов, а page-piece dictionaries могут содержать частные данные приложения.

Параметр -remove-output-intents удаляет профили и сведения, используемые для согласования цвета. Для офисного файла это иногда допустимо, но для полиграфического PDF операция способна лишить типографию важного указания о целевом условии печати. Очистка должна учитывать назначение документа: то, что выглядит лишним в архивной копии, может быть критично в PDF/X-процессе.

Перед удалением вложений выводят их список и сохраняют нужные файлы отдельно. Аналогично с аннотациями: комментарии могут быть мусором, а могут содержать результаты согласования. Надёжная схема создаёт отчёт о найденных объектах, применяет утверждённый профиль очистки и повторяет тот же отчёт для результата.

Скрытие фрагмента белым прямоугольником не удаляет текст и не заменяет redaction. После настоящего редактирования конфиденциальных данных проверяют текстовое извлечение, поиск по исходной фразе, объекты за пределами CropBox, альтернативные изображения и вложения. Только сочетание удаления и независимой проверки позволяет считать сведения действительно исключёнными.

Метаданные, частные словари и следы приложений

В одном PDF могут одновременно находиться классический словарь Info, основной XMP-поток и дополнительные metadata streams, прикреплённые к отдельным объектам. Изменение заголовка через -set-title не означает, что старое значение исчезло из всех мест. Когда требуется синхронность, используют параметры обновления XMP и затем отдельно читают документную информацию.

Команда -extract-all-metadata выгружает все найденные metadata streams в каталог. Такой отчёт полезен перед передачей документов наружу: он показывает XML-пакеты, которые не видны в обычном окне свойств. После анализа можно удалить основной XMP или все потоки метаданных, учитывая, что вместе с ними исчезнут сведения о доступности, авторстве, стандарте PDF/A и производственном процессе.

cpdf -extract-all-metadata source.pdf -o metadata-dir
cpdf -remove-all-metadata source.pdf -o without-metadata.pdf

Очистка метаданных не должна выполняться автоматически для каждого файла. В PDF/A идентификатор соответствия хранится в XMP; в доступном документе метаданные могут содержать язык и описание; в издательском процессе они помогают отслеживать происхождение. Профиль обработки должен перечислять поля, которые сохраняются, заменяются и удаляются.

Частные данные приложения встречаются в page-piece dictionaries и других нестандартных объектах. Их присутствие не обязательно означает ошибку, но усложняет оценку того, что именно покидает организацию. Cpdf позволяет удалить несколько известных категорий, а низкоуровневые команды чтения объектов помогают исследовать структуру до принятия решения.

После санитарной обработки сравнивают не только вид страниц, но и свойства: заголовок, автор, ключевые слова, даты, язык, вложения, аннотации, JavaScript, слои и число metadata streams. Это защищает от ложного результата, когда основной XMP удалён, а аналогичная информация сохранилась в другом объекте.

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

Портфолио, вложения и отношения файлов

PDF portfolio представляет собой контейнер, в котором собраны PDF и файлы других типов. Cpdf создаёт такой контейнер через -portfolio и повторяющиеся параметры -pf. Начальный документ можно сформировать пустым, после чего добавить файлы, описания и отношения.

cpdf -create-pdf AND -portfolio      -pf report.pdf -pfd "Основной отчёт"      -pf data.xlsx -pfd "Исходные данные"      -o package.pdf

Портфолио отличается от простого объединения страниц. Вложенный файл сохраняет собственный формат и не становится страницами итогового PDF. Это удобно для комплекта отчёт плюс таблица плюс исходное изображение, но поддержка интерфейса портфолио зависит от просмотрщика. Перед распространением нужно проверить открытие контейнера именно в тех программах, которыми пользуются получатели.

Для обычных вложений доступны список, добавление, извлечение и удаление. JSON-вывод списка способен включать описание, relationship и при необходимости данные файла. Relationship помогает обозначить роль вложения — например, источник, альтернатива или дополнительный материал — но далеко не каждый просмотрщик показывает это поле пользователю.

Не следует считать вложение безопасным только потому, что оно находится внутри PDF. Исполняемый файл, сценарий или документ с макросами остаётся потенциально опасным. Перед извлечением проверяют имя, MIME-тип, размер и контрольную сумму, а сам файл передают антивирусному и контентному анализатору.

При удалении вложений повторно запускают список и проверяют каталог Names, file-specification dictionaries и аннотации файлов. Это особенно важно для документов, где один и тот же вложенный поток доступен через несколько ссылок. Визуальное отсутствие значка скрепки не доказывает отсутствие embedded files.

Если задача состоит в печати единого комплекта, страницы надёжнее объединить обычным merge. Портфолио выбирают тогда, когда нужно сохранить исходные форматы и внутреннюю структуру компонентов, а целевая среда гарантированно поддерживает такой контейнер.

Изображения: инвентаризация, маски и управляемое сжатие

Перед оптимизацией полезно вывести список изображений. Отчёт показывает размер в пикселях, цветовое пространство, глубину, тип сжатия, положение на странице и наличие маски. Встроенные inline images и маски учитываются отдельно, поэтому простого подсчёта XObject недостаточно.

Команда -composition помогает понять, какая часть размера приходится на изображения, шрифты и другие данные. Если фотографии занимают почти весь файл, структурный -squeeze даст небольшой эффект. Если преобладают повторяющиеся объекты и неэффективная структура, lossless-перепаковка может быть полезнее повторного JPEG.

-process-images поддерживает разные правила для JPEG, lossless-изображений и однобитных сканов. Качество и разрешение задают осознанно: текстовый скан обычно выигрывает от CCITT Group 4 или JBIG2, а фотография — от JPEG с контролируемым качеством. Применение одного профиля ко всем изображениям может испортить схемы, логотипы и мелкий текст.

cpdf -process-images -process-images-info      -jpeg-to-jpeg 75 -jpeg-to-jpeg-dpi 150      scans.pdf -o scans-small.pdf

Информационный режим сообщает, какие изображения были обработаны и почему остальные пропущены. По умолчанию утилита может отказаться от замены, если новый поток больше исходного; параметр принудительной обработки меняет это поведение и требует особой осторожности. Уменьшение DPI оценивают по фактическому размеру изображения на странице, а не только по числу пикселей.

Soft mask хранит прозрачность отдельно от основного изображения. При извлечении или объединении маски нужно сохранить согласование размеров и цветовых данных. Иначе полупрозрачные края превращаются в тёмные ореолы, а прозрачный фон — в прямоугольник.

JPEG2000 полезен для некоторых архивных и смешанных изображений, но поддержка декодирования в сторонних системах неодинакова. После перекодирования проверяют несколько просмотрщиков, скорость открытия и визуальные артефакты. Размер файла не должен быть единственным критерием.

Для контроля качества выбирают страницы с мелким текстом, градиентами, линиями и фотографиями. Их рендерят до и после обработки в одинаковом масштабе, сравнивают размеры и просматривают разностное изображение. Такой тест быстрее обнаруживает потерю тонких линий, чем случайное перелистывание документа.

Диагностика длинных операций и журналы

Параметр -progress выводит ход работы в стандартный поток ошибок. Для постраничных операций сначала появляется номер страницы, а завершение шага отмечается точкой. В цепочке AND прогресс действует на последующие операции после места, где параметр был указан.

cpdf -add-text "Контрольная копия" in.pdf      -o out.pdf -progress 2>progress.log

Разделение stdout и stderr принципиально важно. Некоторые команды выводят полезные данные или отчёт в stdout, тогда как прогресс и диагностика идут в stderr. Если оба потока записать в один PDF, результат будет повреждён. В PowerShell, Bash и среде запуска процесса следует задавать отдельные каналы.

Текст прогресса предназначен человеку и не должен использоваться как единственный машинный протокол. Скрипт проверяет код завершения, наличие и размер результата, затем запускает содержательные тесты. Изменение формулировки сообщения между выпусками не должно ломать производственную систему.

Для -squeeze предусмотрен отдельный журнал через -squeeze-log-to. Он дописывается в существующий файл, поэтому при многопоточном запуске разные задания лучше направлять в отдельные логи. Иначе строки перемешиваются и теряется связь с конкретным документом.

Журнал должен содержать идентификатор задания, путь или безопасный псевдоним входа, SHA-256, начальное и конечное число страниц, код возврата, длительность и результат проверок. Пароли и конфиденциальные имена из командной строки туда не записывают.

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

Надёжный пакетный запуск в PowerShell и Bash

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

PowerShell

$cpdf = "C:\Tools\cpdf.exe"
$source = "C:\PDF\in"
$target = "C:\PDF\out"
New-Item -ItemType Directory -Force -Path $target | Out-Null

Get-ChildItem $source -Filter *.pdf | Sort-Object Name | ForEach-Object {
    $out = Join-Path $target $_.Name
    & $cpdf -squeeze $_.FullName -o $out 2>&1 |
        Tee-Object -FilePath "$out.log"
    if ($LASTEXITCODE -ne 0 -or -not (Test-Path $out)) {
        throw "Ошибка обработки $($_.FullName)"
    }
}

Оператор вызова & корректно запускает путь с пробелами. Аргументы передаются отдельными элементами, поэтому не нужно вручную собирать одну строку с кавычками. После каждого процесса проверяется $LASTEXITCODE, а не только отсутствие исключения PowerShell.

Bash

set -euo pipefail
cpdf_bin=/opt/cpdf/cpdf
mkdir -p out logs

find in -maxdepth 1 -type f -name '*.pdf' -print0 |
while IFS= read -r -d '' file; do
  name=$(basename "$file")
  tmp="out/.${name}.tmp.pdf"
  final="out/$name"
  "$cpdf_bin" -squeeze "$file" -o "$tmp"       2>"logs/$name.log"
  test -s "$tmp"
  mv "$tmp" "$final"
done

Нулевой разделитель защищает имена с пробелами и переводами строк. Временный файл находится в том же разделе, поэтому финальное переименование обычно атомарно. set -euo pipefail помогает остановить обработку при необработанной ошибке, но не заменяет проверку качества PDF.

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

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

Автоматическая проверка после преобразования

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

Для merge ожидаемое число страниц равно сумме выбранных диапазонов. Для split сумма страниц частей должна совпадать с исходным диапазоном. После шифрования проверяют требование пароля и разрешения, после удаления вложений — пустой список embedded files, после очистки JavaScript — отрицательный результат соответствующей проверки.

Геометрические операции тестируют по MediaBox, CropBox, BleedBox, TrimBox и ArtBox. Вид страницы может выглядеть нормально, хотя TrimBox потерян или CropBox вышел за MediaBox. Для печатных материалов такие различия существеннее, чем визуальная миниатюра.

Штампы и Bates-нумерацию контролируют на первой, средней и последней странице, а также на листах с нестандартным поворотом. Текст должен находиться внутри видимой области, иметь правильный номер, шрифт и кодировку. Для документов с разными форматами страниц одной контрольной страницы недостаточно.

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

Для визуального регрессионного теста страницы рендерят до и после операции с одинаковым движком и разрешением. Допустимые различия задают по сценарию: при добавлении штампа ожидается локальное изменение, при lossless-сжатии изображение должно совпадать, при JPEG-оптимизации разрешается ограниченная разница.

Контрольный отчёт связывает исходный и итоговый SHA-256, версию команды, параметры и результаты проверок. Благодаря этому повторный запуск можно сравнить с эталоном и обнаружить изменение поведения после обновления окружения.

Работа с недоверенными и повреждёнными файлами

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

Реконструкция повреждённой таблицы xref помогает открыть многие документы, но способна изменить интерпретацию неоднозначного файла. Результат сохраняют под новым именем, а предупреждения не подавляют. Для судебных, архивных и подписанных документов оригинал остаётся неизменным доказательством.

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

Внешние программы запускают по абсолютному пути и с фиксированными параметрами. Каталог входного файла не добавляют в PATH, иначе злоумышленник может подложить одноимённый исполняемый файл. Временный каталог создают с правами только для служебного пользователя.

После обработки удаляют временные файлы даже при ошибке, но журнал и хеши сохраняют согласно политике. Неполный PDF не передают дальше по конвейеру. Очередной этап получает файл только после формальной проверки предыдущего.

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

Как выбирать порядок операций

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

Если Bates-нумерация должна отражать окончательный комплект, её добавляют после merge, split и удаления страниц. Если штамп должен масштабироваться вместе с содержимым, его размещают до операции scale; если размер надписи должен оставаться постоянным — после неё.

Санитарную очистку активного содержимого выполняют до финальной проверки и подписания. Подписание должно быть последним контролируемым этапом, поскольку практически любое последующее изменение делает подпись недействительной или сообщает о модификации.

Lossy-обработку изображений откладывают до момента, когда утверждены размеры страниц и назначение файла. Повторное JPEG-сжатие на каждом промежуточном этапе накапливает артефакты. Промежуточные результаты лучше хранить без потерь.

При использовании AND сначала тестируют каждую операцию отдельно на небольшом документе, затем объединяют цепочку и сравнивают результат. Это помогает найти шаг, который изменил закладки, слои, структуру или качество изображений.

Файл аргументов фиксирует порядок и упрощает рецензирование. В нём одна операция не должна быть замаскирована длинной строкой оболочки. Комментарии и документация сценария объясняют ожидаемый эффект, а не дублируют имя параметра.

Сравнение Coherent PDF Command Line Tools с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
Coherent PDF Command Line ToolsКомплексных пакетных операций, штампов, JSON, закладок, изображений и PDF/UAНет графического интерфейса
qpdfСтруктурной переработки PDF, шифрования, проверки и надёжного выбора страницМеньше средств рисования и штампов
PDFtk ServerПростого слияния, разбиения, форм, штампов и вложений в серверных сценарияхНабор современных функций уже
GhostscriptРендеринга, преобразования PostScript, PDF/A, PDF/X и глубокой обработки изображенийПерезапись может менять графику
MuPDF mutoolБыстрого рендеринга, очистки, объединения и извлечения содержимогоФункции разделены по подкомандам
PDF CommanderРучного редактирования, перестановки страниц и работы без знания командНе заменяет массовый CLI-конвейер

Для автоматической обработки с широким набором PDF-объектов удобнее cpdf. qpdf выбирают, когда важнее строгая структурная работа, шифрование и предсказуемое переписывание. PDFtk Server остаётся понятным для привычных операций и форм, Ghostscript сильнее в рендеринге и стандартизированных выходных форматах, а mutool — в быстром просмотре, очистке и конвертации. PDF Commander разумнее там, где документ нужно оценивать глазами и править вручную, а не запускать одинаковую команду на каталоге файлов.

Ответы на практические вопросы

Можно ли обработать только несколько страниц?

Да. Диапазон указывают рядом с входным файлом или применяют к операции. Перед массовой командой полезно извлечь тот же диапазон в отдельный PDF и проверить, как трактуются конец документа, чётные и нечётные страницы.

Почему русская надпись отображается квадратиками?

Стандартный шрифт или кодировка не содержит нужных глифов. Следует использовать UTF-8, подключить TrueType-шрифт с кириллицей и убедиться, что путь к нему доступен процессу. Простое добавление -utf8 не создаёт отсутствующие символы в шрифте.

Почему после кадрирования текст всё ещё копируется?

CropBox меняет видимую область, но не удаляет объекты за её пределами. Для конфиденциальных фрагментов нужна операция redaction с последующей проверкой поиска, копирования и извлечения содержимого.

Почему файл после сжатия почти не уменьшился?

Вероятно, потоки уже сжаты или объём определяют фотографии. Сначала запускают -composition, затем выбирают подходящую обработку изображений. Повторное JPEG-сжатие может ухудшить качество при небольшом выигрыше.

Почему команда работает в терминале, но не в планировщике?

У службы другой PATH, рабочий каталог и права. Указывают полные пути к cpdf, входным файлам, шрифтам, Ghostscript и ImageMagick, перенаправляют stderr в журнал и проверяют разрешение на запись.

Можно ли перезаписать исходный PDF?

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

Сохранятся ли цифровые подписи?

Большинство содержательных изменений нарушает подпись. Подписанный оригинал сохраняют неизменным, а преобразованную копию считают новым документом. Допустимость конкретного изменения проверяют по политике подписи и требованиям системы документооборота.

Как убедиться, что пакетная обработка прошла правильно?

Проверяют код возврата, наличие и размер результата, число страниц, пароли, закладки, вложения и метаданные. Для критичных задач рендерят все страницы и сравнивают с эталоном, а журнал связывают с SHA-256 входов и выходов.

Итоговый порядок работы

Надёжный сценарий начинается с инвентаризации PDF: число страниц, размеры листов, повороты, шифрование, закладки, вложения, аннотации, шрифты и качество изображений. Затем команда отрабатывается на копии одного типичного и одного проблемного файла. Только после этого её переносят в цикл по каталогу.

Преобразования располагают в осмысленном порядке. Сначала исправляют геометрию и состав страниц, затем добавляют штампы и нумерацию, после этого обновляют метаданные и выполняют оптимизацию. Доступность и подписи проверяют в самом конце, потому что последующие изменения могут уничтожить результаты проверки.

Для повторяемости сохраняют команду или файл аргументов, версии внешних компонентов, журналы ошибок и контрольные суммы. Выходные PDF записывают в отдельный каталог и не считают успешными, пока не пройдены автоматические и визуальные тесты. При таком подходе Coherent PDF Command Line Tools превращает сложные операции с PDF в воспроизводимый конвейер, где каждый этап можно проверить и повторить без ручной перестановки страниц и однообразных действий в окнах.