Scal / przekonwertuj wiele plików PDF w jeden plik PDF

1068

Jak mogę scalić / przekonwertować wiele plików PDF w jeden duży plik PDF?

Próbowałem następujących czynności, ale zawartość pliku docelowego nie była zgodna z oczekiwaniami:

convert file1.pdf file2.pdf merged.pdf

Potrzebuję bardzo prostego / podstawowego rozwiązania wiersza poleceń (CLI). Najlepiej byłoby, gdybym mógł bezpośrednio przesłać dane wyjściowe scalania / konwersji pdf2ps(jak pierwotnie próbowałem w moim poprzednio zadanym pytaniu tutaj: Linux piping (konwersja -> pdf2ps -> lp) ).

alkohol
źródło
3
ymmv, ale wydaje się, że nie ma tak dobrej rozdzielczości w pliku wyjściowym jak pdfunite, a także powoduje, że rozmiar pliku jest większy niż wynik z pdfunite
sabujp
1
powiązane: komenda linux
scala
Ilekroć linki są zachowane lub nie przez te rozwiązania jest omawiane w tym poście . Jeśli chcesz zachować łącza (prawdopodobnie wraz z innymi adnotacjami), użyj pdftk, jeśli chcesz interfejsu wiersza poleceń, pdfsam, jeśli chcesz graficzny interfejs użytkownika, sejda, jeśli chcesz interfejsu internetowego.
Clément

Odpowiedzi:

1387

Biorąc pod uwagę, że pdfunitejest to część popplera, ma większą szansę na zainstalowanie, użycie jest również prostsze niż pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
źródło
20
Jest szybki, ale wydaje się, że przerywa hiperłącza. Zobacz blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
425
Tylko pamiętaj, aby podać out.pdf, w przeciwnym razie zastąpi on ostatni plik w twoim poleceniu, westchnienie.
mlissner,
10
Pakiet dla pdfunite jest poppler-utils w debianie, ale może nie być obecny w starych wydaniach Debiana.
Jocelyn delalande
16
Nie mogę tego polecić. Rozmiar wynikowego pliku PDF jest zdecydowanie za duży. Na przykład: Pdfunite daje mi plik 75 MB, a Ghostscript pakuje wszystko do 1 MB.
Torben,
64
Możesz użyć: pdfunite *.pdf out.pdfzakładając, że w tym katalogu nie ma innego pliku pdf, a ich kolejność jest zachowana przez „*”. Jeśli nie jest zachowany, użycie zakresów: nazwa_pliku {0..9} .pdf rozwiązuje go.
lepe
548

Wypróbuj dobry ghostscript:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf

lub nawet w ten sposób dla ulepszonej wersji plików PDF o niskiej rozdzielczości (podziękowania dla Adriano za zwrócenie na to uwagi):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf

W obu przypadkach rozdzielczość wyjścia jest znacznie wyższa i lepsza niż w ten sposób za pomocą konwersji:

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

W ten sposób nie musisz instalować niczego innego, po prostu pracuj z tym, co już zainstalowałeś w swoim systemie (przynajmniej oba są domyślnie dostarczane w moim rhel).

Mam nadzieję że to pomoże,

AKTUALIZACJA: przede wszystkim dziękuję za wszystkie miłe komentarze !! tylko wskazówka, która może dla was zadziałać, po google znalazłem świetną sztuczkę, aby zmniejszyć rozmiar plików PDF, zmniejszyłem za pomocą jednego pliku PDF 300 MB do zaledwie 15 MB z akceptowalną rozdzielczością! a wszystko to z dobrym ghostscriptem, oto:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

Twoje zdrowie!!

Gery
źródło
27
Dobra wskazówka, gsdziała bardzo szybko i dużo się kompresuje. Jednak jakość znacznie się poprawiła po użyciu tego parametru:-dPDFSETTINGS=/prepress
Adriano P
3
Odkryłem, że -dPDFSETTINGS=/prepressma to bardzo przyjemny efekt obracania stron, które są zbyt szerokie i wymuszają irytujące poziome paski przewijania.
Robert Smith,
24
Dodaj następujący wiersz do swojego .bash_profilei masz ładny skrót: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Oszczędza to trochę pisania, jeśli musisz często używać polecenia. Użycie wygląda następująco:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
Próbowałem znaleźć opis flagi -dBATCH, ale nie mogłem. Nawet człowiek nic nie mówi. Ale świetnie i bez żadnych dodatkowych programów!
Michał Gonda,
3
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfMoże zostać skrócony do gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Z dokumentacji : „Jako wygodny skrót możesz użyć -oopcji, a następnie specyfikacji pliku wyjściowego, jak omówiono powyżej. -oOpcja ta ustawia także opcje -dBATCHi -dNOPAUSE. Jest to szybki sposób na wywołanie ghostscriptkonwersji jednego lub więcej plików wejściowych.”
MiniMax
513

