pdfjam

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

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

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

Скачать pdfjam

Оценка 9.7 Рекомендуем
  • Редактирование PDF
  • Русский интерфейс
  • Просто новичкам
Скачать бесплатно на Windows
Лучшая альтернатива
pdfjam
Оценка 8.5
  • Нужны LaTeX и Unix shell
  • Нет графического интерфейса
  • Ссылки и закладки теряются
Скачать pdfjam
Загрузка начнётся после нажатия

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

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

Простой вызов без дополнительных настроек создаёт новый PDF из выбранных страниц. Имя результата можно задать через --outfile, короткую форму -o или вариант --output. Если передан путь к каталогу, имя строится из имени исходного файла и суффикса; если передано имя файла, оно используется буквально. Существующий результат может быть перезаписан без отдельного диалога, поэтому в сценариях стоит сначала писать во временный путь, проверять код завершения и только потом заменять рабочий документ.

pdfjam report.pdf 1-3,7,last --outfile report-selection.pdf
pdfjam cover.pdf 1 body.pdf 2-last --output assembled.pdf

Первый пример оставляет страницы 1–3, 7 и последнюю. Второй помещает обложку перед страницами основного документа, начиная со второй. Слово last избавляет от предварительного подсчёта листов, а обратные диапазоны позволяют менять направление: запись 8-1 выдаёт страницы в обратном порядке. Пустой элемент задаётся фигурными скобками {}; он полезен, когда нужно начать раздел с правой стороны или выровнять разворот.

Справка pdfjam в терминале с описанием синтаксиса и диапазонов страниц

Встроенная справка показывает синтаксис, список поддерживаемых расширений и параметры, которые передаются пакетам pdfpages и graphicx. Для быстрого контроля окружения пригодны pdfjam --version, pdfjam --configpath и command -v pdflatex. Первая команда подтверждает, что исполняется нужный скрипт, вторая показывает путь поиска конфигурации, третья проверяет доступность движка. Если в системе установлено несколько TeX-дистрибутивов, полезно также выполнить kpsewhich pdfpages.sty, чтобы убедиться, что пакет pdfpages виден тому же окружению.

Подготовка окружения и проверка зависимостей

Перед первой операцией должны быть доступны Unix-совместимая оболочка, LaTeX-движок и пакет pdfpages. Обычно используется pdflatex, однако параметр --latex позволяет указать абсолютный путь к другому совместимому движку. Наличие одной команды pdfjam ещё не гарантирует готовность: скрипт может запускаться, но завершаться после создания временного файла, если LaTeX не найден или не может загрузить pdfpages. Проверка коротким документом надёжнее, чем чтение списка пакетов.

command -v pdfjam
command -v pdflatex
kpsewhich pdfpages.sty
pdfjam one-page.pdf --outfile test-output.pdf

На Linux и других Unix-подобных системах pdfjam обычно устанавливается средствами дистрибутива или TeX Live. На macOS команда также требует рабочей TeX-среды и оболочки. В Windows практический путь проходит через WSL, Cygwin или Git Bash с доступным LaTeX; обычный запуск shell-скрипта из Проводника не даёт необходимого окружения. При работе через WSL лучше хранить промежуточные файлы внутри файловой системы Linux, если обрабатываются сотни страниц: это уменьшает задержки на множественных операциях чтения и записи.

Для параметра --keepinfo нужен pdfinfo из набора Poppler. Без него обычная перекомпоновка страниц продолжит работать, но перенос метаданных из входного PDF не будет выполнен. Утилита file используется при включённой проверке типов --checkfiles; она позволяет принять PDF или изображение с нестандартным расширением. Для русских имён файлов важны корректная локаль и аккуратное заключение путей в кавычки. Если оболочка передаёт строку в иной кодировке, параметр --enc задаёт кодировку, понятную iconv.

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

Выбор и перестановка страниц

Спецификация страниц — центральный элемент pdfjam. Она поддерживает отдельные номера, диапазоны, слово last, обратный порядок и пустые позиции. Запись 2,4-6,9-last означает вторую страницу, затем четвёртую, пятую, шестую и все листы с девятого до конца. Запись last-1 разворачивает документ. Несколько диапазонов можно повторять, поэтому последовательность 1,1,2,2 вручную дублирует первые два листа, а {},1-last вставляет пустую страницу перед документом.

Диапазон относится к ближайшему предшествующему файлу. В команде с несколькими источниками это позволяет построить произвольную последовательность без предварительного разбиения. Например, можно взять титульный лист из первого PDF, главы 2–4 из второго, приложение в обратном порядке из третьего и завершить пустой страницей. Порядок аргументов становится фактическим монтажным листом, поэтому сложные сборки разумно оформлять переносами строк и комментариями в shell-сценарии.

pdfjam \
  cover.pdf 1 \
  report.pdf 5-18 \
  appendix.pdf last-1 \
  blank.pdf 1 \
  --outfile delivery.pdf

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

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

Терминал после объединения выбранных страниц двух PDF в pdfjam

Объединение PDF и изображений

