Conversión de múltiples archivos de imagen de formato JPEG a PDF

Respuestas:

62

En bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
enzotib
fuente
1
¿Alguna razón particular por la que antepones "./" a los argumentos de convert? ¿Es una buena práctica general?
rahmu
44
@rahmu: sí, es una buena práctica, porque el nombre de archivo que comienza con -da problemas, de lo contrario.
enzotib
3
Esto funciona, pero mogrifyes mucho menos mecanografía. Mira mi respuesta.
cjm
+1 porque esto es técnicamente correcto y evita problemas de bash, pero -1 porque mogrify es la forma de Imagemagick de convertir imágenes por lotes. Así que no hay voto de mi parte.
Benoit
@aculich: gracias por tu voto negativo, pero hiciste una consideración incorrecta, ¿ ves por qué el bucle no genera un error de "argumento demasiado largo"? .
enzotib
56

Puedes usar el mogrifycomando para esto. Normalmente, modifica los archivos en el lugar, pero al convertir formatos, escribe un nuevo archivo (simplemente cambiando la extensión para que coincida con el nuevo formato). Así:

mogrify -format pdf -- *.jpg

(Al igual que enzotib ./*.jpg, --evita que los nombres de archivos extraños se interpreten como interruptores. La mayoría de los comandos reconocen --que significa "dejar de buscar opciones en este punto").

cjm
fuente
+1, mi respuesta fue solo sobre bash, no conozco bien ImageMagick.
enzotib
Buena idea para usar en mogrifylugar de convert. Esto funcionará para 100 archivos, pero el uso de globbing con *.jpgno escala a miles de archivos; eso se puede hacer combinando el comando en una línea simple confind .
aculich
Cómo convertir tanto *.jpg y *.pngarchivos en una sola *.pdf? Tenga en cuenta que son archivos numerados (p. Ej. 1.jpg 2.png 3.png 4.jpg) Y que el orden debe mantenerse / conservarse en la salida del pdf.
chiflado sobre natty
como una solución: convertir todos los *.jpg's en *.png' s en el paso uno, y realizar el equivalente de su respuesta en el paso 2 ...
nuez sobre Natty
ver también stackoverflow.com/questions/15315770/…
nutty about natty
24

sintaxis más rápida pero inusual:

parallel convert '{} {.}.pdf' ::: *.jpg

Se ejecuta en paralelo (usando https://www.gnu.org/software/parallel/ ). Todavía no he notado ningún subproceso múltiple convert, lo que limitaría la paralelización efectiva. Si esa es su preocupación, vea en el comentario a continuación un método para asegurarse de que no ocurra subprocesamiento múltiple.

Sebastian
fuente
1
Este camino está lleno de victorias. ¡Evalúa automáticamente el recuento de núcleos y ejecuta tantas tareas!
meawoppl
1
Este método es EL más rápido de todos.
Shivams
1
paralelo es poder, paralelo combinado con imagemagick es superpoder. Me gusta la superpotencia.
CousinCocaine
2
Un poco tarde para la fiesta aquí, pero las nuevas versiones (posiblemente no cuando se escribió esta respuesta) de ImageMagick son multiproceso, e interactuarán mal si se ejecutan en paralelo. Esto se puede deshabilitar (si se usa la paralelización a nivel de aplicación, como con GNU parallel) configurando la variable de entorno MAGICK_THREAD_LIMIT=1.
zebediah49
El uso de ImageMagick para esto resulta en pérdida de generación y bajo rendimiento. img2pdf en otra parte de esta página evita esos problemas.
Robert Fleming
16

https://gitlab.mister-muffin.de/josch/img2pdf

En todas las soluciones propuestas que involucran a ImageMagick, los datos JPEG se decodifican y se vuelven a codificar. Esto da como resultado una pérdida de generación , así como un rendimiento "diez a cien" veces peor que img2pdf.

Se puede instalar pip img2pdfsiempre que tenga dependencias (por ejemplo, apt-get install python python-pil python-setuptools libjpeg-devo yum install python python-pillow python-setuptools).

Robert Fleming
fuente
3
es correcto. Puede probar que un viaje de ida y vuelta cambia un archivo JPEG con comandos como convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. En mi humilde opinión, esta respuesta merece más votos a favor. De hecho, convertfalla aquí, img2pdfpasa dicha prueba e incluso incluye muchas opciones para establecer el tamaño de la imagen, el tamaño de la página, etc. para ajustar el pdf generado a sus necesidades.
Stéphane Gourichon
3
img2pdfestá disponible en los repositorios regulares de Ubuntu 16.04, no es necesario realizar operaciones manuales pipallí, y mantiene el beneficio de las actualizaciones.
Stéphane Gourichon
1
En el momento en que se hizo la pregunta (y se aceptó la respuesta), img2pdf no existía. Pero hoy en día img2pdf es claramente una mejor respuesta.
kmkaplan
13

Aquí hay una manera que combina las mejores sugerencias anteriores en una línea de comando simple, eficiente y robusta:

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

Funciona bien con nombres de archivo que comienzan con -o contienen espacios. Tenga en cuenta el uso de -inamecuál es la versión sin distinción entre mayúsculas y minúsculas , -namepor lo que funcionará .JPGtan bien como .jpg.

Esto se usa findpara obtener la lista de archivos en lugar de la aplicación de shell con el *.jpgcomodín, lo que puede dar como resultado un error de "Lista de argumentos demasiado larga" en algunos sistemas. Aunque como @enzotib señala en un comentario, el comportamiento de usar globbing en un bucle for es diferente al de los argumentos de un comando .

Además, findmanejará subdirectorios, mientras que el bloqueo de shell no lo hará a menos que tenga características específicas de shell como la **/*jpgsintaxis de bloqueo recurrente en zsh.

EDITAR: pensé que agregaría otra característica útil findque pensé después de leer un comentario de @IlmariKaronen sobre volver a ejecutar el comando y solo convertir archivos que han cambiado desde la primera ejecución.

En la primera pasada, puede touchcrear un archivo de marca de tiempo después de que finalice la conversión.

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

Luego agregue -newer timestampa la findexpresión para operar en el subconjunto de archivos cuya hora de última modificación es más nueva que el archivo de marca de tiempo. Continúe actualizando el archivo de marca de tiempo después de cada ejecución.

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

Esta es una manera fácil de evitar tener que recurrir a un Makefile (a menos que ya esté usando uno) y es otra buena razón por la que vale la pena usarlo findsiempre que sea posible ... tiene una expresividad versátil a la vez que es conciso.

aculich
fuente
El uso de ImageMagick para esto resulta en pérdida de generación y bajo rendimiento. img2pdf en otra parte de esta página evita esos problemas.
Robert Fleming
8

Puedes hacer esto convertdirectamente. Esto se encuentra en la parte inferior del sitio de ImageMagicks sobre el procesamiento de la línea de comandos .

convert *.jpg +adjoin page-%d.pdf
Frank Zalkow
fuente
44
o convert *.jpg -adjoin output.pdfpara un pdf combinado
ninjagecko
2
El uso de ImageMagick para esto resulta en pérdida de generación y bajo rendimiento. img2pdf en otra parte de esta página evita esos problemas.
Robert Fleming
7

He usado el siguiente archivo MAKE para algo similar:

SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))

