Linux-инструмент для измельчения PDF-файлов на несколько страниц

У меня есть куча файлов PDF, на которых были созданы две «настоящие» страницы на одной странице PDF; Я бы хотел нарезать их пополам и поместить каждую половину на отдельную страницу. По сути, мне нужно что-то, что полностью противоположно pdfnup (или psnup ). Поиск Google и apt-cache не дает мне никакой любви.

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

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

Вы можете решить это с помощью Ghostscript. pdftk не может этого сделать (насколько мне известно). Я дам вам шаги в командной строке, чтобы сделать это вручную. Это будет легко выполнить как процедуру, также с различными параметрами для размеров страниц и номеров страниц. Но ты сказал, что можешь сделать это сам 😉

Как решить это с помощью Ghostscript …

… и для удовольствия от этого, я недавно сделал это не с входным файлом с «двойными» страницами, а с «тройными». Вы можете прочитать ответ для этого случая здесь .

Ваш случай еще проще. У вас похоже что-то похожее на это:

 +------------+------------+ ^ | | | | | 1 | 2 | | | | | 595 pt | | | | | | | | | | | | +------------+------------+ v ^ fold v +------------+------------+ ^ | | | | | 3 | 4 | | | | | 595 pt | | | | | | | | | | | | +------------+------------+ v <---------- 842 pt --------> 

Вы хотите создать 1 PDF с 4 страницами, каждый из которых имеет размер 421 pt x 595 pt.

Первый шаг

Давайте сначала извлечем левые части с каждой из входных страниц:

 gs \ -o left-sections.pdf \ -sDEVICE=pdfwrite \ -g4210x5950 \ -c "<</PageOffset [0 0]>> setpagedevice" \ -f double-page-input.pdf 

Что сделали эти параметры?

Во-первых, знайте, что в PDF 1 дюйм == 72 балла . Тогда остальное:

  • -o ...............: Именование выходного файла. -dBATCH -dNOPAUSE -dSAFER также используется -dBATCH -dNOPAUSE -dSAFER .
  • -sDEVICE=pdfwrite : нам нужен формат PDF.
  • -g................: устанавливает размер выходного носителя в пикселях. Разрешение по умолчанию для pdfwrite составляет 720 dpi. Следовательно, умножьте на 10, чтобы получить соответствие для PageOffset.
  • -c "..............: просит Ghostscript обрабатывать данный фрагмент кода PostScript непосредственно перед основным входным файлом (который должен следовать с -f ).
  • <</PageOffset ....: устанавливает смещение изображения страницы на носитель. (Конечно, для левых страниц сдвиг на [0 0] не имеет реального эффекта.)
  • -f ...............: обрабатывать этот входной файл.

Какой результат достиг последней команды?

Вот этот:

 Output file: left-sections.pdf, page 1 +------------+ ^ | | | | 1 | | | |595 pt | | | | | | | | | +------------+ v Output file: left-sections.pdf, page 2 +------------+ ^ | | | | 3 | | | |595 pt | | | | | | | | | +------------+ v <-- 421 pt --> 

Второй шаг

Затем правые секции:

 gs \ -o right-sections.pdf \ -sDEVICE=pdfwrite \ -g4210x5950 \ -c "<</PageOffset [-421 0]>> setpagedevice" \ -f double-page-input.pdf 

Обратите внимание на отрицательное смещение, так как мы перемещаем страницу влево, сохраняя область просмотра неподвижной.

Результат:

 Output file: right-sections.pdf, page 1 +------------+ ^ | | | | 2 | | | |595 pt | | | | | | | | | +------------+ v Output file: right-sections.pdf, page 2 +------------+ ^ | | | | 4 | | | |595 pt | | | | | | | | | +------------+ v <-- 421 pt --> 

Последний шаг

Теперь мы объединяем страницы в один файл. Мы могли бы это сделать и с ghostscript, но вместо этого будем использовать pdftk , потому что это быстрее для этой работы:

 pdftk \ A=right-sections.pdf \ B=left-sections.pdf \ shuffle \ output single-pages-output.pdf verbose 

Готово. Вот желаемый результат. 4 разных страницы размером 421×595 точек.

Результат:

 +------------+ +------------+ +------------+ +------------+ ^ | | | | | | | | | | 1 | | 2 | | 3 | | 4 | | | | | | | | | |5595 pt | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ v <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> 

Существует инструмент pdfposter, который можно использовать для создания PDF-файлов с несколькими страницами для одной страницы ввода (разбиение или разбиение страниц). Он похож на poster инструмента, который делает то же самое для файлов PostScript.

Итак, после намного большего поиска (кажется, что «PDF cut pages» – это гораздо лучший поиск), я нашел небольшой скрипт под названием unpnup который использует poster , преобразование PDF / PS и pdftk чтобы делать именно то, что мне нужно. Это немного длинный путь, но он намного превосходит другие методы, которые я нашел (например, использование imagemagick), потому что он не растеризует страницы, прежде чем выплевывать их.

На всякий случай, когда mobileread уходит по какой-то причине, ядро ​​сценария (лицензированного под GPLv2 или позже Харальдом Хакенбергом <hackenberggmx.at> ) выглядит следующим образом:

 pdftk "$1" burst for file in pg*.pdf; do pdftops -eps $file poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps epstopdf `basename $file .pdf`.tps done pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf 

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

У меня также был отсканированный PDF-файл, на котором было 2 страницы. Это было 11 х 8,5 (дюймов) сканирование брошюры с надписью, которая была сшита при первоначальном сканировании, поэтому: страница PDF 1 = задняя и передняя обложка; PDF page 2 = страницы 2 и 3 и т. Д. Это отлично читается на экране, но вы не можете распечатать его, а затем сшивать его, чтобы сделать больше копий буклета.