pdfjam принимает несколько PDF, а также изображения JPEG и PNG; в документации упоминаются PostScript и EPS при наличии подходящей цепочки обработки. Каждый файл превращается в последовательность логических страниц, которые затем укладываются в выходной документ. Это удобно для обложек, отсканированных вставок, схем и фотографий: изображение можно поставить между страницами PDF без предварительного создания отдельного одностраничного документа.

При смешивании разных форматов следует заранее решить, какой размер бумаги нужен на выходе. Без явного параметра используется настроенный формат, часто A4. Изображение и страницы Letter или квадратного PDF будут масштабированы в одинаковый лист, поэтому их видимый размер может отличаться от ожидаемого. Для сохранения размера первой вставленной страницы применяют --fitpaper true; для согласования по выбранному образцу — --pagetemplate или --templatesize.

Все выходные страницы одного файла получают одинаковый размер и ориентацию. Если задача требует сохранить в одном PDF смесь A4, A3, Letter и квадратных листов без унификации, pdfjam не подходит: его модель рассчитана на печатную перекомпоновку, а не на структурное соединение страниц с исходными MediaBox. В таком случае лучше использовать qpdf, pikepdf или другой инструмент, который копирует страницы на уровне структуры PDF.

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

Результат pdfjam с четырьмя квадратными страницами и изображением PNG

Опция --checkfiles просит утилиту file определять тип по содержимому, а не только по расширению. Она помогает, когда PDF получен без суффикса или изображение имеет ошибочное имя. Проверка не восстанавливает повреждённый файл и не конвертирует неподдерживаемый формат: она лишь выбирает корректный способ включения. Если file -Lb не распознаёт объект как PDF, PostScript, JPEG или PNG, лучше сначала исправить источник.

Размещение нескольких страниц на листе

Параметр --nup XxY задаёт сетку логических страниц: число столбцов X и строк Y. Значение 2x1 помещает две страницы рядом, 2x2 — четыре, 2x3 — шесть. pdfpages автоматически уменьшает содержимое, чтобы оно вошло в ячейки. Формат бумаги, ориентация и промежутки влияют на доступную площадь, поэтому одна и та же сетка на A4 и Letter даёт разный масштаб.

Для раздаточных материалов из презентации обычно выбирают альбомный исходник, портретный лист A4, сетку 2x3, тонкие рамки и небольшой интервал. Рамки показывают границы каждого слайда и помогают читать компоновку после чёрно-белой печати. Параметр --delta задаёт горизонтальный и вертикальный промежуток между ячейками; единицы можно писать в миллиметрах, сантиметрах, пунктах и других величинах TeX. Слишком большой интервал уменьшит полезную область всех шести слайдов.

pdfjam slides.pdf \
  --nup 2x3 \
  --frame true \
  --delta '2mm 3mm' \
  --scale 0.95 \
  --outfile handout.pdf

Значение --scale дополнительно умножает вычисленный масштаб. Число 0.95 оставляет небольшой внутренний запас, а 1.05 может привести к обрезанию или наложению, если рамки и поля уже занимают место. Параметр --noautoscale true отключает автоматическое вписывание; его используют только тогда, когда размеры источника и ячейки заранее согласованы. Для обычной печати автоматический режим безопаснее.

По умолчанию страницы заполняют сетку в строковом порядке. --column true переключает направление на столбцы: сначала сверху вниз, затем переход в следующий столбец. На последнем неполном листе pdfpages может балансировать столбцы; --columnstrict true запрещает такое перераспределение. Выбор зависит от того, как читатель будет следовать по листу и как страницы будут разрезаться.

Команда pdfjam для сетки 2 на 2 с рамками и интервалами

Четыре страницы PDF на одном листе после обработки pdfjam

Для печати карточек, этикеток и небольших форм важно проверить физический размер. Сетка N-up не является профессиональным спуском полос с метками реза, вылетами и управлением цветом. Она размещает графические страницы на листе по правилам LaTeX. Если типография требует PDF/X, вылет 3 мм, контрольные шкалы или сохранение специальных красок, результат следует дополнительно проверять в допечатной системе.

Буклеты и печатные тетради

Режим --booklet true переставляет страницы так, чтобы после двусторонней печати, сгиба и вложения получился читаемый буклет. Обычно его сочетают с --nup 2x1 и альбомной ориентацией листа. Для восьми исходных страниц первая сторона первого листа содержит последнюю и первую, следующая — вторую и предпоследнюю; точный порядок формирует pdfpages. Недостающее число до кратности четырём компенсируется пустыми позициями.

Параметр --signature N делит длинный документ на тетради по N страниц, где N кратно четырём. Это практичнее одного огромного буклета: толстую стопу трудно сложить, внутренние листы выступают наружу, а корешок деформируется. Тетради по 16, 20 или 24 страницы легче фальцевать и сшивать, но подходящий размер зависит от толщины бумаги и способа переплёта. pdfjam занимается только порядком страниц; компенсацию сползания, вылеты и метки типографии нужно решать отдельно.

pdfjam book.pdf \
  --signature 16 \
  --nup 2x1 \
  --landscape \
  --outfile signatures.pdf

Варианты со звёздочкой --booklet* и --signature* предназначены для переплёта по противоположному краю. Символ звёздочки необходимо экранировать или заключать параметр в кавычки, иначе оболочка может попытаться раскрыть его как маску имён файлов. Параметр --flip-other-edge true меняет край переворота при двусторонней печати и помогает согласовать результат с режимом принтера переворот по короткой стороне или по длинной стороне.

