¿Cómo puedo combinar múltiples archivos PDF usando la línea de comando?

52

¿Hay una línea rápida para combinar múltiples archivos PDF en uno?

Sé que se puede hacer usando Preview.app

reacuna
fuente

Respuestas:

75

Eche un vistazo a "Combinar archivos PDF en la línea de comandos en OSX" en Unir archivos PDF en OS X desde la línea de comandos .

Resulta que desde Tiger en adelante, OSX se envía con un script Python que hace exactamente lo que necesita. El script ya es ejecutable y Python está preinstalado en OS X, por lo que todo lo que necesita hacer para ejecutarlo es abrir el Terminal y escribir

"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" -o PATH/TO/YOUR/MERGED/FILE.pdf /PATH/TO/ORIGINAL/1.pdf /PATH/TO/ANOTHER/2.pdf /PATH/TO/A/WHOLE/DIR/*.pdf

También en la página del enlace se sugiere hacer un enlace simbólico para el join.pyarchivo para facilitar la escritura sin embargo, omiten el -sen ln -s ... ..., y sin ella, se crea un vínculo físico. Probablemente no importaría, aunque lo mencionaría.

usuario3439894
fuente
Trabajó para mi. Una gran cosa aquí es evitar tener que instalar paquetes adicionales que quizás nunca vuelvas a usar. Gracias.
gvrocha
Trabajó para mí en El Capitan 10.11.6.
pabuisson
2
Advertencia : tenía archivos PDF donde se estropeaba la rotación de varias páginas
adius
28

Simplemente instale Ghostscript usando Brew con el comando:

brew install gs

Luego ejecute el comando con todos los archivos enumerados:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf source1.pdf source2.pdf source3.pdf
Bartosz Petryński
fuente
OS X / macOS ya tiene una forma nativa de combinar archivos PDF desde la línea de comandos, entonces, ¿por qué perder el tiempo de tener que instalar primero las Herramientas de línea de comandos para Xcode, Homebrew y luego Ghostscript, para hacer algo que ya se puede hacer de forma nativa sin tener que instalar alguno de los paquetes mencionados?
user3439894
55
@ user3439894 muchas personas ya tienen instalados estos paquetes comunes y ya los están utilizando, gspor lo que para referencia futura esta solución sería igual de conveniente.
htor
1
@ user3439894 veo la confusión. Me dirijo a usted porque estaba cuestionando el valor de esta respuesta. Usar homebrew para instalar utilidades de línea de comandos es muy común en estos días, por lo que no lo llamaría una pérdida de tiempo. Para muchas personas, esta respuesta proporciona una solución igualmente buena que la suya.
htor
77
esto funcionó para mí, el comando py no
Thieme Hennis
2
Según el comentario de Thieme Hennis, el script join.py se bloquea en High Sierra por un error de segmentación. Pero gs funciona perfectamente.
arcdale
2

El script de Python de Apple en la acción de Automator es muy lento, ya que utiliza las API CGPDFDocument de CoreGraphics, en lugar del nuevo marco PDFKit. También importa toda la biblioteca CoreGraphics, en lugar de solo las API requeridas.

Aquí se puede encontrar una secuencia de comandos de Python más rápida y alternativa :

Este script también agrega una tabla de contenido al PDF, que enumera cada archivo de componente (y combina ToC existentes), que Apple no lo hace.

Se puede usar en la línea de comando (con nombres de archivo PDF como argumentos), o en una acción de script de shell de Automator, para realizar una Acción / Servicio rápido para el Finder.

benwiggy
fuente
1
A modo de prueba, utilizando el time comando junto con su joinpdfs.py guión , la incorporada en el join.py guión y dos archivos de ~ 200 MB cada uno, el joinpdfs.py guión fue de 9 segundos más rápido que el incorporado en la join.py secuencia de comandos , por supuesto, con la ventaja añadida de tener el TOC intacta . ¡Agradable! +1
usuario3439894
Por cierto, 9 segundos pueden no parecer mucho, pero fue 1/3 del tiempo total del guión incorporado , por lo que 1/3 del tiempo más rápido es significativo.
user3439894
1

FWIW, he escrito un pequeño programa rápido que te permite hacer esto sin tener que depender de dependencias externas como el sistema python y demás. En github aquí: pdfmerge y bastante simple de usar, puede pasarle una lista de archivos PDF para fusionar pdfmerge in1.pdf in2.pdf ... out.pdf, pasarle una lista de archivos para fusionar en un archivo de texto pdfmerge infileslist.txt out.pdfo simplemente hacer el directorio actual en orden ABC pdfmerge out.pdf. Lo escribí como un proyecto de aprendizaje, de forma gratuita y abierta, y puedes obtener el último binario de la pestaña de lanzamientos en github.

Paul Gowder
fuente
Dado que Python está instalado por defecto en y como parte de macOS, no necesariamente lo considero una dependencia externa per se. En otras palabras, para usar lo que ya está disponible de fábrica en macOS para unir archivos PDF, el join.pyscript de la acción Combinar páginas PDF en Automator, no es necesario descargar ni instalar nada más, pero para usar el suyo tendría que descárguelo e instálelo. Tampoco vi un binario en el enlace.
user3439894
1
Por cierto, examiné tu código y es interesante que estés usando dos de los componentes principales (Foundation y Quartz) que el script de Python ya está usando también. ¿Hay algo en su código que sea intrínsecamente mejor para influir en su uso sobre lo que ya se ofrece por defecto sin tener que descargar nada, mientras que con el suyo tiene que tomar pasos adicionales y adicionales para usarlo?
user3439894
1
Para las personas que no usan Python para otra cosa, probablemente tenga más sentido usar el script proporcionado por Apple. Pero para las personas que usan Python, puede ser una gran molestia administrar múltiples versiones (el sistema Python es 2.7, el moderno Python es 3.x) con diferentes instalaciones de módulos y otras cosas. En mi máquina, por ejemplo, mi $ PATH apunta a un Python totalmente diferente. Esto se puede resolver con un uso juicioso de shebangs y demás, pero me resulta molesto. YMMV, por supuesto. Además, enlace directo a la página de descarga binaria: github.com/paultopia/pdfmerge/releases/latest
Paul Gowder
1

sobre la base de @Bartosz Petryński 's respuesta agradable , podemos hacer propia una mínima cpdfutilidad en la parte superior de GhostScript:

brew install gs
cpdf () { 
  gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$1" "${@:2}"
}

luego úsalo como:

cpdf merged.pdf file1.pdf file2.pdf file3.pdf
Micah Stubbs
fuente
0

Encontré que la herramienta de línea de comandos Coherente PDF gratuita es la mejor opción. Es muy rápido, sin pérdidas y no daña la orientación o los hipervínculos como lo hicieron algunas otras soluciones. El formato es:

cpdf file1.pdf file2.pdf -o output.pdf
gwint
fuente