all: $(PNG)

%.png: origs/%.svg
    convert -resize "64x" $< $@


clean: 
    rm $(PNG)

Ahora solo puedo ejecutar makey obtengo archivos png para cada archivo svg que se encuentra.

Editar

De acuerdo a lo pedido:

  • los comodines generan una lista de todos los svgs en origs /
  • pathsubst toma esta lista y produce una lista de nombres de archivos png (carpeta y extensión diferentes. Ejemplo: se origs/foo.svgconvierte foo.png)
  • Regla 1: all: $(PNG)define que el objetivo "todos" depende de todos los PNG
  • Regla 2: %.png: origs/%.svgdefine, el archivo $ X.png depende de origs / $ X.svg y puede generarse llamando convert ... $< $@.
    • $< es la dependencia yy
    • $@ es el nombre objetivo
  • REGLA 3: es solo para limpiar
reto
fuente
2
Para una tarea única, la creación de un Makefile probablemente sea exagerado, pero si alguna vez planea cambiar algunos de los PDF, al makevolver a escribirlos se reconvertirán aquellos y solo aquellos PDF que han cambiado.
Ilmari Karonen
¿Te importaría explicar qué es comodín, origs, patsubst, cómo se interpretan $ y% y $ <$ @? El resto es fácil de entender. :)
usuario desconocido el
Recurrir a makeparece un poco demasiado complicado cuando un simple trazador de líneas hará el truco.
aculich
@IlmariKaronen Estoy de acuerdo en que un Makefile es excesivo, pero es bueno tener una manera de reconvertir solo el subconjunto de archivos modificados en ejecuciones posteriores. He actualizado mi respuesta con una forma de hacerlo solo findpara que no tenga que recurrir a un Makefile.
aculich 01 de
0