Терминал с выполнением режима booklet в pdfjam

Порядок страниц буклета, созданного pdfjam

Перед печатью всего тиража нужно распечатать одну тетрадь, сложить её и карандашом отметить номера. Ошибка чаще возникает не в перестановке pdfjam, а в настройке драйвера: неверный край переворота даёт перевёрнутую оборотную сторону. Если тест не совпал, не следует вручную менять порядок диапазонов; сначала переключают параметр двусторонней печати, затем при необходимости используют --otheredge, --flip-other-edge или вариант со звёздочкой.

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

Размер бумаги и ориентация

Формат задаётся параметром --paper, например a4, a5, letter или legal. Пользовательский размер передаётся через --papersize как ширина и высота: 15cm,30cm. Если единицы не указаны, значения интерпретируются в базовых пунктах PDF, что редко удобно для ручной работы. Явные миллиметры или сантиметры делают команду понятнее и предотвращают случайный гигантский или микроскопический лист.

--landscape меняет местами ширину и высоту выбранной бумаги. Это не просто поворот содержимого: создаётся лист другой ориентации, а страницы заново вписываются в него. Для поворота самих логических страниц используется --angle. Разница особенно заметна в N-up: альбомный лист с двумя портретными страницами рядом использует площадь лучше, чем портретный лист с теми же страницами.

Опция --fitpaper true подгоняет бумагу под размер вставляемого документа. Она полезна для одиночной страницы нестандартного формата и для сохранения исходной рамки без добавления A4. Однако при нескольких источниках разных размеров единый выход всё равно должен получить общий размер; выбор опирается на шаблон. Для смешанных документов важно визуально проверить, какая страница стала эталоном.

--pagetemplate N выбирает номер страницы-шаблона, внутри размеров которой масштабируются остальные. --templatesize задаёт шаблон численно. Эти параметры помогают собрать PDF из A4, Letter, слайдов и квадратных изображений, сохранив предсказуемую область содержимого. Они не меняют геометрию исходных объектов и не исправляют неверные CropBox или Rotate; при сложных файлах сначала полезно посмотреть значения pdfinfo -box.

Страница Letter, размещённая pdfjam на листе A4 со смещением

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

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

--scale передаётся механизму включения графики и умножает размер каждой вставленной страницы. Значение меньше единицы создаёт запас, больше единицы увеличивает содержимое. Масштаб применяется вместе с автоматическим вписыванием, если оно не отключено, поэтому 0.9 означает 90 процентов от уже вычисленного размера, а не 90 процентов исходного физического листа. Для точной печати по размеру следует измерить тестовый результат и учитывать настройки драйвера подогнать к странице.

--offset сдвигает начало вставленной страницы по горизонтали и вертикали. Положительное горизонтальное значение перемещает содержимое вправо, положительное вертикальное — вверх в системе координат TeX. Смещение используют для увеличения внутреннего поля под переплёт, центровки сканов и размещения карточки в определённой части листа. В двустороннем документе одно постоянное смещение не создаёт зеркальные поля; для чередования сторон нужны --twoside и правила pdfpages либо отдельные проходы.

--delta задаёт расстояние между ячейками N-up. Горизонтальная и вертикальная величины пишутся в одной строке, например 4mm 6mm. --frame true добавляет рамку вокруг логической страницы. Рамка полезна не только как оформление: она показывает фактическую область после обрезки, помогает контролировать одинаковый масштаб и служит линией реза для черновых макетов. Толщина и стиль рамки подчиняются LaTeX и не заменяют профессиональные метки реза.

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

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

Обрезка содержимого

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

pdfjam scan.pdf \
  --trim '12mm 8mm 10mm 15mm' \
  --clip true \
  --outfile scan-cropped.pdf

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

pdfjam не анализирует белые поля и не ищет границы содержимого. Автоматическое удаление пустых краёв лучше выполнять pdfcrop, ScanTailor или графическим пакетом, а pdfjam использовать после этого для унификации листа и N-up. При пакетной обработке сканов одинаковый trim работает только при стабильном положении страницы. Если развороты сдвигаются от кадра к кадру, постоянная обрезка может удалить текст.

Конвейер pdfjam: обрезка через stdout и последующая компоновка 2 на 1

Две обрезанные страницы на альбомном листе после конвейера pdfjam

Параметры --keepinfo, заголовки и закладки не исправляют области MediaBox, CropBox, TrimBox и BleedBox исходного PDF. LaTeX включает видимую страницу как графику и создаёт собственную геометрию. Если типография требует конкретные боксы, их нужно проверить отдельным инструментом после pdfjam. Для экранного документа также проверяют, не обрезаны ли аннотации и поля форм, потому что интерактивные элементы не переносятся как исходные объекты.

Поворот, отражение и двусторонняя печать

--angle 90 поворачивает вставляемые страницы против часовой стрелки на указанный угол. Для поворота всего листа обычно достаточно --landscape, а angle применяют к содержимому. Если входной PDF уже содержит флаг Rotate, визуальный итог зависит от того, как LaTeX интерпретирует страницу; тестовый рендер надёжнее предположений. При выборочном повороте разные группы страниц обрабатывают отдельными вызовами, затем соединяют.

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

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

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

