convertire immagini in pdf: come rendere le pagine PDF della stessa dimensione


45

Ho fatto qualcosa di simile

convert -page A4 -compress A4 *.png CH00.pdf

Ma la prima pagina è molto più grande delle pagine successive. Questo succede anche se le dimensioni dell'immagine sono simili. Queste immagini vengono scansionate e ritagliate, pertanto potrebbero presentare lievi differenze nelle dimensioni

Ho pensato che -page A4dovrebbe correggere la dimensione delle pagine?

Risposte:


60

L'ultima volta che ho usato convertper tale compito ho specificato esplicitamente la dimensione della destinazione tramite il ridimensionamento:

$ 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

Il convertcomando non utilizza sempre DPI come unità predefinita di densità / formato pagina, quindi specifichiamo esplicitamente DPI con l' -unitsopzione (altrimenti potresti ottenere risultati diversi con versioni / combinazioni di formati di input differenti). La nuova dimensione (specificata tramite -resize) è la dimensione di una pagina DIN A4 in pixel. L'argomento ridimensionamento specifica la dimensione massima della pagina. La risoluzione e la qualità da scegliere dipendono esattamente dal caso d'uso: ho selezionato 150 DPI e una qualità media per risparmiare un po 'di spazio mentre non sembra male quando stampato su carta.

Si noti che convertper impostazione predefinita non cambia le proporzioni con l'operazione di ridimensionamento:

Il ridimensionamento adatta l'immagine alla dimensione richiesta. NON riempie, la dimensione della scatola richiesta.

( Manuale ImageMagick )

A seconda della versione di ImageMagick e dei formati di input coinvolti, potrebbe essere opportuno omettere l' -repageopzione. Ma a volte è necessario e senza quell'opzione l'intestazione PDF potrebbe contenere dimensioni troppo piccole. In ogni caso, -repagenon dovrebbe far male.

I calcoli usano l'aritmetica dei numeri interi poiché bashsupporta solo quello. Con zshle espressioni può essere semplificato - cioè sostituito con $((i*8.27))x$((i*11.69)).

Immagini di Lineart

Se i file PNG sono immagini a due livelli (in bianco e nero aka lineart), lo img2pdfstrumento produce risultati superiori su ImageMagick convert. Ciò significa che img2pdfè più veloce e produce PDF più piccoli.

Esempio:

$ img2pdf -o multipage.pdf a.png b.png

o:

$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png

2
quando uso -repage a4ottengo uninvalid argument for option '-repage': a4
Scolytus

1
@Scolytus, su un sistema Fedora 19 ho riscontrato un problema simile - sembra che -repagenon supporti più il nome a4. Ho lavorato su questo tramite l'aritmetica della shell:-repage $((150*8.27))x$((150*11.69))
maxschlepzig

Presumo che quei numeri magici siano 150 dpi e A4 espressi in unità legacy?
Michael Scheper,

@MichaelScheper, sì, dpi e pollici.
maxschlepzig

Grazie, aiutatemi. In realtà l' -density 150argomento era importante da aggiungere.
dma_k,

23

Quello che vuoi veramente usare è:

$ convert a.png b.png -compress jpeg -resize 1240x1753 \
                      -extent 1240x1753 -gravity center \
                      -units PixelsPerInch -density 150x150 multipage.pdf

-extentestende effettivamente l'immagine a 1240x1753, mentre -resizemantiene il rapporto dell'immagine, adattandolo a uno 1240x...o ...x1753.

Il -gravityparametro è facoltativo ma può essere utilizzato per centrare l'immagine durante l'estensione.


1
Grazie! -extentè davvero quello che voglio usare :) - per favore, aggiungi la citazione mancante a sinistra davanti a -extent, grazie!
brownian

Grazie, alla fine ho aggiunto il segno di spunta mancante! ;-)
caugner,

9

Aggiunta alla risposta di Caugner :

dopo aver installato IM v6.6.9-7 ho scoperto che il -gravityparametro deve essere inserito tra -resizee -extentavere un effetto.

inoltre (anche se non fa parte della domanda operativa) ho trovato attraente un diverso colore di sfondo che comporterebbe il comando totale di

convert in.jpg -resize 1240x1750 -background black -compose Copy\
               -gravity center -extent 1240x1750\
               -units PixelsPerInch -density 150 out.pdf

