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) ).


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

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!!


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.


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


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


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

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

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”


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


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ć.


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


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)

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');

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.


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.


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

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
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.