Пустые, повторяющиеся и перевёрнутые копии

Помимо явного {}, pdfjam предоставляет параметры для пустых страниц. --openright добавляет пустой лист перед первой логической страницей, --openrighteach — перед каждым новым входным файлом. Это упрощает сборку глав и приложений, которые должны начинаться справа. Параметры действуют до N-up и буклетной перестановки, поэтому итоговую позицию нужно оценивать в контексте всей схемы.

--doublepages true вставляет каждую страницу дважды. --duplicatepages N повторяет её N раз. Такие режимы подходят для печати двух одинаковых экземпляров карточки рядом, копий талона или повторяющихся рабочих листов. После дублирования можно применить N-up, чтобы несколько копий попали на один физический лист. Если страницы отличаются полями, рамка помогает обнаружить неодинаковое вписывание.

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

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

Метаданные выходного PDF

pdfjam умеет задать поля Title, Author, Subject и Keywords через --pdftitle, --pdfauthor, --pdfsubject и --pdfkeywords. Значения проходят через LaTeX, поэтому специальные символы, обратная косая черта и фигурные скобки требуют осторожного экранирования. Для русских метаданных результат зависит от движка, кодировки и пакетов, подключённых в преамбуле. После создания поля нужно проверить командой pdfinfo и в целевом просмотрщике.

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

pdfjam report.pdf 1-10 \
  --pdftitle 'Quarterly report' \
  --pdfauthor 'Analytics team' \
  --pdfsubject 'Selected pages' \
  --pdfkeywords 'report, print' \
  --outfile report-print.pdf

Задание и проверка метаданных PDF через pdfjam и pdfinfo

Цифровая подпись исходного PDF после перекомпоновки недействительна как подпись нового документа, потому что создаётся другой файл. pdfjam не предназначен для переноса криптографических подписей. Если требуется подписанный итог, сначала формируют окончательную компоновку, затем подписывают её отдельным инструментом. Аналогично, линейризацию для быстрого просмотра в сети выполняют после всех преобразований, например qpdf.

Закладки, ссылки и интерактивные элементы

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

Опция --link true относится к механизму pdfpages и создаёт цели ссылок для вставленных страниц. --linkname меняет базовое имя, --linkfit задаёт способ отображения цели. Эти параметры не восстанавливают исходные ссылки внутри страницы. Они полезны, когда LaTeX-документ, в который включаются страницы, должен ссылаться на них по именованным целям.

--addtotoc добавляет запись в оглавление LaTeX для указанной вставленной страницы, а --addtolist — в список рисунков, таблиц или другой список. Синтаксис включает номер страницы, тип раздела, уровень, заголовок и метку, поэтому его следует копировать из документации pdfpages и проверять на небольшом примере. Эти функции помогают построить новое оглавление, но не импортируют существующее дерево закладок автоматически.

Если необходимо сохранить исходные закладки и ссылки при простом соединении или извлечении страниц, практичнее qpdf, pikepdf или PDF Arranger. Если же цель — изменить физическую компоновку, собрать 6 слайдов на листе или создать буклет, визуальная модель pdfjam соответствует задаче. Иногда используют два этапа: pdfjam создаёт печатную версию без интерактивности, а исходный PDF остаётся электронной версией.

Команды LaTeX внутри страницы

--pagecommand добавляет LaTeX-команду на каждый выходной лист. По умолчанию используется hispagestyle{empty}, чтобы не появлялись стандартные колонтитулы. Через параметр можно добавить заголовок, номер, водяной знак или изменить стиль страницы. Команда выполняется на уровне выходного листа, а не каждой логической страницы N-up, что важно при размещении нескольких исходных страниц на одном листе.

--pagecommand* действует только на первый выходной лист. --picturecommand выполняется в окружении picture с началом координат в левом нижнем углу и позволяет разместить текст или графический элемент по координатам. Вариант со звёздочкой ограничивает действие первой страницей. Координаты задаются в единицах picture и требуют теста, особенно после изменения размера бумаги.

--preamble добавляет код в преамбулу временного документа. С его помощью подключают пакеты, определяют команды и меняют параметры LaTeX. Это мощный, но рискованный канал: синтаксическая ошибка остановит сборку, а непроверенный текст может выполнить разрешённые движком действия. В автоматизированном сервисе нельзя передавать пользовательский ввод напрямую в preamble, pagecommand или picturecommand.

--latexopts передаёт аргументы движку, --runs N запускает LaTeX несколько раз, а --latex выбирает исполняемый файл. Повторные запуски нужны, когда добавленные команды формируют ссылки или оглавление, которым требуется второй проход. Для обычной перекомпоновки одного прохода достаточно. Увеличение runs прямо умножает время обработки и объём временных операций.

При сложной кастомизации полезно указать --no-tidy и --builddir, чтобы сохранить временный .tex и журнал. В сгенерированном файле видно, какие параметры дошли до pdfpages и graphicx. После диагностики следует вернуть очистку, иначе каталог быстро заполнится временными PDF, логами и вспомогательными файлами. Для воспроизводимости можно сохранить только итоговую команду, собственную конфигурацию и отдельный проверенный фрагмент преамбулы.