un'altra utile variante che utilizzo spesso quando non desidero ridimensionare un'immagine che presenta già le proporzioni corrette ma mantenere la sua risoluzione individuale è

convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'\
               -repage a4 out.pdf

dove la densità target viene determinata dinamicamente calcolando la larghezza divisa per 8.27 (che è la larghezza in pollici di una pagina A4). il -repage a4parametro può essere omesso per la maggior parte del tempo, ma ho avuto alcuni casi in cui il .pdf risultante avrebbe un formato diverso dalle dimensioni A4 di 210x297mm (8.27x11.6 ")


2

Ho trovato molto utile il codice di Mikher, tuttavia espone il PDF interamente come verticale o orizzontale, quindi l'ho modificato per controllare il layout di ciascun file di input e abbinarlo nell'output.

Non ho incluso la modifica di Yotam perché funziona senza di essa sulla mia casella Ubuntu 15.04.

$#!/bin/bash

# Resizes files to A4 (or other size - change PaperWdthMetr and PaperHghtMetr below) and merges into a PDF

export LOCALE=C

[[ "${2}x" == "x" ]] && \
 { echo "Usage: $( basename $0 ) output.pdf extension"
   echo "       merges all files (*.extension) into a single PDF"
   echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
 exit 1
 } || \
 OutName="$1"
 ext="$2"

# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white"      # what colour for paper
IMQuality="91"            # JPEG compression level
PaperHghtMetr="297"       # milimeters, 297 for ISO A4
PaperWdthMetr="210"       # milimeters, 210 for ISO A4
PaperDens="200"           # maximum (wanted) dpi for a page
PaperHInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10      | bc -l ) # Inch
PaperWInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10      | bc -l ) # Inch
PaperRtio=$(     echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )

# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null

# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
  echo "Converting $FName"
  ImgIdentify=$( identify -format "%w %h" "$FName" )
  ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1  )
  ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2  )
  ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig"  | bc -l )


