Unisci / converti più file PDF in un unico PDF


1071

Come posso unire / convertire più file PDF in un unico file PDF?

Ho provato quanto segue, ma il contenuto del file di destinazione non era come previsto:

convert file1.pdf file2.pdf merged.pdf

Ho bisogno di una soluzione della riga di comando (CLI) molto semplice / di base. La cosa migliore sarebbe se potessi reindirizzare l'output dell'unione / conversione direttamente pdf2ps(come originariamente tentato nella mia domanda precedentemente fatta qui: Linux piping (convert -> pdf2ps -> lp) ).


3
ymmv, ma questo non sembra avere una buona risoluzione nel file di output come pdfunite e si traduce anche in una dimensione del file maggiore dell'output di pdfunite
sabujp


Ogni volta che i collegamenti vengono preservati o meno da tali soluzioni viene discusso in questo post . Se vuoi conservare i collegamenti (probabilmente insieme ad altre annotazioni), usa pdftk se vuoi un'interfaccia da riga di comando, pdfsam se vuoi un'interfaccia utente grafica, sejda se vuoi un'interfaccia web.
Clément il

Risposte:


1389

Considerando che pdfunitefa parte di Poppler ha una maggiore possibilità di installazione, l'utilizzo è anche più semplice di pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf

20
È veloce, ma sembra interrompere i collegamenti ipertestuali. Vedi blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen

426
Assicurati solo di ricordare di fornire out.pdf, altrimenti sovrascriverà l'ultimo file nel tuo comando, sospiro.
mlissner,

10
il pacchetto per pdfunite è poppler-utils in debian ma potrebbe non essere presente nelle vecchie versioni di debian.
Jocelyn delalande,

16
Non posso raccomandarlo. La dimensione del PDF risultante è troppo grande. Ad esempio: Pdfunite mi dà un file di 75 MB mentre Ghostscript racchiude tutto in 1 MB.
Torben,

64
Puoi usare: pdfunite *.pdf out.pdfsupponendo che nessun altro pdf esista in quella directory e il loro ordine sia preservato da "*". Se non viene conservato, utilizza gli intervalli: nome_file {0..9} .pdf risolve.
lepe

549

Prova il buon ghostscript:

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

o anche in questo modo per una versione migliorata per i PDF a bassa risoluzione (grazie ad Adriano per averlo sottolineato):

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

In entrambi i casi la risoluzione di output è molto più alta e migliore di così usando convert:

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

In questo modo non avresti bisogno di installare nient'altro, basta lavorare con ciò che hai già installato nel tuo sistema (almeno entrambi vengono di default nel mio rhel).

Spero che sia di aiuto,

AGGIORNAMENTO: prima di tutto grazie per tutti i tuoi bei commenti !! solo un suggerimento che potrebbe funzionare per voi ragazzi, dopo aver cercato su Google ho trovato un trucco superbo per ridurre le dimensioni dei PDF, ho ridotto con esso un PDF da 300 MB a soli 15 MB con una risoluzione accettabile! e tutto questo con il buon ghostscript, eccolo qui:

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

Saluti!!


27
Bel suggerimento, gscorre molto veloce e si comprime molto. Tuttavia, la qualità è migliorata molto dopo aver usato questo parametro:-dPDFSETTINGS=/prepress
Adriano P

3
Ho scoperto che -dPDFSETTINGS=/prepressha il bell'effetto di ruotare le pagine troppo larghe e forzare fastidiose barre di scorrimento orizzontali.
Robert Smith,

24
Aggiungi la seguente riga alla tua .bash_profilee hai una bella scorciatoia: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Questo ti risparmia un po 'di battitura, se devi usare molto il comando. L'utilizzo è simile al seguente:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben,

2
Ho provato a trovare una descrizione per il flag -dBATCH ma non ci sono riuscito. Anche man gs non dice nulla. Ma fantastico e senza programmi aggiuntivi!
Michal Gonda,

3
Il gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfpuò essere abbreviato in gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Dalla documentazione : "Come pratica scorciatoia è possibile utilizzare l' -oopzione seguita dalla specifica del file di output come discusso sopra. L' -oopzione imposta anche le opzioni -dBATCHe -dNOPAUSE. Questo è inteso come un modo rapido per invocare ghostscriptper convertire uno o più file di input."
MiniMax

513

Mi dispiace, sono riuscito a trovare la risposta da solo usando google e un po 'di fortuna:)

Per chi fosse interessato;

Ho installato pdftk (pdf toolkit) sul nostro server debian e usando il seguente comando ho ottenuto l'output desiderato:

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

O

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

Questo a sua volta può essere convogliato direttamente in pdf2ps.


81
Anche l'uso di ghostscript potrebbe funzionare: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl

15
Vale la pena ricordare che pdftk può unire pdf crittografati mentre pdfunite non può
Thomas