Конвейеры через стандартный ввод и вывод

Выход можно направить в /dev/stdout и передать следующей команде через pipe. Это позволяет выполнить обрезку, затем N-up без постоянного промежуточного файла. Второй вызов pdfjam читает PDF из стандартного ввода, если цепочка и оболочка настроены корректно. Такой подход экономит ручные шаги, но усложняет диагностику: сообщение об ошибке может относиться к первой или второй стадии.

pdfjam source.pdf \
  --trim '10mm 10mm 10mm 10mm' --clip true \
  --outfile /dev/stdout \
| pdfjam --nup 2x1 --landscape --frame true \
  --outfile print.pdf

При передаче бинарного PDF нельзя смешивать его с текстовыми сообщениями в stdout. pdfjam выводит прогресс отдельно, но дополнительные команды в сценарии должны отправлять диагностику в stderr. Нельзя вставлять echo между стадиями. Для больших файлов pipe уменьшает число постоянных записей, однако каждая стадия всё равно создаёт собственную временную область и запускает LaTeX.

В производственном сценарии промежуточный файл часто надёжнее: его можно проверить, повторно использовать и оставить при ошибке второй стадии. Компромисс — временный каталог, удаляемый только после успешного завершения. В shell для этого применяют mktemp -d и trap. Тогда операция остаётся атомарной, а журнал содержит путь к промежуточному результату при сбое.

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

Пакетная обработка

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

pdfjam --batch chapter-*.pdf \
  --nup 2x1 --landscape \
  --suffix two-up \
  --outfile prepared

Маска chapter-*.pdf раскрывается оболочкой до запуска pdfjam. Если файлов нет, поведение зависит от shell: может передаться буквальная маска. Надёжный сценарий сначала формирует массив и проверяет его длину. Имена с пробелами безопаснее получать через find -print0 и читать нулевые разделители, а не цикл for f in $(find ...), который ломает пробелы и переводы строк.

Пакетная обработка двух PDF командой pdfjam --batch

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

Для параллельного запуска можно использовать xargs -P или GNU Parallel, но каждый экземпляр запускает LaTeX и потребляет временное место. Число процессов ограничивают по ядрам, памяти и скорости диска. Нельзя направлять несколько задач в один и тот же --builddir или одно имя результата. Для повторяемости в журнал записывают команду, входной SHA-256, версию pdfjam, версию LaTeX и хеш выходного файла.

Конфигурационные файлы

Постоянные значения можно записать в pdfjam.conf. Скрипт ищет системные и пользовательские файлы в заданном порядке; более поздняя настройка перекрывает предыдущую. В конфигурации удобно хранить путь к LaTeX, формат бумаги, стандартный суффикс и проверенные параметры. Не стоит прятать туда неожиданную компоновку вроде nup или большого смещения: команда будет выглядеть простой, а результат окажется трудно объяснить другому пользователю.

pdfjam --configpath показывает путь поиска, а --vanilla запрещает чтение конфигурации. Vanilla полезен для диагностики и воспроизводимых сборок: если команда работает только без настроек, причина находится в одном из файлов conf. В автоматизации часто используют vanilla и задают всё явно, чтобы пользовательская настройка на сервере не изменила результат после обновления окружения.

При обычном запуске pdfjam сообщает, какие настройки прочитаны. Эти строки стоит сохранять в лог. Если параметр кажется проигнорированным, нужно проверить, не задаётся ли он позже в командной строке или другом conf. Одновременная настройка paper и papersize создаёт конфликт; скрипт выбирает один вариант и сообщает об этом. Явная одна настройка понятнее.

Конфигурация исполняется оболочкой, поэтому права доступа критичны. Файл не должен быть доступен для записи посторонним пользователям. Не следует копировать непроверенные строки из интернета: это не нейтральный INI, а набор shell-присваиваний. Для командного проекта конфигурацию хранят рядом со сценарием, проверяют в контроле версий и запускают с известным HOME или явными параметрами.

Поддерживаемые форматы и практические границы

Основной вход — PDF. JPEG и PNG можно добавлять как отдельные страницы. PostScript и EPS зависят от возможностей LaTeX-цепочки и установленной конвертации; в современных рабочих процессах надёжнее заранее преобразовать их в PDF. Форматы DOCX, ODT, HTML, TIFF с несколькими страницами, DjVu и изображения HEIC напрямую не являются универсальными входами pdfjam. Их сначала переводят в PDF или отдельные поддерживаемые изображения.

pdfjam не редактирует текст, шрифты и векторные объекты внутри страницы. Он не исправляет опечатку, не удаляет отдельную картинку, не добавляет форму и не выполняет OCR. Обрезка скрывает часть графического объекта в новой компоновке, но не превращает скан в распознанный текст. Для контентного редактирования нужен PDF-редактор; для OCR — OCRmyPDF или распознающая программа; для структурных изменений — qpdf или библиотека PDF.

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

