Как я могу объединить несколько PDF-файлов с помощью командной строки?


52

Существует ли быстрая однострочная сборка для объединения нескольких PDF-файлов в один?

Я знаю, что это можно сделать с помощью Preview.app

Ответы:


75

Взгляните на «Объединение файлов PDF в командной строке в OSX» в разделе Присоединение файлов PDF в OS X из командной строки .

Оказывается, начиная с Tiger, OSX поставляется со скриптом Python, который делает именно то, что вам нужно. Сценарий уже исполняемый, и Python предустановлен на OS X, поэтому все, что вам нужно сделать, чтобы запустить его, это открыть терминал и набрать

"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" -o PATH/TO/YOUR/MERGED/FILE.pdf /PATH/TO/ORIGINAL/1.pdf /PATH/TO/ANOTHER/2.pdf /PATH/TO/A/WHOLE/DIR/*.pdf

Кроме того, на связанной странице он предлагает сделать символическую ссылку на join.pyфайл , чтобы сделать набрав легче , однако они опускали -sв ln -s ... ..., и без него, жесткая ссылка создается. Возможно, это не имеет значения, хотя я бы упомянул это.


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

Работал для меня на El Capitan 10.11.6.
pabuisson

2
Предупреждение : у меня были PDF-файлы, где испортилось вращение нескольких страниц
adius

28

Просто установите Ghostscript, используя Brew с командой:

brew install gs

Затем выполните команду со всеми перечисленными файлами:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf source1.pdf source2.pdf source3.pdf

В OS X / macOS уже изначально есть способ комбинировать PDF-файлы из командной строки, поэтому зачем тратить время на то, чтобы сначала установить инструменты командной строки для Xcode, Homebrew, а затем Ghostscript, чтобы сделать что-то, что уже можно сделать изначально без необходимости установить какой-либо из вышеупомянутых пакетов?
user3439894

5
@ user3439894 многие люди уже установили эти общие пакеты и уже используют их, gsпоэтому для дальнейшего использования это решение будет столь же удобным.
htor

1
@ user3439894 я вижу путаницу. Я обращаюсь к вам, потому что вы сомневались в ценности этого ответа. использование homebrew для установки утилит командной строки в наши дни очень распространено, поэтому я бы не назвал это пустой тратой времени. для многих этот ответ дает такое же хорошее решение, как и ваш.
htor

7
это сработало для меня, команда py не сработала
Thieme Hennis

2
Согласно комментарию Тиме Хенниса, сценарий join.py для меня в High Sierra завершается с ошибкой сегментации. Но GS работает отлично.
Arcdale

2

Python-скрипт Apple в действии Automator очень медленный, поскольку он использует API-интерфейсы CoreGraphics CGPDFDocument, а не более новую платформу PDFKit. Он также импортирует всю библиотеку CoreGraphics, а не только необходимые API.

Альтернативный, более быстрый скрипт на Python можно найти здесь:

Этот скрипт также добавляет оглавление в PDF, перечисляя каждый файл компонента (и объединяя существующие ToC), чего нет у Apple.

Его можно использовать в командной строке (с именами файлов PDF в качестве аргументов) или в действии сценария оболочки Automator для создания Quick Action / Service для Finder.


1
В качестве теста, используя time команду в сочетании с вашим joinpdfs.py сценарием , встроенным join.py сценарием и двумя файлами ~ 200 МБ каждый, ваш joinpdfs.py сценарий был на 9 секунд быстрее встроенного join.py сценария , и, конечно, было добавлено преимущество в том, что TOC не поврежден , Ницца! +1
user3439894

Кстати, 9 секунд могут показаться не такими уж большими, но они составляли 1/3 общего времени встроенного скрипта , поэтому 1/3 времени быстрее.
user3439894

1

FWIW, я написал небольшую небольшую программу, которая позволяет вам делать это, не полагаясь на внешние зависимости, такие как системный питон и тому подобное. На github здесь: pdfmerge и довольно простой в использовании, может либо передать ему список файлов PDF для слияния pdfmerge in1.pdf in2.pdf ... out.pdf, либо передать ему список файлов для слияния в текстовом файле, например, pdfmerge infileslist.txt out.pdfлибо просто сделать текущий каталог в порядке ABC pdfmerge out.pdf. Я написал его как учебный проект, так что он бесплатный и открытый, и вы можете получить последний бинарный файл на вкладке релизов на github.


Поскольку Python по умолчанию установлен в MacOS и является ее частью, я не обязательно рассматриваю его как внешнюю зависимость. Другими словами, чтобы использовать то, что уже доступно в MacOS для подключения к PDF-файлам, join.pyскрипт из действия Объединить PDF-страницы в Automator, больше ничего не нужно загружать или устанавливать, но чтобы использовать ваш, мне придется скачать и установить его. Также не увидел двоичный файл по ссылке.
user3439894

1
Кстати, я внимательно изучил ваш код, и интересно, что вы используете два основных компонента (Foundation и Quartz), которые также уже используется скриптом python. Есть ли в вашем коде что-то, что по своей сути лучше, чтобы использовать его по сравнению с тем, что уже предлагается по умолчанию, без необходимости что-либо скачивать, в то время как с вашим нужно предпринять дополнительные и дополнительные шаги, чтобы использовать его?
user3439894

1
Для людей, которые не используют Python для чего-либо еще, возможно, имеет больше смысла использовать предоставленный Apple скрипт. Но для людей, которые используют Python, это может быть большой проблемой для управления несколькими версиями (система Python 2.7, современный Python 3.x) с различными установками модулей и прочим. Например, на моей машине $ PATH указывает на совершенно другой Python. Это можно решить с помощью разумного использования шебангов и тому подобного, но я нахожу это раздражающим. YMMV, конечно. Кроме того, прямая ссылка на бинарную страницу загрузки: github.com/paultopia/pdfmerge/releases/latest
Пол Гоудер

1

опираясь на на @Bartosz Petryński «s хороший ответ , мы можем сделать собственную минимальную cpdfпрограмму на вершине GhostScript:

brew install gs
cpdf () { 
  gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$1" "${@:2}"
}

тогда используйте это как:

cpdf merged.pdf file1.pdf file2.pdf file3.pdf

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.