pdfunite a.pdf b.pdf out.pdf соединяет документы, а pdfseparate in.pdf page-%d.pdf разбирает один на части. Обе команды из poppler-utils, работают быстро и без потерь. Чего они не умеют — вытащить диапазон страниц одним документом и сжать файл — делает ghostscript, и это разделение труда и есть суть статьи.
1. Сколько здесь страниц
$ clai сколько страниц в merged.pdf→ pdfinfo merged.pdf | grep '^Pages'Pages: 4
pdfinfo печатает пару десятков строк метаданных, а нужна обычно одна. Она же служит быстрой проверкой после любой операции ниже.
2. Соединить несколько файлов
$ clai склей invoice.pdf и contract.pdf в один документ→ pdfunite invoice.pdf contract.pdf merged.pdf
Последний аргумент — всегда результат, всё перед ним — источники в порядке склейки. Команда ничего не печатает, проверяйте через pdfinfo.
3. Разобрать по страницам
$ clai разбей merged.pdf по одной странице в файл→ pdfseparate merged.pdf page-%d.pdfpage-1.pdfpage-2.pdfpage-3.pdfpage-4.pdf
%d обязателен — на его место подставляется номер страницы. Список выше получен через ls -1, сама pdfseparate молчит.
4. Вырезать диапазон страниц
$ clai вытащи страницы со 2 по 3→ pdfseparate -f 2 -l 3 merged.pdf slice-%d.pdfslice-2.pdfslice-3.pdf
-f — первая страница, -l — последняя. Обратите внимание на результат: два файла, а не один документ из двух страниц, и нумерация сохранила исходные номера.
5. Диапазон одним документом
$ clai вытащи страницы 2-3 в один документ→ gs -q -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dFirstPage=2 -dLastPage=3 -sOutputFile=pages-2-3.pdf merged.pdf
У poppler такой команды нет, поэтому за дело берётся ghostscript. Проверено: pdfinfo pages-2-3.pdf показывает Pages: 2. Без gs путь такой: pdfseparate, затем pdfunite slice-2.pdf slice-3.pdf range.pdf — те же две страницы.
6. Уменьшить размер файла
$ clai сожми pdf, чтобы влез во вложение письма→ gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=small.pdf merged.pdf
Проверено на демо-файле: 84991 байт до, 31876 после — почти втрое меньше. /ebook — средний профиль; /screen жмёт сильнее и это видно на картинках, /prepress бережёт качество. Текст в любом случае не страдает: сжимаются растровые изображения внутри.
Gotchas
pdfuniteперезаписывает последний аргумент. Это место всегда считается выходным файлом.pdfunite part1.pdf part2.pdfбез третьего имени уничтожитpart2.pdf— привычки «последний файл тоже источник» здесь нет.pdfseparateничего не собирает. Даже с-fи-lна выходе будет горка одностраничных файлов. Собирать обратно — работаpdfuniteили ghostscript.- Зашифрованный PDF не откроет ни одна из них. Сначала снимается пароль (
qpdf --decrypt, где он есть), иначе обе утилиты просто откажутся читать файл.
Related questions
Как повернуть страницы? Ghostscript умеет переиздать файл с -dAutoRotatePages=/None, но повернуть одну конкретную страницу заметно проще в qpdf.
Как вытащить текст? pdftotext file.pdf - напечатает текст в терминал. Для сканов без текстового слоя нужен OCR.
Как превратить страницы в картинки? pdftoppm -png -r 150 file.pdf page создаст page-1.png, page-2.png и далее с разрешением 150 dpi.
See also
- Пакетно изменить размер картинок
- Разрезать большой файл на части и собрать обратно
- Конвертировать и сжать видео через ffmpeg
CliAI знает, какой из двух наборов инструментов делает описанную вами работу, и показывает команду до запуска. Поставить одной строкой.