Combinar / convertir múltiples archivos PDF en un PDF

1071

¿Cómo podría fusionar / convertir múltiples archivos PDF en un archivo PDF grande?

Intenté lo siguiente, pero el contenido del archivo de destino no era el esperado:

convert file1.pdf file2.pdf merged.pdf

Necesito una solución de línea de comando (CLI) muy simple / básica. Lo mejor sería si pudiera canalizar la salida de la fusión / conversión directamente pdf2ps(como intenté originalmente en mi pregunta anterior aquí: tubería de Linux (convertir -> pdf2ps -> lp) ).

alcohol
fuente
3
ymmv, pero esto no parece tener una resolución tan buena en el archivo de salida como pdfunite y también da como resultado un tamaño de archivo más grande que el resultado de pdfunite
sabujp
Siempre que las soluciones conserven o no los enlaces se discute en esta publicación . Si desea conservar los enlaces (probablemente junto con otras anotaciones), use pdftk si desea una interfaz de línea de comandos, pdfsam si desea una interfaz gráfica de usuario, sejda si desea una interfaz web.
Clément

Respuestas:

1389

Teniendo en cuenta que pdfunitees parte de poppler, tiene una mayor posibilidad de instalación, el uso también es más simple que pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
fuente
20
Es rápido, pero parece romper hipervínculos. Ver blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
426
Solo asegúrese de recordar proporcionar out.pdf, o de lo contrario sobrescribirá el último archivo en su comando, suspiro.
mlissner
10
El paquete para pdfunite es poppler-utils en Debian, pero puede no estar presente en versiones anteriores de Debian.
Jocelyn delalande
16
No puedo recomendar esto. El tamaño del PDF resultante es demasiado grande. Por ejemplo: Pdfunite me da un archivo de 75 MB, mientras que Ghostscript incluye todo en 1 MB.
Torben
64
Puede usar: pdfunite *.pdf out.pdfsuponiendo que no exista otro pdf en ese directorio y que su orden se conserve con "*". Si no se conserva, el uso de rangos: filename_ {0..9} .pdf lo resuelve.
lepe
549

Prueba el buen ghostscript:

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

o incluso de esta manera para una versión mejorada para archivos PDF de baja resolución (gracias a Adriano por señalar esto):

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

En ambos casos, la resolución de salida es mucho mayor y mejor que de esta manera usando convertir:

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

De esta manera no necesitaría instalar nada más, solo trabaje con lo que ya ha instalado en su sistema (al menos ambos vienen por defecto en mi rhel).

Espero que esto ayude,

ACTUALIZACIÓN: en primer lugar, ¡gracias por todos sus buenos comentarios! solo un consejo que puede funcionar para ustedes, después de buscar en Google, encontré un truco excelente para reducir el tamaño de los archivos PDF, ¡reduje un PDF de 300 MB a solo 15 MB con una resolución aceptable! y todo esto con el buen ghostscript, aquí está:

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

¡¡salud!!

Gery
fuente
27
Buen consejo, gscorre muy rápido y se comprime mucho. Sin embargo, la calidad mejoró mucho después de usar este parámetro:-dPDFSETTINGS=/prepress
Adriano P
3
Descubrí que -dPDFSETTINGS=/prepresstiene el efecto muy agradable de rotar páginas que son demasiado anchas y fuerzan molestas barras de desplazamiento horizontal.
Robert Smith
24
Agregue la siguiente línea a su .bash_profiley tendrá un atajo agradable: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }esto le ahorrará algo de escritura, si tiene que usar mucho el comando. El uso se ve así:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
Traté de encontrar la descripción de la bandera -dBATCH pero no pude. Incluso el hombre no dice nada. ¡Pero genial y sin ningún programa adicional!
Michal Gonda
3
El gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfpuede ser acortado a la gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. De la documentación : "Como una forma abreviada conveniente, puede usar la -oopción seguida de la especificación del archivo de salida como se discutió anteriormente. La -oopción también establece las opciones -dBATCHy -dNOPAUSE. Esta es una forma rápida de invocar ghostscriptpara convertir uno o más archivos de entrada".
MiniMax
513

Lo siento, logré encontrar la respuesta yo mismo usando google y un poco de suerte :)

Para los interesados;

Instalé el pdftk (kit de herramientas pdf) en nuestro servidor Debian, y usando el siguiente comando logré el resultado deseado:

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

Esto a su vez se puede canalizar directamente a pdf2ps.