3
offre una migliore risoluzione con pdftk compare per la conversione in opzioni predefinite.
Kiran K Telukunta il

13
pdftk file1.pdf file2.pdf cat output out.pdfprodurrà il file unito comeout.pdf
jmiserez il

2
pdftknon è disponibile per i sistemi EL7 a causa della dipendenza mancante libgcj.
un programmatore il

72

Questa è la soluzione più semplice se hai più file e non vuoi digitare i nomi uno per uno:

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


2
questo sembra essere di gran lunga il più semplice
baxx il

1
qpdf sembra interrompere i collegamenti ipertestuali nel documento
David Granqvist,

2
Sebbene sia difficile orientarsi tra le complesse opzioni per iniziare, qpdf è uno strumento molto utile e potente. La documentazione online è disponibile qui
Jonathan Holvey il

Sicuramente il più utile!
Lucky

54

Inoltre pdfjoin a.pdf b.pdfcreerà un nuovo b-joined.pdfcon i contenuti di a.pdf e b.pdf


5
Questo è carino e succinto, ma interrompe i collegamenti ipertestuali.
stella luminosa il

3
pdfjoin (pdflatex) ha esito negativo con file con molte pagine. Impossibile unire i file di 1k pagine.
mdrozdziel,

pdfjoin rompe le annotazioni o altri elementi non grafici
sabujp

Il carattere "URW Palladio L" è diventato invisibile dopo aver inserito le pagine in pdf.
v_2e,

9
pdfunite di solito funziona bene, ma se dice "Funzionalità non implementata: impossibile unire i file crittografati", pdfjoin è una buona alternativa. Per qualsiasi motivo, pdfjoin non si lamenta della crittografia.
Calaf,

38

Puoi usare direttamente il comando convert,

per esempio

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

40
Questo non è senza perdita di dati.
Ben Ruijl,

12
Puoi convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, ma le dimensioni del file risultante potrebbero essere troppo grandi. Suggerirei convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfinvece.
arielnmz,

21
Ciò comporta la conversione di tutto in immagini raster, a quanto pare, il che non è sicuramente il migliore, soprattutto quando si tratta di PDF basati su testo.
Pterosaur,

5
quasi una copia di ciò che l'OP ha descritto come non funzionante
user829755

15
Non usare convert per postscript o file PDF a meno che non passi dal vettore al raster e non torni più indietro. È difficile sopravvalutare che cattiva idea sia.
markgalassi,

32

pdfuniteva bene unire interi PDF. Se vuoi, ad esempio, le pagine 2-7 da file1.pdf e le pagine 1,3,4 da file2.pdf, devi usare pdfseparateper dividere i file in PDF separati per ogni pagina da dare pdfunite.

A quel punto probabilmente vorrai un programma con più opzioni. qpdfè la migliore utility che ho trovato per manipolare i PDF. pdftkè più grande e più lento e Red Hat / Fedora non lo impacchettano a causa della sua dipendenza da gcj. Altre utilità PDF hanno dipendenze Mono o Python. Ho scoperto che qpdfproduceva un file di output molto più piccolo rispetto all'uso pdfseparatee pdfuniteall'assemblaggio di pagine in un PDF di output di 30 pagine, 970 KB contro 1,6450 KB. Poiché offre molte più opzioni, qpdfla riga di comando non è così semplice; la richiesta originale di unire file1 e file2 può essere eseguita con

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

2
Questo così tanto. Parabola, ad esempio, non fa pdftkpiù pacchetti neanche per la sua dipendenza da gcj, per cui credo sia stato abbandonato il supporto. Nonostante abbia cercato gli strumenti di manipolazione del pdf tramite pacman -Ss pdf, ho perso questo. Grazie per questa risposta! Dovrei ricevere molti più voti, quindi appare accanto ai suggerimenti per pdfuniteo pdftk.
k.stm,

1
Nella mia nuova installazione di Linux Mint, questo funzionava nella finestra Terminale senza richiedere installazioni o aggiustamenti del percorso. Bello!
Wallace Kelly,

Questo ha funzionato perfettamente e ha anche dato un documento unito più chiaro che gli altri comandi che ho provato. Grazie per il post.
Siwoku Adeola,

14

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

PDFMerger Questa applicazione prenderà un elenco di documenti pdf e li unirà, salvando il risultato in un nuovo documento.

utilizzo: java -jar pdfbox-app-xyzjar PDFMerger "File PDF di origine (2 ..n)" "File PDF di destinazione"


11

Utilizzare gli strumenti PDF da python https://pypi.python.org/pypi/pdftools/1.0.6

Scarica il file tar.gz e decomprimilo ed esegui il comando come di seguito

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

È necessario installare pyhton3 prima di eseguire il comando sopra