Векторная графика и текст обычно остаются резкими, потому что страницы включаются как PDF-графика, а не обязательно растеризуются. Однако часть сложных шрифтов, прозрачностей или цветовых пространств может вести себя иначе в зависимости от движка. Качество проверяют рендером и просмотром свойств шрифтов. Для полиграфии дополнительно контролируют CMYK, специальные цвета, overprint и PDF/X — pdfjam не является полноценным препресс-проверяющим средством.

Размер файла может увеличиться из-за повторного включения ресурсов или уменьшиться благодаря переработке структуры. Предсказывать его только по числу страниц нельзя. Если цель — сжатие, pdfjam не оптимизатор. Сначала выполняют нужную компоновку, затем применяют безопасную оптимизацию qpdf или Ghostscript с настройками, соответствующими качеству. Агрессивное растровое сжатие после pdfjam способно ухудшить мелкий текст раздаточного материала.

Типовые рабочие процессы

Раздаточный материал из презентации

Для слайдов 16:9 сначала выбирают бумагу и сетку, которая не оставит чрезмерные поля. На A4 часто подходят 2x3 с портретной бумагой или 2x2 с альбомной. Рамка отделяет слайды, delta создаёт место между ними, scale оставляет запас. После создания проверяют мелкий текст на реальном принтере: шесть слайдов могут быть математически размещены правильно, но стать нечитаемыми. В таком случае уменьшают число слайдов на листе, а не увеличивают scale до обрезания.

Раздаточный материал 2 на 3, созданный pdfjam из презентации

Сборка отчёта из нескольких источников

Обложку, основную часть, приложения и изображения перечисляют в нужном порядке с диапазонами. Формат бумаги задают явно, чтобы Letter и A4 не привели к разному масштабу. Метаданные устанавливают после выбора последнего источника, а число страниц проверяют по ожидаемой формуле. Если электронные закладки важны, создают две версии: печатную через pdfjam и электронную структурным инструментом.

Нормализация сканов

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

Двусторонняя печать без нужного режима драйвера

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

Карточки и повторяющиеся формы

Одностраничную форму дублируют через duplicatepages, размещают сеткой N-up, включают frame и задают delta под рез. Для физически точного размера отключение autoscale допустимо только после измерения исходника. Домашний принтер часто добавляет непечатаемые поля и автоматически масштабирует, поэтому в драйвере выбирают 100 процентов и печатают линейку-контроль. pdfjam не добавляет вылеты и метки реза автоматически.

Ошибки и способы устранения

Команда найдена, но PDF не создаётся

Сначала проверяют pdflatex и kpsewhich pdfpages.sty. Затем запускают минимальный вызов на одностраничном PDF с --no-tidy и отдельным builddir. В журнале LaTeX ищут первую строку с восклицательным знаком, а не последнее общее сообщение. Частая причина — отсутствующий пакет, запрет записи во временный каталог, неверный путь к движку или повреждённый вход.

Ошибка номера страницы

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

Файл с пробелами или необычным расширением не читается

Путь заключают в одинарные кавычки и не используют небезопасную подстановку. Для файла без .pdf включают --checkfiles и проверяют file -Lb. Если имя содержит перевод строки или управляющие символы, его лучше переименовать. Нестандартное расширение не делает неподдерживаемый формат PDF; проверка типа только распознаёт известное содержимое.

Результат имеет неожиданный размер

Проверяют pdfinfo -box у источника и результата, затем явные paper, papersize, fitpaper, pagetemplate и templatesize. Одновременные параметры могут перекрывать друг друга. Если страница Letter оказалась на A4 с полями, это нормальное следствие выбранной бумаги. Если нужен исходный размер, используют fitpaper на простом документе или структурное объединение другим инструментом.

Страницы слишком маленькие

Причина обычно в сетке N-up, больших delta, offset, рамке, выбранном формате или дополнительном scale. Убирают параметры по одному и сравнивают. Не следует сразу ставить scale больше единицы: можно скрыть текст за краем. Для слайдов разумнее перейти с 2x3 на 2x2. Для карточек измеряют доступную область принтера.

Пропали ссылки, закладки или поля формы

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

Временные файлы занимают место

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

Слишком много страниц вызывает сбой движка

Большое число включений может упереться в ресурсы TeX или особенности обработки изображений. Сначала делят документ на части и проверяют, воспроизводится ли ошибка. В документации приведён обходной фрагмент preamble, меняющий немедленность загрузки PDF-изображений; его применяют только после сохранения журнала и на копии. Более устойчивый путь для огромной сборки — обработать главы отдельно, затем объединить готовые части структурным инструментом.

Контроль качества результата

Минимальная проверка включает код завершения, наличие файла, размер больше нуля, ожидаемое число страниц и корректный формат бумаги. Число страниц можно вычислить: например, восемь исходных страниц при 2x2 должны дать два выходных листа, а буклет из восьми страниц при 2x1 — четыре стороны. Несовпадение указывает на пропущенный диапазон, пустые позиции или иной режим.

Визуально проверяют первую, последнюю и несколько средних страниц. Для N-up смотрят порядок чтения, рамки и интервалы; для буклета — пары номеров; для trim — отсутствие обрезанного текста; для offset — симметрию полей; для mixed input — масштаб изображений. Рендер в PNG удобен для автоматического архива, но не заменяет просмотр PDF на большом увеличении.

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

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

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