alcohol
fuente
81
Usar ghostscript también podría funcionar: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl el
15
Vale la pena mencionar que pdftk puede fusionar archivos PDF cifrados mientras que pdfunite no puede
Thomas
3
ofrece una mejor resolución con pdftk compare para convertir en opciones predeterminadas.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfgenerará el archivo combinado comoout.pdf
jmiserez
2
pdftkno está disponible para sistemas EL7 debido a la falta de dependencia libgcj.
un codificador
72

Esta es la solución más fácil si tiene varios archivos y no desea escribir los nombres uno por uno:

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

SaTa
fuente
2
esto parece ser el más fácil con diferencia
baxx
1
qpdf parece romper hipervínculos en el documento
David Granqvist
2
Aunque es difícil entender las complejas opciones para comenzar, qpdf es una herramienta muy útil y poderosa. La documentación en línea está disponible aquí
Jonathan Holvey, el
¡Definitivamente el más útil!
Lucky
54

También pdfjoin a.pdf b.pdfcreará una nueva b-joined.pdfcon los contenidos de a.pdf y b.pdf

rodrigob
fuente
55
Esto es agradable y sucinto, pero rompe los hipervínculos.
estrella brillante
3
pdfjoin (pdflatex) falla con archivos con muchas páginas. Error al combinar archivos de 1k páginas.
mdrozdziel
pdfjoin rompe anotaciones o elementos no gráficos adicionales
sabujp
La fuente "URW Palladio L" se hizo invisible después de unir las páginas.
v_2e
99
pdfunite generalmente funciona bien, pero si dice "Característica no implementada: no se pudieron fusionar archivos cifrados", pdfjoin es una buena alternativa. Por alguna razón, pdfjoin no se queja del cifrado.
Calaf
38

Puedes usar el comando convertir directamente,

p.ej

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
fuente
40
Esto no es sin pérdida.
Ben Ruijl
12
Puede convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, pero el tamaño del archivo resultante podría ser demasiado grande. Sugeriría en su convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdflugar.
arielnmz
21
Parece que esto implica convertir todo en imágenes ráster, lo que definitivamente no es lo mejor, especialmente cuando se trata de archivos PDF basados ​​en texto.
Pterosaurio
55
casi una copia de lo que el OP ha descrito como no funciona
user829755
15
No use convertir para archivos postscript o PDF a menos que vaya de vector a ráster y nunca regrese. Es difícil exagerar qué mala idea es esta.
markgalassi
32

pdfuniteestá bien fusionar archivos PDF completos. Si desea, por ejemplo, las páginas 2-7 de file1.pdf y las páginas 1,3,4 de file2.pdf, debe usar pdfseparatepara dividir los archivos en PDF separados para cada página pdfunite.

En ese punto, probablemente desee un programa con más opciones. qpdfes la mejor utilidad que he encontrado para manipular archivos PDF. pdftkes más grande y más lento y Red Hat / Fedora no lo empaqueta debido a su dependencia de gcj. Otras utilidades PDF tienen dependencias Mono o Python. Descubrí que qpdfprodujo un archivo de salida mucho más pequeño que usar pdfseparatey pdfuniteensamblar páginas en un PDF de salida de 30 páginas, 970kB frente a 1,6450 kB. Como ofrece muchas más opciones, qpdfla línea de comandos no es tan simple; la solicitud original para fusionar file1 y file2 se puede realizar con

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
esquiador
fuente
2
Tanto esto La parábola, por ejemplo, ya no se empaqueta pdftkdebido a su dependencia gcj, por lo que creo que se ha eliminado el soporte. A pesar de buscar herramientas de manipulación de PDF vía pacman -Ss pdf, me perdí esto. Gracias por esta respuesta! Debería recibir más votos a favor, por lo que aparece justo al lado de sugerencias para pdfuniteo pdftk.
k.stm
1
En mi nueva instalación de Linux Mint, esto se ejecutó en la ventana Terminal sin requerir ninguna instalación o ajuste de ruta. ¡Agradable!
Wallace Kelly
Esto funcionó perfectamente y también dio un documento combinado más claro que los otros comandos que probé. Gracias por la publicacion.
Siwoku Adeola
14

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

PDFMerger Esta aplicación tomará una lista de documentos pdf y los fusionará, guardando el resultado en un nuevo documento.

uso: java -jar pdfbox-app-xyzjar PDFMerger "Archivos PDF de origen (2 ..n)" "Archivo PDF de destino"

Lumpchen
fuente
11

Use herramientas PDF de python https://pypi.python.org/pypi/pdftools/1.0.6

Descargue el archivo tar.gz, descomprímalo y ejecute el comando como se muestra a continuación

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

Debe instalar pyhton3 antes de ejecutar el comando anterior

Estas herramientas son compatibles con las siguientes

  • añadir
  • insertar
  • Eliminar
  • Girar
  • División
  • Unir
  • Código Postal

