Fusionner / convertir plusieurs fichiers PDF en un seul PDF

1072

Comment fusionner / convertir plusieurs fichiers PDF en un seul grand fichier PDF?

J'ai essayé ce qui suit, mais le contenu du fichier cible n'était pas celui attendu:

convert file1.pdf file2.pdf merged.pdf

J'ai besoin d'une solution de ligne de commande (CLI) très simple / basique. Le mieux serait de pouvoir diriger directement la sortie de la fusion / conversion pdf2ps(comme tenté à l'origine dans ma question posée ici: tuyauterie Linux (convertir -> pdf2ps -> lp) ).

de l'alcool
la source
3
ymmv, mais cela ne semble pas avoir une aussi bonne résolution dans le fichier de sortie que pdfunite et cela entraîne également une taille de fichier plus grande que la sortie de pdfunite
sabujp
Chaque fois que les liens sont préservés ou non par ces solutions est discuté dans cet article . Si vous souhaitez conserver les liens (probablement avec d'autres annotations), utilisez pdftk si vous voulez une interface de ligne de commande, pdfsam si vous voulez une interface utilisateur graphique, sejda si vous voulez une interface web.
Clément

Réponses:

1389

Étant donné qu'il pdfunitefait partie de poppler, il a plus de chances d'être installé, l'utilisation est également plus simple que pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
la source
20
C'est rapide, mais il semble casser les hyperliens. Voir blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
426
Assurez-vous simplement de vous souvenir de fournir out.pdf, sinon il écrasera le dernier fichier de votre commande, soupir.
mlissner
10
le paquet pour pdfunite est poppler-utils dans debian mais peut ne pas être présent dans les anciennes versions de debian.
Jocelyn delalande
16
Je ne peux pas recommander cela. La taille du PDF résultant est beaucoup trop grande. Par exemple: Pdfunite me donne un fichier de 75 Mo tandis que Ghostscript rassemble tout dans 1 Mo.
Torben
64
Vous pouvez utiliser: en pdfunite *.pdf out.pdfsupposant qu'aucun autre pdf n'existe dans ce répertoire et que leur ordre est conservé par "*". S'il n'est pas conservé, l'utilisation de plages: filename_ {0..9} .pdf le résout.
lepe
549

Essayez le bon ghostscript:

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

ou même de cette façon pour une version améliorée pour les PDF basse résolution (merci à Adriano de l'avoir signalé):

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

Dans les deux cas, la résolution de sortie est beaucoup plus élevée et meilleure que celle-ci en utilisant convert:

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

De cette façon, vous n'auriez pas besoin d'installer autre chose, travaillez simplement avec ce que vous avez déjà installé dans votre système (au moins les deux viennent par défaut dans mon rhel).

J'espère que cela t'aides,

MISE À JOUR: tout d'abord merci pour tous vos gentils commentaires !! juste une astuce qui peut fonctionner pour vous les gars, après avoir googlé, j'ai trouvé une superbe astuce pour réduire la taille des PDF, j'ai réduit avec elle un PDF de 300 Mo à seulement 15 Mo avec une résolution acceptable! et tout cela avec le bon ghostscript, le voici:

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

à votre santé!!

Gery
la source
27
Belle astuce, gstourne très vite et ça compresse beaucoup. Cependant, la qualité s'est beaucoup améliorée après avoir utilisé ce paramètre:-dPDFSETTINGS=/prepress
Adriano P
3
J'ai trouvé que cela -dPDFSETTINGS=/prepressavait le très bel effet de faire tourner des pages trop larges et de forcer les barres de défilement horizontales gênantes.
Robert Smith
24
Ajoutez la ligne suivante à votre .bash_profileet vous avez un joli raccourci: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }cela vous évite de taper si vous devez beaucoup utiliser la commande. L'utilisation ressemble à ceci:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
J'ai essayé de trouver la description de l'indicateur -dBATCH mais je n'ai pas pu. Même l'homme gs ne dit rien. Mais super et sans programmes supplémentaires!
Michal Gonda
3
Le gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfpeut être raccourci en gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. De la documentation : "Comme raccourci pratique, vous pouvez utiliser l' -ooption suivie de la spécification du fichier de sortie comme expliqué ci-dessus. L' -ooption définit également les options -dBATCHet -dNOPAUSE. Ceci est destiné à être un moyen rapide d'invoquer ghostscriptpour convertir un ou plusieurs fichiers d'entrée."
MiniMax
513

Je suis désolé, j'ai réussi à trouver la réponse moi-même en utilisant Google et un peu de chance :)

Pour ceux intéressés;

J'ai installé le pdftk (boîte à outils pdf) sur notre serveur Debian, et en utilisant la commande suivante, j'ai obtenu la sortie souhaitée:

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

OU

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

Cela peut à son tour être canalisé directement dans pdf2ps.

de l'alcool
la source
81
L'utilisation de ghostscript peut également fonctionner: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl
15
Il convient de mentionner que pdftk peut fusionner des fichiers PDF chiffrés alors que pdfunite ne peut pas
Thomas
3
donne une meilleure résolution avec pdftk comparer pour convertir dans les options par défaut.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfaffichera le fichier fusionné sous la formeout.pdf
jmiserez
2
pdftkn'est pas disponible pour les systèmes EL7 en raison d'une dépendance manquante libgcj.
un codeur
72

C'est la solution la plus simple si vous avez plusieurs fichiers et que vous ne souhaitez pas saisir les noms un par un:

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

SaTa
la source
2
cela semble de loin le plus simple
baxx
1
qpdf semble briser les hyperliens dans le document
David Granqvist
2
Bien qu'il soit difficile de se familiariser avec les options complexes pour commencer, qpdf est un outil très pratique et puissant. La documentation en ligne est disponible ici
Jonathan Holvey
Certainement le plus pratique!
Chanceux
54

En pdfjoin a.pdf b.pdfcréera également un nouveau b-joined.pdfavec le contenu de a.pdf et b.pdf

rodrigob
la source
5
C'est agréable et succinct, mais casse les hyperliens.
étoile brillante
3
pdfjoin (pdflatex) échoue avec des fichiers avec beaucoup de pages. Impossible de fusionner vers des fichiers de 1 000 pages.
mdrozdziel
pdfjoin rompt les annotations ou autres éléments non graphiques
sabujp
La police "URW Palladio L" est devenue invisible après avoir joint les pages au pdf.
v_2e
9
pdfunite fonctionne généralement bien, mais s'il indique "Fonction non implémentée: Impossible de fusionner les fichiers cryptés", pdfjoin est une bonne alternative. Pour une raison quelconque, pdfjoin ne se plaint pas du cryptage.
Calaf
38

Vous pouvez utiliser la commande convert directement,

par exemple

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
la source
40
Ce n'est pas sans perte.
Ben Ruijl
12
Vous pouvez convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, mais la taille du fichier résultant pourrait être beaucoup trop grande. Je suggère convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfplutôt.
arielnmz
21
Cela implique de tout convertir en images raster, semble-t-il, ce qui n'est certainement pas le meilleur, surtout lorsqu'il s'agit de PDF textuels.
Pterosaur
5
presque une copie de ce que l'OP a décrit comme ne fonctionnant pas
user829755
15
N'utilisez pas la conversion pour les fichiers postscript ou PDF, sauf si vous passez du vecteur au raster et ne revenez jamais en arrière. Il est difficile d'exagérer à quel point c'est une mauvaise idée.
markgalassi
32

pdfuniteest bien pour fusionner des PDF entiers. Si vous voulez, par exemple, les pages 2 à 7 du fichier1.pdf et les pages 1, 3, 4 du fichier2.pdf, vous devez utiliser pdfseparatepour diviser les fichiers en PDF séparés pour chaque page à donner pdfunite.

À ce stade, vous voulez probablement un programme avec plus d'options. qpdfest le meilleur utilitaire que j'ai trouvé pour manipuler des PDF. pdftkest plus grand et plus lent et Red Hat / Fedora ne le compile pas à cause de sa dépendance à gcj. D'autres utilitaires PDF ont des dépendances Mono ou Python. J'ai trouvé qpdfproduit un fichier de sortie beaucoup plus petit que l'utilisation pdfseparateet l' pdfuniteassemblage de pages dans un PDF de sortie de 30 pages, 970 Ko contre 1 6450 Ko. Parce qu'elle offre beaucoup plus d'options, qpdfla ligne de commande de n'est pas aussi simple; la demande d'origine de fusionner le fichier1 et le fichier2 peut être effectuée avec

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
skierpage
la source
2
Tellement ça. Parabola, par exemple, ne fait plus de package à pdftkcause de sa dépendance à l'égard gcjde laquelle le support a été supprimé, je crois. Malgré la recherche d'outils de manipulation de pdf via pacman -Ss pdf, j'ai raté cela. Merci pour cette réponse! Je devrais recevoir beaucoup plus de votes positifs, donc cela apparaît juste à côté des suggestions pour pdfuniteou pdftk.
k.stm
1
Sur ma nouvelle installation de Linux Mint, cela a fonctionné dans la fenêtre Terminal sans nécessiter aucune installation ni ajustement de chemin. Agréable!
Wallace Kelly
Cela a parfaitement fonctionné et a également donné un document fusionné plus clair que les autres commandes que j'ai essayées. Merci pour le post.
Siwoku Adeola
14

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

PDFMerger Cette application prendra une liste de documents pdf et les fusionnera, enregistrant le résultat dans un nouveau document.

utilisation: java -jar pdfbox-app-xyzjar PDFMerger "Fichiers PDF source (2 ..n)" "Fichier PDF cible"

lumpchen
la source
11

Utilisez les outils PDF de python https://pypi.python.org/pypi/pdftools/1.0.6

Téléchargez le fichier tar.gz et décompressez-le et exécutez la commande comme ci-dessous

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

Vous devez installer pyhton3 avant d'exécuter la commande ci-dessus

Ces outils prennent en charge les éléments ci-dessous

  • ajouter
  • insérer
  • Retirer
  • Tourner
  • Divisé
  • Fusionner
  • Zip *: français

Vous pouvez trouver plus de détails dans le lien ci-dessous et c'est open source

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
la source
C'est parfait. En utilisantgs (toutes les variantes répertoriées ci-dessus), une simple fusion de deux fichiers PDF, 2 Mo et 500 Ko, prenait quelques minutes et aboutissait à un fichier de 40 Mo! pdftoolsse termine instantanément avec une taille de fichier identique.
supergra
10

Vous pouvez utiliser sejda-console , gratuit et open source. Décompressez-le et exécutez sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Il préserve les signets, les annotations de liens, les acroformes, etc. il a en fait beaucoup d'options avec sejda-console merge -hlesquelles vous pouvez jouer, il suffit de courir pour les voir tous.

Andrea Vacondio
la source
OMHO le meilleur outil pour effectuer ce type de tâches
mario ruiz
8

Si vous souhaitez convertir toutes les images téléchargées en un seul pdf, exécutez

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

Trupti Kini
la source
6
N'utilisez pas la conversion pour les fichiers postscript ou PDF, sauf si vous passez du vecteur au raster et ne revenez jamais en arrière. Il est difficile d'exagérer à quel point c'est une mauvaise idée.
markgalassi
6

J'appuie la pdfuniterecommandation. J'obtenais cependant des Argument list too longerreurs alors que j'essayais de fusionner> 2k fichiers PDF.

Je me suis tourné vers Python pour cela et deux packages externes: PyPDF2 (pour gérer tout ce qui est lié au PDF) et natsort (pour faire une sorte "naturelle" des noms de fichiers du répertoire). Au cas où cela pourrait aider quelqu'un:

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
la source
6
"Liste d'arguments trop longue" indique que vous dépassez la taille de tampon allouée au shell pour l'environnement - ce n'est pas en fait une limitation de l'outil. Dans un tel cas, le passage à Python peut être excessif, car vous pouvez simplement effectuer un batch: find input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Cela va créer des lots de 500 fichiers traités en série, faire trier les fichiers temporaires résultants dans le bon ordre , et produisez un fichier de sortie approprié; vous devrez nettoyer les fichiers temporaires après)
enkiv2
4

Voici une méthode que j'utilise qui fonctionne et est facile à mettre en œuvre. Cela nécessitera les bibliothèques fpdf et fpdi qui peuvent être téléchargées ici:

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
la source
4

Je suis partisan d'être l'un des développeurs de PyMuPDF (une liaison Python de MuPDF).

Vous pouvez facilement en faire ce que vous voulez (et bien plus encore). Le code squelette fonctionne comme ceci:

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

C'est à peu près ça. Plusieurs options sont disponibles pour sélectionner uniquement des plages de pages, maintenir une table des matières commune, inverser la séquence des pages ou modifier la rotation des pages, etc., etc.

Nous sommes sur PyPi.

Jorj McKie
la source
3

J'aime l'idée de Chasmo, mais je préfère utiliser les avantages de choses comme

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

Donner plusieurs fichiers source convertconduit à les fusionner dans un pdf commun. Cette commande fusionne tous les fichiers avec .pdfextension dans le répertoire réel dans le répertoire merged.pdfparent.

user3709983
la source
5
Étant donné à quel point cela ressemble à la question d'origine, il semble que cela aurait dû être un commentaire, pas une réponse. Avec un peu plus de représentants, vous pourrez poster des commentaires . D'ici là, veuillez ne pas utiliser les réponses comme solution de contournement.
Nathan Tuggy
1
@Silfheed Non, cela répond à la question! Bien que la réponse aurait peut-être dû être plus élaborée.
peterh
7
N'utilisez pas la conversion pour les fichiers postscript ou PDF, sauf si vous passez du vecteur au raster et ne revenez jamais en arrière. Il est difficile d'exagérer à quel point c'est une mauvaise idée.
markgalassi
13
Quel est l'intérêt d'utiliser $(ls *.pdf)à la place d'un simple caractère générique *.pdf?
firegurafiku
De plus, en référence à la réponse @firegurafiku, avec le ls *.pdfcaractère générique, vous perdez le contrôle de l'ordre des fichiers fusionnés. Dans un exemple, la liste suivante: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf sera en fait fusionnée comme 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (en raison de la manière par défaut de Linux de commander les fichiers - ici vous avez plus de détails sur ce problème - stackoverflow.com/q/22948042/1977012 ).
Egel
1

Vous pouvez voir utiliser les pdftools gratuits et open source (avertissement: j'en suis l'auteur).

Il s'agit essentiellement d'une interface Python pour le pdfpagespackage Latex .

Pour fusionner les fichiers pdf un par un, vous pouvez exécuter:

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

Pour fusionner tous les fichiers pdf d'un répertoire, vous pouvez exécuter:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
raffaem
la source
0

Bien qu'il ne s'agisse pas d'une solution en ligne de commande, elle peut aider les macosutilisateurs:

  1. Sélectionnez vos fichiers PDF
  2. Faites un clic droit sur vos fichiers en surbrillance
  3. Sélectionnez Actions rapides > Créer un PDF
DevonDahon
la source