Przepraszam, udało mi się znaleźć odpowiedź za pomocą Google i trochę szczęścia:)

Dla zainteresowanych;

Zainstalowałem pdftk (zestaw narzędzi pdf) na naszym serwerze Debiana i używając następującego polecenia osiągnąłem pożądany wynik:

pdftk file1.pdf file2.pdf cat output output.pdf

LUB

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

To z kolei można przesłać bezpośrednio do pdf2ps.

alkohol
źródło
81
Korzystanie z ghostscript może również działać: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl
15
Warto wspomnieć, że pdftk może łączyć zaszyfrowane pliki PDF, podczas gdy pdfunite nie może
Thomas
3
daje lepszą rozdzielczość z pdftk w porównaniu do konwersji w opcjach domyślnych.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfwyśle ​​scalony plik jakoout.pdf
jmiserez
2
pdftknie jest dostępny dla systemów EL7 z powodu braku zależności libgcj.
koder
72

Jest to najłatwiejsze rozwiązanie, jeśli masz wiele plików i nie chcesz wpisywać nazw jeden po drugim:

qpdf --empty --pages *.pdf -- out.pdf

SaTa
źródło
2
wydaje się to być najłatwiejsze
baxx
1
qpdf wydaje się łamać hiperłącza w dokumencie
David Granqvist
2
Qpdf jest trudnym do opanowania złożonymi opcjami na początek, ale jest bardzo przydatnym i potężnym narzędziem. Dokumentacja online jest dostępna tutaj
Jonathan Holvey
Zdecydowanie najbardziej przydatny!
Lucky
54

Także pdfjoin a.pdf b.pdfstworzy nowe b-joined.pdfz treścią A.pdf i b.pdf

rodrigob
źródło
5
To miłe i zwięzłe, ale łamie hiperłącza.
jasna gwiazda
3
pdfjoin (pdflatex) nie działa z plikami z dużą ilością stron. Nie udało się scalić z plikami stron o wielkości 1k.
mdrozdziel
pdfjoin łamie adnotacje lub dodatkowe elementy inne niż graficzne
sabujp,
Czcionka „URW Palladio L” stała się niewidoczna po dołączeniu stron do pdf.
v_2e
9
pdfunite zwykle działa dobrze, ale jeśli mówi „Funkcja niezaimplementowana: nie można scalić zaszyfrowanych plików”, pdfjoin jest dobrą alternatywą. Z jakiegokolwiek powodu pdfjoin nie narzeka na szyfrowanie.
Calaf
38

Możesz użyć polecenia konwersji bezpośrednio,

na przykład

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
źródło
40
To nie jest bezstratne.
Ben Ruijl
12
Możesz convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, ale wynikowy rozmiar pliku może być o wiele za duży. Sugerowałbym convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfzamiast tego.
arielnmz
21
Wydaje się, że wiąże się to z konwersją wszystkiego na obrazy rastrowe, co zdecydowanie nie jest najlepsze, szczególnie w przypadku plików PDF z tekstem.
Pterozaur
5
prawie kopia tego, co OP opisało jako
niedziałające
15
Nie używaj konwersji do plików PostScript lub PDF, chyba że przejdziesz z wektora do rastra i nigdy nie wrócisz. Trudno przecenić, jaki to zły pomysł.
markgalassi
32

pdfunitescalanie całych plików PDF jest w porządku. Jeśli chcesz na przykład strony 2-7 z pliku1.pdf i strony 1,3,4 z pliku2.pdf, musisz użyć pdfseparatedo podzielenia plików na osobne pliki PDF dla każdej strony pdfunite.