Puede encontrar más detalles en el siguiente enlace y es de código abierto

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
fuente
Esto es perfecto. El uso gs(todas las variantes enumeradas anteriormente), una simple combinación de dos archivos PDF, 2MB y 500Kb, estaba tardando unos minutos en completarse y el resultado era un archivo de 40MB. pdftoolsse completa instantáneamente con un tamaño de archivo idéntico.
supergra
10

Puedes usar sejda-console , gratis y de código abierto. Descomprimirlo y correr sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Conserva marcadores, anotaciones de enlaces, acroformas, etc. en realidad tiene muchas opciones con las que puedes jugar, solo corre sejda-console merge -hpara verlas todas.

Andrea Vacondio
fuente
OMHO la mejor herramienta para hacer este tipo de tareas
mario ruiz
8

Si desea convertir todas las imágenes descargadas en un pdf, ejecute

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

Trupti Kini
fuente
66
No use convertir para archivos postscript o PDF a menos que vaya de vector a ráster y nunca regrese. Es difícil exagerar qué mala idea es esta.
markgalassi
6

Secundo la pdfuniterecomendación. Sin embargo Argument list too long, recibí errores al intentar fusionar archivos> 2k PDF.

Me volví a Python para esto y dos paquetes externos: PyPDF2 (para manejar todo lo relacionado con PDF) y natsort (para hacer un tipo "natural" de los nombres de archivo del directorio). En caso de que esto pueda ayudar a alguien:

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
fuente
66
"La lista de argumentos es demasiado larga" indica que está sobrepasando el tamaño del búfer asignado por el shell para el entorno; en realidad no es una limitación de la herramienta. En tal caso, cambiar a Python puede ser excesivo, ya que puede simplemente procesar por lotes: find input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Esto creará lotes de 500 archivos procesados ​​en serie, ordenará los archivos temporales resultantes en el orden correcto , y producir un archivo de salida apropiado; necesitará limpiar los archivos temporales después)
enkiv2
4

Aquí hay un método que uso que funciona y es fácil de implementar. Esto requerirá las bibliotecas fpdf y fpdi que se pueden descargar aquí:

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
fuente
4

Soy parcial al ser uno de los desarrolladores de PyMuPDF (un enlace de Python de MuPDF).

Puedes hacer fácilmente lo que quieras con él (y mucho más). El código esqueleto funciona así:

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

Eso es todo. Hay varias opciones disponibles para seleccionar solo rangos de páginas, mantener una tabla de contenido conjunta, invertir la secuencia de páginas o cambiar la rotación de páginas, etc., etc.

Estamos en PyPi.

Jorj McKie
fuente
3

Me gusta la idea de Chasmo, pero prefiero usar las ventajas de cosas como

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

Dar múltiples archivos fuente a los convertconduce a fusionarlos en un pdf común. Este comando combina todos los archivos con .pdfextensión en el directorio real en el directorio merged.pdfprincipal.

usuario3709983
fuente
55
Dado lo parecido que parece a la pregunta original, parece que esto debería haber sido un comentario, no una respuesta. Con un poco más de representación, podrás publicar comentarios . Hasta entonces, no utilice las respuestas como solución alternativa.
Nathan Tuggy
1
@Silfheed No, ¡responde la pregunta! Aunque la respuesta quizás debería haber sido más elaborada.
peterh - Restablece a Monica
77
No use convertir para archivos postscript o PDF a menos que vaya de vector a ráster y nunca regrese. Es difícil exagerar qué mala idea es esta.
markgalassi
13
¿Cuál es el punto de usar $(ls *.pdf)en lugar de comodín simple *.pdf?
firegurafiku
Además, con referencia a la respuesta @firegurafiku, con ls *.pdfcomodín pierde el control sobre el orden de los archivos combinados. En un ejemplo, la siguiente lista: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf se fusionará como 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (debido a la forma predeterminada de ordenar archivos de Linux; aquí tiene más detalles sobre este problema: stackoverflow.com/q/22948042/1977012 ).
Egel
0

Aunque no es una solución de línea de comandos, puede ayudar a los macosusuarios a:

  1. Selecciona tus archivos PDF
  2. Haga clic derecho en sus archivos resaltados
  3. Seleccione Acciones rápidas > Crear PDF
DevonDahon
fuente
0

Puede ver el uso de las herramientas pdftools gratuitas y de código abierto (descargo de responsabilidad: soy el autor de la misma).

Básicamente es una interfaz de Python para el pdfpagespaquete Latex .

Para combinar archivos PDF uno por uno, puede ejecutar:

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

Para fusionar todos los archivos pdf en un directorio, puede ejecutar:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
raffaem
fuente