# Match output page layout - Landscape or Portrait - to input file
  if (( $(echo "$ImgRtio > 1 && $PaperRtio > 1 || $ImgRtio < 1 && $PaperRtio < 1" |bc -l) )); then
    echo "Portrait"
    PaperHghtInch=$PaperHInch
    PaperWdthInch=$PaperWInch
  else
    echo "Landscape"
    PaperHghtInch=$PaperWInch
    PaperWdthInch=$PaperHInch
  fi


  [[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
    && ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
    || ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
  [[ $Debug ]] && echo "ImgDens1: $ImgDens"
  [[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
    && ImgDens=$PaperDens
  [[ $Debug ]] && echo "ImgDens2: $ImgDens"

  ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
  ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels

  [[ $Debug ]] && echo "ImgWdth: $ImgWdth".
  [[ $Debug ]] && echo "ImgHght: $ImgHght".

  convert "${FName}"                                 \
          -resize ${ImgWdth}x${ImgHght}              \
          -background $IMBackground -gravity center  \
          -extent ${ImgWdth}x${ImgHght}              \
          -units PixelsPerInch -set density $ImgDens \
          -repage ${ImgWdth}x${ImgHght}+0+0          \
          -compress JPEG                             \
          -quality $IMQuality                        \
          "${FName%.$ext}.pdf"

  # Merge new PDF page with prior pages
  [[ -f z_merged.pdf ]] && \
   { pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
     mv z_temp.pdf z_merged.pdf
   } || \
     cp "${FName%.$ext}.pdf" z_merged.pdf
  [[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done

[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."

2

Trovo conveniente il seguente script che combina le risposte elencate qui e alcuni problemi che ho avuto con il calcolo in virgola mobile:

endInputArgs=$(($#-1))

quoted_args="$(printf " %q" "${@:1:$endInputArgs}")"
output_arg="$(printf " %q" "${@:$#:1}")"

ratiox=$(echo "150*8.27" | bc -l)
ratioy=$(echo "150*11.69" | bc -l)

bash -c "convert $quoted_args -compress jpeg -resize 1240x1753 \
  -units PixelsPerInch -density 150x150 -repage ${ratiox}x${ratioy} $output_arg"

Lo script viene chiamato (salvato come file images2pdf)

images2pdf file\ 1.jpg file\ 2.jpg file\ 3.jpg output.pdf

/ modifica: aggiunto il flag "-l" secondo il commento di tanius per una migliore precisione.


Suggerimento generale: non $(echo "150*8.27" | bc)è ancora ottimo per il virgola mobile. Funziona qui perché è una moltiplicazione. Per $(echo "150/8.27" | bc)però, il risultato è 18(troncato per intero). Invece, chiama bccon un valore superiore scale: $(echo "150/8.27" | bc -l)i risultati sono 18.137847….
Tanius,

1

Stavo lottando anche con quella roba. Sulla base delle informazioni di cui sopra, ho scritto uno script che aggiunge file di immagini in ordine alfabetico in un singolo PDF.

Alcune variabili sono impostabili all'interno dello script. Dipende da ImageMagick e pdftk.

NB: Se l'immagine in ingresso ha una risoluzione (dpi) superiore alla risoluzione desiderata di output.pdf, l'immagine viene ricampionata alla risoluzione inferiore. Altrimenti, l'immagine non viene ricampionata e viene estesa solo per adattarsi all'area di disegno della pagina.

#!/bin/bash

export LOCALE=C

[[ "${2}x" == "x" ]] && \
 { echo "Usage: $( basename $0 ) output.pdf extension"
   echo "       merges all files (*.extension) into a single PDF"
   echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
 exit 1
 } || \
 OutName="$1"
 ext="$2"

# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white"      # what colour for paper
IMQuality="91"            # JPEG compression level
PaperWdthMetr="210"       # milimeters, 210 for ISO A4
PaperHghtMetr="297"       # milimeters, 297 for ISO A4
PaperDens="200"           # maximum (wanted) dpi for a page
PaperWdthInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10      | bc -l ) # Inch
PaperHghtInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10      | bc -l ) # Inch
PaperRtio=$(     echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )

# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null

# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
  echo "Converting $FName"
  ImgIdentify=$( identify -format "%w %h" "$FName" )
  ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1  )
  ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2  )
  ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig"  | bc -l )
  [[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
    && ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
    || ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
  [[ $Debug ]] && echo "ImgDens1: $ImgDens"
  [[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
    && ImgDens=$PaperDens
  [[ $Debug ]] && echo "ImgDens2: $ImgDens"

  ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
  ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels

  [[ $Debug ]] && echo "ImgWdth: $ImgWdth".
  [[ $Debug ]] && echo "ImgHght: $ImgHght".

  convert "${FName}"                                 \
          -resize ${ImgWdth}x${ImgHght}              \
          -background $IMBackground -gravity center  \
          -extent ${ImgWdth}x${ImgHght}              \
          -units PixelsPerInch -set density $ImgDens \
          -repage ${ImgWdth}x${ImgHght}+0+0          \
          -compress JPEG                             \
          -quality $IMQuality                        \
          "${FName%.$ext}.pdf"

  # Merge new PDF page with prior pages
  [[ -f z_merged.pdf ]] && \
   { pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
     mv z_temp.pdf z_merged.pdf
   } || \
     cp "${FName%.$ext}.pdf" z_merged.pdf
  [[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done

[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."

In quanto sopra, ho dovuto cambiare -set density $ImgDensin-density $ImgDens
Yotam il


0

Ho appena usato qualcosa di simile alla risposta maxschlepzigs in Ubuntu 16.04 / ImageMagick

Questo centra anche il risultato

i=300; convert a.png b.png -compress jpeg -quality 100 \
      -density ${i}x${i} -units PixelsPerInch \
      -resize $((i*827/100))x$((i*1169/100)) \
      -gravity center \
      -extent $((i*827/100))x$((i*1169/100)) multipage.pdf

0

Volevo convertire un'immagine in dimensioni di pagina di 5,00 x 8,00 in (visto dal lettore Adobe) Ecco cosa ho fatto su Ubuntu 18.04 OS. In primo luogo, capire le dimensioni della pagina che sto cercando in questo modo:

$ pdfinfo my-input.pdf

E il ritorno è: Dimensioni della pagina: 360 x 576 punti

Quindi l'immagine viene convertita in un PDF della stessa dimensione in questo modo:

$ img2pdf --pagina 360x576 -o outpage.pdf input_pic.jpg

Nota: per installare img2pdf

$ sudo apt installa img2pdf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.