Un pequeño guión haría el truco. (probado con ksh88 en Solaris 10)

script.ksh

#!/bin/ksh

[[ $# != 1 ]] && exit 255 # test for nr of args

pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname

Luego puede ejecutar findpara ejecutar el script:

find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;

Tenga en cuenta que tanto script.kshel findcomando como el que le di pueden tener diferentes sintaxis que afectan el sistema operativo y el shell que está utilizando.

rahmu
fuente
pdfname=${1%.*}.pdfreemplaza la extensión del archivo con pdf. Ese método es mucho más simple y funciona incluso si el nombre del archivo contiene caracteres especiales. En una nota relacionada, agregue comillas dobles alrededor de sustituciones variables.
Gilles 'SO- deja de ser malvado'
No hay ninguna razón para escribir un script por separado cuando todo se puede hacer con una simple línea de comando .
aculich
0

La utilidad MacOSSIPS   Bajo MacOS (Sierra), la utilidad de línea de comandos incorporada de Apple sipsproporciona acceso completo a todas las utilidades de imágenes ráster de Apple; esto resulta incluir la conversión de jpga pdf.

Por ejemplo, a partir de una baja resolución / tamaño pequeño existente jpgimagen 'cat.jpg'(tamaño de 8401 bytes), la siguiente línea de comandos crea 'cat.pdf', sin cambios en la trama resolución y mínima expansión de tamaño de archivo:

$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted>  8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf

Conversión al PSDformato de imagen ráster de Adobe   Una sipsexpresión similar crea *.psdarchivos compatibles con Adobe

$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration  staff    8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration  staff  350252 Jun 18 07:37 cat.psd

Sin embargo, tenga en cuenta la expansión de tamaño de archivo de 30 veces que acompaña el uso del formato psdráster de Adope .

Producción de libros   Al hacer una producción de libros a gran escala, que involucra cientos de imágenes, que se suministran en múltiples formatos, para mí un lenguaje de línea de comandos conveniente ha sido utilizar ImageMagickutilidades para crear archivos de imágenes ráster puras en pngformato (con todos los metadatos y perfiles de color despojado de salida), a continuación, utilizar sipspara restaurar un conjunto uniforme de los perfiles y / o comentarios de color, y utilizan sipstambién para generar archivos de salida finales (más comúnmente *.png, *.psdo *.pdfarchivos).

John Sidles
fuente
0

Desafortunadamente, convertcambia la imagen antes para que tenga una pérdida mínima de calidad del original jpgque necesita usar img2pdf, utilizo estos comandos:

1) Esto para hacer un pdfarchivo de cada jpgimagen sin pérdida de resolución o calidad:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2) Esto para concatenar las pdfpáginas en una:

pdftk *.pdf cat output combined.pdf

3) Y por último agrego una capa de texto OCRed que no cambia la calidad del escaneo en los archivos PDF para que puedan buscarse:

pypdfocr combined.pdf  
Eduard Florinescu
fuente
0

Me resolví con imagemagick para conversión y en paralelo para acelerar mi proceso de conversión:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF
Giovanny Canasto
fuente
0

Una de las formas más simples de convertir varios archivos es ir al directorio de archivos en la terminal de Linux y escribir:

$ convert *.png mypdf.pdf
Ajeet Yadav
fuente
-1

Si usa solo archivos de imagen, tal vez le gustaría usar Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • Si usa 7Z, cambie el nombre de la extensión del archivo (sufijo) a .cb7
  • Si usa ACE, cambie el nombre de la extensión del archivo (sufijo) a .cba
  • Si usa RAR, cambie el nombre de la extensión del archivo (sufijo) a .cbr
  • Si usa TAR, cambie el nombre de la extensión del archivo (sufijo) a .cbt
  • Si usa ZIP, cambie el nombre de la extensión del archivo (sufijo) a .cbz

Esto es mucho más flexible que PDF.

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wikimedia.org/wikipedia/en/wiki/Comic_book_archive

jojo
fuente
1
rechazado, porque no tiene nada que ver con la pregunta del OP.
toogley