Jak połączyć wiele plików PDF za pomocą wiersza polecenia?


52

Czy istnieje szybki jeden wiersz do łączenia wielu plików PDF w jeden?

Wiem, że można to zrobić za pomocą Preview.app

Odpowiedzi:


75

Spójrz na „Łączenie plików PDF w wierszu poleceń w OSX” w Łączenie plików PDF w OS X z wiersza poleceń .

Okazuje się, że od wersji Tiger OSX jest dostarczany ze skryptem Python, który robi dokładnie to, czego potrzebujesz. Skrypt jest już wykonywalny, a Python jest wstępnie zainstalowany w systemie OS X, więc wszystko, co musisz zrobić, aby go uruchomić, to otwarcie terminala i pisanie

"/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

Również na powiązanej stronie to sugeruje dokonanie symboliczny link do join.pypliku, aby ułatwić wpisywanie one jednak pominięty -sw ln -s ... ..., i bez niego, twrdym jest tworzony. Prawdopodobnie nie miałoby to znaczenia, choć wspomnę o tym.


Pracował dla mnie. Jedną wielką zaletą jest unikanie konieczności instalowania dodatkowych pakietów, których już nigdy nie będziesz mógł użyć. Dzięki.
gvrocha

Pracowałem dla mnie nad El Capitan 10.11.6.
pabuisson

2
Ostrzeżenie : miałem pliki PDF, w których pomieszano rotację kilku stron
adius

28

Wystarczy zainstalować Ghostscript za pomocą Brew z poleceniem:

brew install gs

Następnie uruchom polecenie z wszystkimi wymienionymi plikami:

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

OS X / macOS już natywnie ma sposób na łączenie plików PDF z wiersza poleceń, więc po co marnować czas na instalowanie narzędzi wiersza poleceń dla Xcode, Homebrew, a następnie Ghostscript, aby zrobić coś, co można już zrobić natywnie bez konieczności zainstalować którykolwiek z wyżej wymienionych pakietów?
user3439894

5
@ user3439894 wiele osób ma już zainstalowane te wspólne pakiety i już z nich korzysta, gswięc na przyszłość, to rozwiązanie byłoby równie wygodne.
htor

1
@ user3439894 Widzę zamieszanie. zwracam się do ciebie, ponieważ kwestionujesz wartość tej odpowiedzi. używanie homebrew do instalowania narzędzi wiersza poleceń jest obecnie bardzo powszechne, więc nie nazwałbym tego stratą czasu. dla wielu osób ta odpowiedź stanowi równie dobre rozwiązanie jak twoje.
htor,

7
to zadziałało dla mnie, polecenie py nie zadziałało
Thieme Hennis

2
Zgodnie z komentarzem Thieme Hennis, skrypt join.py zawiesza mnie w High Sierra z błędem segmentacji. Ale gs działa idealnie.
arcdale

2

Skrypt Pythona firmy Apple w akcji Automator działa bardzo wolno, ponieważ korzysta z interfejsów API CGPDFDocument firmy CoreGraphics, a nie z nowszej struktury PDFKit. Importuje również całą bibliotekę CoreGraphics, a nie tylko wymagane interfejsy API.

Alternatywny, szybszy skrypt Pythona można znaleźć tutaj:

Skrypt ten dodaje również spis treści do pliku PDF, wyszczególniając każdy plik komponentu (i scalając istniejące ToC), czego nie robi Apple.

Można go użyć w wierszu polecenia (z nazwami plików PDF jako argumentami) lub w akcji skryptu powłoki Automatora, aby utworzyć szybką akcję / usługę dla Findera.


1
W ramach testu, używając time polecenia w połączeniu ze joinpdfs.py skryptem , wbudowanym join.py skryptem i dwoma plikami ~ 200 MB każdy, joinpdfs.py skrypt był o 9 sekund szybszy niż wbudowany join.py skrypt , co oczywiście zapewnia dodatkową korzyść z posiadania nietkniętego spisu treści . Miły! +1
użytkownik3439894

BTW 9 sekund może nie brzmieć dużo, ale był to 1/3 całkowitego czasu wbudowanego skryptu , więc 1/3 czasu jest znacząca.
user3439894

1

FWIW, napisałem szybki program, który pozwala ci to robić bez konieczności polegania na zewnętrznych zależnościach, takich jak python systemowy i tym podobne. Na github tutaj: pdfmerge i dość prosty w użyciu, może albo przekazać mu listę plików PDF do scalenia pdfmerge in1.pdf in2.pdf ... out.pdf, przekazać listę plików do scalenia w pliku tekstowym pdfmerge infileslist.txt out.pdflub po prostu zrobić bieżący katalog w kolejności ABC pdfmerge out.pdf. Napisałem go jako projekt edukacyjny, więc darmowy i otwarty. Możesz pobrać najnowszy plik binarny z karty wydań na github.


Ponieważ Python jest domyślnie zainstalowany w systemie macOS i jako jego część, niekoniecznie uważam to za zależność zewnętrzną per se. Innymi słowy, aby użyć tego, co jest już dostępne w systemie macOS, do dołączenia do plików PDF, join.pyskryptu z akcji Połącz strony PDF w Automatorze, nic więcej nie trzeba pobierać ani instalować, ale aby użyć Twojej, musiałbym pobierz i zainstaluj. Nie widziałem również pliku binarnego na link.
user3439894

1
BTW, dokładnie przestudiowałem twój kod i interesujące jest to, że używasz dwóch podstawowych składników (Foundation i Quartz), których już używa skrypt w języku Python. Czy w twoim kodzie jest coś, co jest z natury lepsze, aby przekonać się do korzystania z niego w porównaniu z tym, co jest już oferowane domyślnie, bez konieczności pobierania czegokolwiek, podczas gdy w twoim przypadku musisz podjąć dodatkowe i dodatkowe kroki, aby go użyć?
user3439894

1
Dla osób, które nie używają Pythona do niczego innego, prawdopodobnie bardziej sensowne jest użycie skryptu dostarczonego przez Apple. Ale dla osób, które używają Pythona, zarządzanie wieloma wersjami (Python systemowy 2.7, współczesny Python 3.x) może być dużym problemem z różnymi instalacjami modułów i innymi rzeczami. Na przykład na moim komputerze moja $ PATH wskazuje na zupełnie innego Pythona. Można to rozwiązać przez rozsądne użycie shebangów i tym podobnych, ale uważam to za irytujące. Oczywiście YMMV. Również bezpośredni link do strony pobierania binarnego: github.com/paultopia/pdfmerge/releases/latest
Paul Gowder

1

w oparciu o @Bartosz Petryński „s miłą odpowiedź , możemy stworzyć własny minimalny cpdfnarzędzie na górze GhostScriptu:

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

następnie użyj go w następujący sposób:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.