Solución:
La última vez que usé convert
para tal tarea, especifiqué explícitamente el tamaño del destino mediante el cambio de tamaño:
$ i=150; convert a.png b.png -compress jpeg -quality 70
-density ${i}x${i} -units PixelsPerInch
-resize $((i*827/100))x$((i*1169/100))
-repage $((i*827/100))x$((i*1169/100)) multipage.pdf
los convert
El comando no siempre usa DPI como unidad predeterminada de densidad / formato de página, por lo que especificamos explícitamente DPI con el -units
opción (de lo contrario, puede obtener resultados diferentes con diferentes versiones / combinaciones de formato de entrada). El nuevo tamaño (especificado a través de -resize
) es la dimensión de una página DIN A4 en píxeles. El argumento de cambio de tamaño especifica el tamaño máximo de página. Qué resolución y calidad elegir depende exactamente del caso de uso: seleccioné 150 DPI y calidad promedio para ahorrar algo de espacio mientras no se ve tan mal cuando se imprime en papel.
Tenga en cuenta que convert
de forma predeterminada, no cambia la relación de aspecto con la operación de cambio de tamaño:
Redimensionar ajustará la imagen al tamaño solicitado. NO llena el tamaño de caja solicitado.
(Manual de ImageMagick)
Dependiendo de la versión de ImageMagick y los formatos de entrada involucrados, podría estar bien omitir el -repage
opción. Pero a veces es necesario y sin esa opción, el encabezado del PDF puede contener dimensiones demasiado pequeñas. En cualquier caso, el -repage
no debería doler.
Los cálculos usan aritmética de enteros ya que bash
solo admite eso. Con zsh
las expresiones se pueden simplificar, es decir, reemplazar con $((i*8.27))x$((i*11.69))
.
Imágenes de Lineart
Si los archivos PNG son imágenes de dos niveles (blanco y negro, también conocido como lineart), img2pdf
La herramienta produce resultados superiores a ImageMagick. convert
. Eso significa img2pdf
es más rápido y produce archivos PDF más pequeños.
Ejemplo:
$ img2pdf -o multipage.pdf a.png b.png
o:
$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
Lo que realmente quieres usar es:
$ convert a.png b.png -compress jpeg -resize 1240x1753
-extent 1240x1753 -gravity center
-units PixelsPerInch -density 150x150 multipage.pdf
-extent
extiende la imagen a 1240×1753, mientras que -resize
mantiene la proporción de la imagen, ajustándola a 1240x...
o ...x1753
.
los -gravity
El parámetro es opcional pero se puede usar para centrar la imagen cuando se extiende.
Además de la respuesta de Caugner:
habiendo instalado IM v6.6.9-7 descubrí el -gravity
el parámetro debe colocarse entre -resize
y -extent
para tener un efecto.
Además (aunque no es parte de la pregunta de la operación) encontré atractivo establecer un color de fondo diferente que daría como resultado el dominio total de
convert in.jpg -resize 1240x1750 -background black -compose Copy
-gravity center -extent 1240x1750
-units PixelsPerInch -density 150 out.pdf
Otra variación útil que utilizo a menudo cuando no quiero volver a escalar una imagen que ya tiene la relación de aspecto correcta pero que mantiene su resolución individual es
convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'
-repage a4 out.pdf
donde la densidad objetivo se determina dinámicamente calculando el ancho dividido por 8.27 (que es el ancho en pulgadas de una página A4). los -repage a4
el parámetro se puede omitir la mayor parte del tiempo, pero he tenido algunos casos en los que el .pdf resultante tendría un formato diferente ligeramente fuera de las dimensiones A4 de 210×297 mm (8.27×11.6 “)