Questi strumenti supportano quanto segue

  • Inserisci
  • inserire
  • Rimuovere
  • Ruotare
  • Diviso
  • Merge
  • Cerniera lampo

Puoi trovare maggiori dettagli nel link sottostante ed è open source

https://github.com/MrLeeh/pdftools


Questo è perfetto. Utilizzando gs(tutte le varianti sopra elencate), una semplice unione di due PDF, 2 MB e 500 KB, richiedeva minuti per il completamento e risultava in un file di 40 MB! pdftoolssi completa istantaneamente con identiche dimensioni del file.
Supergra

10

Puoi usare sejda-console , gratuitamente e open source. Decomprimilo ed eseguilo sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Conserva i segnalibri, le annotazioni dei collegamenti, gli acroformi ecc. In realtà ha molte opzioni con cui puoi giocare, basta correre sejda-console merge -hper vederle tutte.


OMHO è il migliore strumento per svolgere questo tipo di attività
mario ruiz

8

Se si desidera convertire tutte le immagini scaricate in un pdf, eseguire

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


6
Non usare convert per postscript o file PDF a meno che non passi dal vettore al raster e non torni più indietro. È difficile sopravvalutare che cattiva idea sia.
markgalassi,

6

Secondo la pdfuniteraccomandazione. Stavo comunque ricevendo Argument list too longerrori mentre cercavo di unire> 2k file PDF.

Mi sono rivolto a Python per questo e due pacchetti esterni: PyPDF2 (per gestire tutte le cose relative a PDF) e natsort (per fare un ordinamento "naturale" dei nomi dei file della directory). Nel caso ciò possa aiutare qualcuno:

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
"Elenco argomenti troppo lungo" indica che stai andando oltre la dimensione del buffer allocata della shell per l'ambiente - non è in realtà una limitazione dello strumento. In tal caso, passare a Python potrebbe essere eccessivo, dal momento che puoi semplicemente batch: trovare input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Questo creerà batch di 500 file elaborati in serie, renderà i file temporanei risultanti ordinati nell'ordine giusto e produce un file di output appropriato; dopo dovrai ripulire i file temporanei)
enkiv2

4

Ecco un metodo che uso che funziona ed è facile da implementare. Ciò richiederà entrambe le librerie fpdf e fpdi che possono essere scaricate qui:

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

Sono di parte essendo uno degli sviluppatori di PyMuPDF (un legame Python di MuPDF).

Puoi facilmente fare quello che vuoi con esso (e molto altro). Il codice Skeleton funziona in questo modo:

#-------------------------------------------------
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")
#-------------------------------------------------

Questo è tutto. Sono disponibili diverse opzioni per selezionare solo intervalli di pagine, mantenere un sommario congiunto, invertire la sequenza di pagine o modificare la rotazione delle pagine, ecc., Ecc.

Siamo su PyPi.


3

Mi piace l'idea di Chasmo, ma preferisco usare i vantaggi di cose come

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

Dare più file sorgente a li convertporta a unirli in un pdf comune. Questo comando unisce tutti i file con l' .pdfestensione nella directory effettiva nella directory merged.pdfprincipale.


5
Dato quanto questo assomigli alla domanda originale, sembra che questo avrebbe dovuto essere un commento, non una risposta. Con un po 'più di rappresentante, sarai in grado di pubblicare commenti . Fino ad allora, non utilizzare le risposte come soluzione alternativa.
Nathan Tuggy,

1
@Silfheed No, risponde alla domanda! Sebbene la risposta forse avrebbe dovuto essere più elaborata.
Peter - Ripristina Monica

7
Non usare convert per postscript o file PDF a meno che non passi dal vettore al raster e non torni più indietro. È difficile sopravvalutare che cattiva idea sia.
markgalassi,

13
Qual è lo scopo dell'utilizzo $(ls *.pdf)al posto del semplice jolly *.pdf?
firegurafiku,

Inoltre, con riferimento alla risposta @firegurafiku, con i ls *.pdfcaratteri jolly si perde il controllo sull'ordine dei file uniti. In un esempio, il seguente elenco: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf verranno effettivamente uniti come 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (a causa del modo Linux predefinito di ordinare i file - qui hai maggiori dettagli su questo problema - stackoverflow.com/q/22948042/1977012 ).
Egel,

0

Sebbene non sia una soluzione da riga di comando, può aiutare gli macosutenti:

  1. Seleziona i tuoi file PDF
  2. Fare clic con il tasto destro del mouse sui file evidenziati
  3. Seleziona Azioni rapide > Crea PDF

0

Puoi vedere usare i pdftools gratuiti e open source (dichiarazione di non responsabilità: ne sono l'autore).

È fondamentalmente un'interfaccia Python per Latex pdfpages pacchetto .

Per unire i file pdf uno per uno, puoi eseguire:

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

Per unire tutti i file pdf in una directory, puoi eseguire:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.