W tym momencie prawdopodobnie potrzebujesz programu z większą liczbą opcji. qpdfto najlepsze narzędzie, jakie znalazłem do manipulowania plikami PDF. pdftkjest większy i wolniejszy, a Red Hat / Fedora nie pakuje go z powodu jego zależności od gcj. Inne narzędzia PDF mają zależności Mono lub Python. Okazało qpdfsię , że utworzyłem znacznie mniejszy plik wyjściowy niż używanie pdfseparatei pdfunitełączenie stron w 30-stronicowy plik wyjściowy PDF, 970 kB w porównaniu z 1 6450 kB. Ponieważ oferuje wiele innych opcji, qpdflinia poleceń nie jest tak prosta; oryginalne żądanie scalenia pliku1 i pliku2 można wykonać za pomocą

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
strona dla narciarzy
źródło
2
Tyle tego. Na przykład Parabola już się nie pakuje pdftkz powodu swojej zależności gcj, dla której, jak sądzę, wsparcie zostało odrzucone. Pomimo wyszukiwania narzędzi do manipulacji pdf za pośrednictwempacman -Ss pdf , tęskniłem za tym. Dzięki za tę odpowiedź! Powinienem otrzymywać znacznie więcej głosów pozytywnych, więc pojawia się tuż obok sugestii dotyczących pdfunitelub pdftk.
k.stm
1
W mojej nowej instalacji Linux Mint działało to w oknie Terminal bez konieczności instalowania ani dostosowywania ścieżek. Miły!
Wallace Kelly
Działa to doskonale, a także daje jaśniejszy scalony dokument niż inne polecenia, które wypróbowałem. Dzięki za post.
Siwoku Adeola
14

Apache PDFBox http://pdfbox.apache.org/

PDFMerger Ta aplikacja pobierze listę dokumentów pdf i scali je, zapisując wynik w nowym dokumencie.

użycie: java -jar pdfbox-app-xyzjar PDFMerger „Źródłowe pliki PDF (2 ..n)” „Docelowy plik PDF”

Lumpchen
źródło
11

Użyj narzędzi PDF z Pythona https://pypi.python.org/pypi/pdftools/1.0.6

Pobierz plik tar.gz, rozpakuj go i uruchom następującą komendę

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

Powinieneś zainstalować pyhton3 przed uruchomieniem powyższego polecenia

Te narzędzia obsługują poniżej

  • Dodaj
  • wstawić
  • Usunąć
  • Obracać się
  • Rozdzielać
  • Łączyć
  • Zamek błyskawiczny

Możesz znaleźć więcej szczegółów w poniższym linku i jest to oprogramowanie typu open source

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
źródło
To jest doskonałe. Przy użyciu gs(wszystkie warianty wymienione powyżej) proste połączenie dwóch plików PDF, 2 MB i 500 KB, zajęło kilka minut, a plik 40 MB! pdftoolskończy się natychmiast z identycznym rozmiarem pliku.
supergra
10

Możesz użyć sejda-console , darmowego i open source. Rozpakuj i uruchom sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Zachowuje zakładki, adnotacje linków, formularze akrobatyczne itp. W rzeczywistości ma wiele opcji, z którymi możesz grać, po prostu biegnij, sejda-console merge -haby je wszystkie zobaczyć.

Andrea Vacondio
źródło
OMHO najlepiej narzędzie do wykonywania tego typu zadań
Mario Ruiz
8

Jeśli chcesz przekonwertować wszystkie pobrane obrazy do jednego pliku pdf, uruchom

convert img{0..19}.jpg slides.pdf

Trupti Kini
źródło
6
Nie używaj konwersji do plików PostScript lub PDF, chyba że przejdziesz z wektora do rastra i nigdy nie wrócisz. Trudno przecenić, jaki to zły pomysł.
markgalassi
6

Popieram pdfunitezalecenie. Ja jednak dostawałemArgument list too long błędy, gdy próbowałem scalić> 2k plików PDF.

Zwróciłem się do Pythona o ten i dwa zewnętrzne pakiety: PyPDF2 (do obsługi wszystkich rzeczy związanych z plikami PDF) i natsort (do „naturalnego” rodzaju nazw plików katalogu). Jeśli to może komuś pomóc:

from PyPDF2 import PdfFileMerger
import natsort
import os

DIR = "dir-with-pdfs/"
OUTPUT = "output.pdf"

file_list = filter(lambda f: f.endswith('.pdf'), os.listdir(DIR))
file_list = natsort.natsorted(file_list)

# 'strict' used because of
# https://github.com/mstamy2/PyPDF2/issues/244#issuecomment-206952235
merger = PdfFileMerger(strict=False)

for f_name in file_list:
  f = open(os.path.join(DIR, f_name), "rb")
  merger.append(f)