Сравнение pdfjam с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
pdfjamВоспроизводимого N-up, буклетов, тетрадей, масштабирования и печатной перекомпоновки из командной строкиТребует LaTeX и не сохраняет исходную интерактивность PDF
PDF CommanderВизуального редактирования, объединения, разделения и повседневной работы со страницами без командНе ориентирован на сложные shell-конвейеры и LaTeX-компоновку
qpdfСтруктурного объединения, выбора страниц, шифрования, проверки и преобразований с сохранением содержимогоНе выполняет развитый N-up и печатный спуск как pdfjam
PDF ArrangerРучной перестановки, поворота, обрезки и объединения страниц по миниатюрамМассовые повторяемые задания сложнее автоматизировать
PDFsam BasicГрафического разделения, слияния, извлечения, поворота и смешивания страницБазовые модули не заменяют гибкую командную компоновку N-up
pdftk-javaОбъединения, разбиения, работы с формами и служебными свойствами PDF в сценарияхНе предназначен для точной компоновки нескольких страниц на печатном листе

Выбор определяется тем, меняется ли структура PDF или его печатная геометрия. Для буклета, тетрадей, раздаточных листов и повторяемой компоновки лучше подходит pdfjam. Для сохранения закладок, ссылок, шифрования и копирования страниц без переразметки разумнее qpdf. PDF Arranger и PDFsam Basic удобны, когда порядок нужно подобрать глазами по миниатюрам. PDF Commander стоит выбирать для редактирования содержимого и привычного интерфейса, а pdftk-java — для форм и служебных операций в командных сценариях.

Практические советы по безопасным сценариям

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

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

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

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

Точная работа с диапазонами и пустыми позициями

В длинных заданиях полезно отделять логический порядок от печатной компоновки. Сначала создают промежуточный PDF только с нужными страницами и проверяют его последовательность, затем вторым вызовом применяют N-up, booklet или signature. Такой двухэтапный процесс добавляет файл, но резко упрощает поиск ошибки: если порядок неверен, проблема в диапазонах; если порядок верен, а лист выглядит плохо, проблема в геометрии. В одном гигантском вызове эти причины смешиваются.

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

Пустые элементы участвуют в дальнейшей компоновке как полноценные логические страницы. В сетке 2x2 один {} сдвигает все последующие страницы на одну ячейку; в booklet он влияет на пары после перестановки. Поэтому пустые позиции добавляют до или после буклетной логики осознанно. Если цель — оставить пустую оборотную сторону перед главой, openright обычно понятнее ручного списка, потому что выражает намерение и автоматически учитывает начало каждого файла.

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

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

Физический размер и шаблоны страниц

Для заданий с реальными размерами недостаточно увидеть правильную картинку на экране. PDF хранит размеры в пунктах, LaTeX работает со своими единицами, а принтер может дополнительно масштабировать. Надёжная методика включает контрольный квадрат или линейку известной длины, вывод pdfinfo, печать при 100 процентах и измерение. Если 100 мм превращаются в 97 мм, проблему сначала ищут в драйвере и настройке вписать, а не компенсируют scale в исходной команде.

Параметр papersize задаёт физический выходной лист, а templatesize — область, относительно которой согласуются вставленные страницы. Эти величины могут совпадать, но решают разные задачи. Например, лист A4 можно использовать как бумагу, а шаблон 180x260 мм — как полезную область под переплёт. После масштабирования offset перемещает эту область. Такая схема удобна для повторяемых макетов, однако границы не видны без временной рамки.

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

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

Noautoscale отключает защитное вписывание и потому требует осторожности. Страница может выйти за пределы листа, особенно после angle, trim или offset. Режим полезен для заранее подготовленного шаблона, где содержимое уже имеет нужный размер, но не для случайных офисных документов. При первом тесте включают frame и рендерят края на большом увеличении, чтобы увидеть отсечение.

Производительность на больших документах

Время обработки складывается из чтения источников, построения временного LaTeX, работы движка и записи результата. Сложность растёт не только с числом выходных страниц: N-up с сотнями входных объектов требует открыть и включить каждый объект, а изображения большого разрешения увеличивают ввод-вывод. Быстрый диск и временный каталог на локальном файловом пространстве часто дают больший эффект, чем дополнительное ядро, потому что один запуск LaTeX не всегда эффективно распараллеливается.

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

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

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

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

Интеграция с shell, Make и автоматическими заданиями

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

print-handout.pdf: slides.pdf
	pdfjam slides.pdf --nup 2x3 --frame true \
	  --delta '2mm 3mm' --outfile $@

В CI-задаче устанавливают фиксированный набор TeX-пакетов, запускают pdfjam, проверяют pdfinfo и публикуют результат как артефакт. Фиксация окружения важна, потому что изменения pdfpages или LaTeX могут повлиять на геометрию и журнал. Контрольный документ с крупными номерами страниц служит smoke-тестом. Для визуальной регрессии рендерят первую страницу и сравнивают её с эталоном с допустимым порогом.

В shell-функции полезно разделять параметры на массивы: общие настройки бумаги, параметры конкретной компоновки и список входов. Это уменьшает риск потерять кавычки. В bash каждый элемент массива передаётся как отдельный аргумент через "${array[@]}". Не следует хранить всю команду одной строкой и выполнять через eval. Такой способ ломается на пробелах и открывает путь к интерпретации специальных символов.