Мне нужно было напечатать это на дуплексном копировальном аппарате; Т.е. превратить его НАЗАД в «наложенный» PDF, готовый к печати. Поэтому, используя решение Курта, я сделал это (ахм) «однострочным», чтобы преобразовать его обратно в пол-страницы, в правильном порядке страницы. Он будет работать для любой высоты и ширины, а также для любого количества страниц. В моем случае у меня был 40-страничный буклет (20 отсканированных страниц в формате PDF).

 HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \ count=$(set -xe; \ gs -o left.pdf -sDEVICE=pdfwrite \ -g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \ -c "<</PageOffset [0 0]>> setpagedevice" \ -f "$ORIG_FILE_PATH" >/dev/null; \ gs -o right.pdf -sDEVICE=pdfwrite \ -g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \ -c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)") 0]>> setpagedevice" \ -f "$ORIG_FILE_PATH" | grep Page | wc -l ); \ echo '>>>>>' Re-ordering $count pages...; \ (set -xe; pdftk A=right.pdf B=left.pdf cat \ A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \ output ordered.pdf); \ echo "Done. See ordered.pdf" 

Вам нужно только изменить первые несколько параметров в этой команде, чтобы указать HEIGHT и WIDTH и ORIG_FILE_PATH. Остальная часть команды вычисляет различные размеры и вызывает gs два раза, затем pdftk. Он даже посчитает страницы в вашем сканировании, а затем создаст правильную спецификацию сортировки (для сценария, который я дал).

Он выводит некоторый прогресс в том, что он делает, что будет выглядеть следующим образом:

 +++ perl -e 'print((11 / 2) * 720)' +++ perl -e 'print(8.5 * 720)' ++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0 0]>> setpagedevice' -f original.pdf ++ wc -l ++ grep Page +++ perl -e 'print((11 / 2) * 720)' +++ perl -e 'print(8.5 * 720)' +++ perl -e 'print((11 / 2) * 72)' ++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396 0]>> setpagedevice' -f original.pdf >>>>> Re-ordering 20 pages... ++ set +xe + pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf Done. See ordered.pdf 

Затем, чтобы получить набросок страницы, который вам нужен для распечатанного буклета, вы просто «печатаете» ordered.pdf на размер пользовательской страницы точно такого размера, который вам нужен (в моем примере, 5.5 x 8.5), отправляя его в буклет »(В моем случае я использовал« Создать буклет »Кристофа Фогельбуша для Mac с сайта http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html ).

В результате PDF теперь вернется к исходному размеру страницы 11 x 8.5 с 2 страницами на листе, но заказ будет таким, что вы можете распечатать его двустороннее, короткое связывание и voilà! У вас будет распечатка, которую вы можете сделать ксерокопией, сложить и вышить седло, воспроизведя исходный буклет, не разбирая (или даже обязательно просматривая) оригинал.

Надеюсь, это поможет кому-то!

Основываясь на ответе piptas выше:

В окнах для разбиения PDF-файлов формата Letter с одним обложкой в ​​начале, для меня работало отлично (обратите внимание на использование [-612 0] на втором шаге, положительное значение создало пустые страницы, потому что оно исказилось неправильно .)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Обратите внимание на использование -dFirstPage=2 который инструктирует gs начать обработку на стр. 2.

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

Это создает right-sections.pdf таким же образом. И теперь обложка:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

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

 mkdir input_file copy cover.pdf input_file\0000.pdf pdftk left-sections.pdf burst output input_file\%04d_A.pdf pdftk right-sections.pdf burst output input_file\%04d_B.pdf 

Затем я присоединяюсь к файлам PDF в этом каталоге, в алфавитном порядке (и, к счастью, это означает, что они отсортированы в правильном порядке!), И я снова запускаю результат через ghostscript, чтобы исправить «Предупреждение: номер поколения из диапазона 0..65535, предполагая 0.» Ошибки, вызванные pdftk, который ghostscript называется «itext-paulo-155 (itextpdf.sf.net-lawagie.com)» – также случалось, что размер файла уменьшился вдвое в моем использовании. С оригиналом 4,5 МБ результат pdftk составил 6.7 МБ, а переработка gswin32c уменьшила ее до 3,2 МБ.

 pdftk input_file\*.pdf cat output input_temp.pdf gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf 

И все готово! Не стесняйтесь удалять папку input_file, cover.pdf, input_temp.pdf, right_sections.pdf и left_sections.pdf. 😉

Если вам просто нужно вывести левые PDF-файлы в одном документе и правые pdf-файлы в одном документе, то следующий сценарий, основанный на ответе Курта Пфайфля, сделает трюк (работает для любой высоты и ширина):

 $ cat split.sh #!/bin/bash dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2) width=$(echo "$dims" | cut -d " " -f7) height=$(echo "$dims" | cut -d " " -f9) half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1) half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1) heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1) echo "pdf $1 has height $height and width $width" gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1" gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1" 

Затем запустите его так:

 $ ./split.sh thepdftosplit.pdf 
  • Как конвертировать MS doc в pdf
  • Юникод в формате PDF
  • Как я могу автоматически конвертировать все файлы исходного кода в папку (рекурсивно) в один PDF с подсветкой синтаксиса?
  • Создание файлов PDF во время выполнения в c #
  • Как использовать GhostScript для Windows для восстановления поврежденных файлов PDF
  • Принтер PDF без вмешательства пользователя
  • Определить количество страниц в файле PDF
  • Можно ли удалить несколько страниц PDF-документа?
  • Только PDF Загрузить
  • Как открыть два независимых экземпляра Foxit Reader?
  • Создайте PDF-файл из PowerPoint с анимацией
  • Interesting Posts
    Давайте будем гением компьютера.