output = open(OUTPUT, "wb")
merger.write(output)
Greg Sadetsky
źródło
6
„Zbyt długa lista argumentów” wskazuje, że przekraczasz rozmiar przydzielonego bufora powłoki dla środowiska - tak naprawdę nie jest to ograniczenie narzędzia. W takim przypadku przejście na Python może być przesadą, ponieważ można po prostu wsadowo: znaleźć nazwę-wejścia * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (To utworzy partie 500 plików przetwarzanych szeregowo, sprawi, że powstałe pliki tymczasowe zostaną posortowane w odpowiedniej kolejności i wygeneruj odpowiedni plik wyjściowy; po tym czasie musisz wyczyścić pliki tymczasowe)
enkiv2
4

Oto metoda, której używam, która działa i jest łatwa do wdrożenia. Będzie to wymagało bibliotek fpdf i fpdi, które można pobrać tutaj:

require('fpdf.php');
require('fpdi.php');

$files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];

$pdf = new FPDI();

foreach ($files as $file) {
    $pdf->setSourceFile($file);
    $tpl = $pdf->importPage(1, '/MediaBox');
    $pdf->addPage();
    $pdf->useTemplate($tpl);
}

$pdf->Output('F','merged.pdf');
billynoah
źródło
4

Jestem stronniczy, będąc jednym z twórców PyMuPDF (powiązanie MuPDF w Pythonie).

Możesz łatwo robić z nim co chcesz (i wiele więcej). Szkielet kodu działa w następujący sposób:

#-------------------------------------------------
import fitz         # the binding PyMuPDF
fout = fitz.open()  # new PDF for joined output
flist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined

for f in flist:
    fin = fitz.open(f)  # open an input file
    fout.insertPDF(fin) # append f
    fin.close()

fout.save("joined.pdf")
#-------------------------------------------------

O to chodzi. Dostępnych jest kilka opcji wyboru tylko zakresów stron, utrzymywania wspólnego spisu treści, odwracania sekwencji stron lub zmiany rotacji stron itp. Itp.

Jesteśmy na PyPi.

Jorj McKie
źródło
3

Podoba mi się pomysł Chasmo, ale wolę korzystać z zalet takich rzeczy jak

convert $(ls *.pdf) ../merged.pdf

Podawanie wielu plików źródłowych convertprowadzi do scalenia ich we wspólny plik pdf. To polecenie scala wszystkie pliki z .pdfrozszerzeniem w katalogu rzeczywistym do katalogu merged.pdfnadrzędnego.

użytkownik3709983
źródło
5
Biorąc pod uwagę, jak podobne jest to do pierwotnego pytania, wydaje się, że powinien to być komentarz, a nie odpowiedź. Przy nieco większym przedstawicielu będziesz mógł dodawać komentarze . Do tego czasu nie używaj odpowiedzi jako obejścia.
Nathan Tuggy
1
@Silfheed Nie, to odpowiada na pytanie! Chociaż odpowiedź powinna być bardziej szczegółowa.
Peter - Przywróć Monikę
7
Nie używaj konwersji do plików PostScript lub PDF, chyba że przejdziesz z wektora do rastra i nigdy nie wrócisz. Trudno przecenić, jaki to zły pomysł.
markgalassi
13
Po co używać $(ls *.pdf)zwykłej wieloznacznej karty *.pdf?
firegurafiku,
Dodatkowo w odniesieniu do odpowiedzi @firegurafiku, przy pomocy znaku ls *.pdfwieloznacznego tracisz kontrolę nad kolejnością scalonych plików. W przykładzie następująca lista: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf zostanie faktycznie scalona jak 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (ze względu na domyślny sposób zamawiania plików w systemie Linux - tutaj znajdziesz więcej szczegółów na temat tego problemu - stackoverflow.com/q/22948042/1977012 ).
Egel
0

Chociaż nie jest to rozwiązanie wiersza polecenia, może pomóc macosużytkownikom:

  1. Wybierz swoje pliki PDF
  2. Kliknij podświetlone pliki prawym przyciskiem myszy
  3. Wybierz Szybkie akcje > Utwórz PDF
DevonDahon
źródło
0

Możesz zobaczyć użycie darmowych i otwartych narzędzi pdftools (zastrzeżenie: jestem ich autorem).

Jest to w zasadzie interfejs Pythona do lateksu pdfpages pakietu .

Aby scalić pliki pdf jeden po drugim, możesz uruchomić:

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

Aby scalić wszystkie pliki pdf w katalogu, możesz uruchomić:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Raffaem
źródło