Автор Тема: Печать брошюры из PDF со смешанными портретными и альбомными листами  (Прочитано 3818 раз)

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 418
    • Email
Понадобилось распечатать брошюру из файла PDF с разноориентированными листами.
Как оказалось, evince/atril, adobe reader этого не могут. Портят готовые страницы оборачивая их своими не настраиваемыми и не отключаемыми полями, да и с ориентацией неадекватно работают.
Страницы в PDF можно предварительно повернуть в pdfedit, pdfmod, pdftk. Однако, pdfedit портит повёрнутый русский текст; pdfmod портит таблицу xref в выходном файле, кроме того вот совсем не хочется, чтобы в системе исполнялись ехе-файлы; pdftk — вроде нормально делает, но это всё-таки лишняя сущность.
Помог ghostscript.

Пример для печати портретных страниц формата а6 на альбомные листы а5:

Следующая команда сориентирует в указанное положение все страницы, если они ещё и разного размера, то смасштабирует и отцентрирует:
gs -q -dNOPAUSE -dBATH -P- -dSAFER -sDEVICE=pdfwrite -sOutputFile=oriented.pdf -dDEVICEWIDTHPOINTS=297 -dDEVICEHEIGHTPOINTS=420 -dFitPage -dFIXEDMEDIA -dAutoRotatePages=/None -dCompatibilityLevel=1.4 -f infile.pdf -c quit
где 297 и 420 пункты (1/72 дюйма), для стандартных форматов можно посмотреть в документации ghostscript (файл Use.htm), для нестандартных — рассчитать из сантиметров/миллиметров. Если требуется можно указать ширину больше чем высоту, тогда страницы будут повёрнуты в альбомную ориентацию.

Далее, полученный файл oriented.pdf пропускаем через конвейер:
pdf2ps -dLanguageLevel=3 oriented.pdf - | psbook | psnup -pa5 -W10.5cm -H14.8cm -l -2 | ps2pdf -sPAPERSIZE=a5 -dAutoRotatePages=/None -dCompatibilityLevel=1.4 - booklet.pdf
тут:
   -pa5 размер выходных листов (вместо этого можно указать как -w14.8cm -h21.0cm).
   -W10.5cm -H14.8cm размер входных листов (psnup не знает формат а6 и не понимает размеры в пунктах).
Вместо -sPAPERSIZE=a5 (при нестандартных размерах листа можно указать -dDEVICEWIDTHPOINTS=пунктов -dDEVICEHEIGHTPOINTS=пунктов).

Полученный файл booklet.pdf можно печатать уже с помощью тех же evince/atril, adobe reader, отключив масштабирование, поворот, центрирование.

Для работы требуются пакеты ghostscript-common, ghostscript-utils, psutils.

Файлы с примерами во вложениях. Может кому пригодится.
« Последнее редактирование: 18.11.2019 19:11:29 от stranger573 »

Оффлайн eugrus

  • Начинающий
  • *
  • Сообщений: 13
Любопытно!

Вот разъяснения от ChatGPT:

gs -q -dNOPAUSE -dBATH -P- -dSAFER -sDEVICE=pdfwrite -sOutputFile=oriented.pdf -dDEVICEWIDTHPOINTS=297 -dDEVICEHEIGHTPOINTS=420 -dFitPage -dFIXEDMEDIA -dAutoRotatePages=/None -dCompatibilityLevel=1.4 -f infile.pdf -c quit

Эта команда использует Ghostscript для конвертации PDF-файла infile.pdf в новый файл oriented.pdf, который будет в портретной ориентации с заданным размером страницы 297x420 мм (или формата A3).

Вот поэтапное описание команды:

gs - запускает Ghostscript
-q - запуск в quiet mode
-dNOPAUSE - отключает паузы между страницами
-dBATCH - отключает режим пакетной обработки
-P- - использует по умолчанию первый доступный принтер (или выводит ошибку, если принтер недоступен)
-dSAFER - запускает Ghostscript в "безопасном" режиме, который ограничивает доступ к файловой системе и системным ресурсам
-sDEVICE=pdfwrite - указывает Ghostscript использовать устройство вывода pdfwrite, которое записывает выходные данные в новый PDF-файл
-sOutputFile=oriented.pdf - задает имя выходного файла
-dDEVICEWIDTHPOINTS=297 - задает ширину страницы в единицах измерения points (1 point = 1/72 дюйма)
-dDEVICEHEIGHTPOINTS=420 - задает высоту страницы в points
-dFitPage - подгоняет содержимое PDF-файла к размеру страницы
-dFIXEDMEDIA - игнорирует любые установки размера страницы во входном файле
-dAutoRotatePages=/None - отключает автоматическое поворачивание страниц на основе содержимого
-dCompatibilityLevel=1.4 - устанавливает уровень совместимости PDF-файла
-f infile.pdf - указывает Ghostscript использовать infile.pdf как входной файл
-c quit - завершает Ghostscript после обработки входного файла
Таким образом, команда выполняет обработку PDF-файла infile.pdf и записывает результат в новый файл oriented.pdf, используя опции Ghostscript для управления размером страницы и другими параметрами.


pdf2ps -dLanguageLevel=3 oriented.pdf - | psbook | psnup -pa5 -W10.5cm -H14.8cm -l -2 | ps2pdf -sPAPERSIZE=a5 -dAutoRotatePages=/None -dCompatibilityLevel=1.4 - booklet.pdf

Эта команда выполняет несколько действий в цепочке обработки PDF-файла:

1. Конвертирует файл oriented.pdf в формат PostScript с помощью утилиты pdf2ps.
2. Использует утилиту psbook для переупорядочивания страниц в файле PostScript в порядке, который оптимален для печати на двух сторонах.
3. Использует утилиту psnup для размещения нескольких страниц PostScript на одном листе бумаги.
4. Конвертирует файл PostScript обратно в формат PDF с помощью утилиты ps2pdf.
В итоге получается файл booklet.pdf, который представляет собой книжку с размером страницы A5 и размещенными на каждой странице двумя изначальными страницами в порядке, оптимизированном для печати на двух сторонах.