Автоматическое имя результата строят из базового имени и описательного суффикса: -2up-a4, -booklet, -cropped. Дата и случайный идентификатор нужны во временном имени, но не всегда полезны в опубликованном. Перед заменой существующего файла сценарий сравнивает хеши или требует явный флаг force. Это компенсирует отсутствие интерактивного предупреждения о перезаписи.

После успешной сборки можно сформировать машинный отчёт JSON: входные хеши, команда без секретных путей, число страниц, размер бумаги, размер файла и SHA-256 результата. Сам pdfjam такой отчёт не создаёт, но его легко собрать из shell, pdfinfo и sha256sum. Для архива это лучше, чем полагаться на имя файла и дату изменения.

Чтение сообщений и журналов

Обычный вывод pdfjam показывает начало работы, прочитанные настройки, команду LaTeX и имя результата. Эти сообщения полезны для диагностики, но в пакетной обработке могут быть слишком подробными. --quiet уменьшает комментарии, однако ошибки LaTeX всё равно нужно сохранять. Оптимальная схема направляет стандартный вывод и stderr в журнал, а пользователю показывает короткий статус и путь к полному файлу при сбое.

При ошибке сначала ищут первое существенное сообщение LaTeX. Последние строки часто лишь сообщают, что PDF не создан. Ошибка file not found может относиться к входу, пакету или изображению; полный путь рядом с ней помогает различить причины. Ошибка undefined control sequence обычно указывает на неверный код preamble или pagecommand. Ошибка page does not exist — на диапазон. Overfull box чаще предупреждает о выходе содержимого за область и требует визуальной проверки.

No-tidy сохраняет временный .tex, .log и промежуточные файлы. В .tex можно увидеть фактический вызов \includepdf и переданные параметры. Это особенно полезно, когда оболочка съела звёздочку, фигурные скобки или обратную косую черту. Сравнение ожидаемой команды с .tex показывает, на каком уровне изменился текст: shell, pdfjam или LaTeX.

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

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

Когда pdfjam лучше не использовать

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

Для редактирования текста, OCR, удаления конфиденциального содержимого, цифровой подписи и проверки PDF/A или PDF/X нужны специализированные средства. Визуальная обрезка не является безопасной редакцией: скрытая область исходной страницы может оставаться частью включённого объекта или быть доступна иным способом в зависимости от цепочки. Настоящее удаление данных выполняют инструментом редактирования и проверяют извлечение.

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

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

Частые вопросы о pdfjam

Можно ли просто объединить два PDF?

Да. Перечислите оба файла и задайте outfile. Если нужно сохранить исходные разные размеры страниц и интерактивные элементы, лучше выбрать структурный объединитель. pdfjam создаст единый формат выходных листов и может потерять закладки и ссылки.

Как извлечь несколько страниц?

После имени файла укажите диапазон, например 2,5-8,last. Выход будет содержать страницы именно в записанном порядке. Для обратного порядка используйте диапазон от большего номера к меньшему.

Как сделать две страницы на одном листе?

Используйте --nup 2x1. Для двух портретных страниц обычно добавляют --landscape. Интервал задаётся delta, рамка — frame. Перед печатью проверьте масштаб и отключите дополнительное вписывание в драйвере.

Как сделать буклет?

Примените --booklet true --nup 2x1 --landscape. Распечатайте тест двусторонне и проверьте край переворота. Для длинной книги используйте signature с числом, кратным четырём.

Можно ли сохранить исходные гиперссылки?

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

Можно ли редактировать текст?

Нет. pdfjam меняет порядок и геометрию страниц. Исправление текста, изображений, форм и аннотаций выполняют в редакторе до компоновки.

Почему нужен LaTeX?

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

Как сохранить метаданные?

Используйте keepinfo при доступном pdfinfo или задайте title, author, subject и keywords явно. После обработки проверьте поля. Закладки и полный XMP этим способом не сохраняются.

Что делать с именами на русском языке?

Заключайте путь в кавычки, используйте UTF-8-локаль и не собирайте команду через небезопасную конкатенацию. При проблемах с кодировкой командной строки проверьте enc и iconv. Сам PDF может содержать русский текст независимо от имени файла.

Как увидеть временный LaTeX-файл?

Отключите tidy и задайте builddir. После сбоя изучите .tex и .log, затем верните автоматическую очистку. Не используйте общий builddir для параллельных процессов.

Подходит ли pdfjam для конфиденциальных документов?

Обработка не требует отправки файла стороннему веб-сервису, но безопасность зависит от компьютера, временного каталога, прав доступа и сценария. Временные копии нужно удалять, журналы — защищать, а непроверенный LaTeX-код — запрещать.

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

Начинайте с минимальной команды выбора страниц и явного outfile. Затем добавляйте один класс параметров за раз: сначала бумагу и ориентацию, потом N-up, затем интервалы, масштаб и обрезку. После каждого шага проверяйте число страниц и первый рендер. Такая последовательность быстро показывает, какой параметр изменил геометрию, и не превращает длинную строку в набор догадок.

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

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