it-swarm.com.de

Bilder in PDF konvertieren: So erstellen Sie PDF Seiten gleicher Größe

Ich habe so etwas gemacht

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

Die erste Seite ist jedoch viel größer als die nachfolgenden Seiten. Dies geschieht, obwohl die Bildabmessungen ähnlich sind. Diese Bilder werden gescannt und zugeschnitten, daher können geringfügige Unterschiede in den Abmessungen auftreten

Ich dachte -page A4 sollte die Größe der Seiten festlegen?

47
Jiew Meng

Als ich das letzte Mal convert für eine solche Aufgabe verwendet habe, habe ich die Größe des Ziels explizit über die Größenänderung angegeben:

$ 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

Der Befehl convert verwendet nicht immer DPI als Standardeinheit für Dichte/Seitenformat, daher geben wir DPI explizit mit -units Option (andernfalls erhalten Sie möglicherweise unterschiedliche Ergebnisse mit unterschiedlichen Versionen/Eingabeformatkombinationen). Die neue Größe (angegeben über -resize) Ist die Dimension einer DIN A4-Seite in Pixel. Das Argument für die Größenänderung gibt die maximale Seitengröße an Die Auflösung und Qualität, die genau ausgewählt werden sollen, hängt vom Anwendungsfall ab. Ich habe 150 DPI und die durchschnittliche Qualität ausgewählt, um Platz zu sparen, während sie beim Drucken nicht schlecht aussieht auf Papier.

Beachten Sie, dass convert standardmäßig das Seitenverhältnis beim Größenänderungsvorgang nicht ändert:

Die Größe ändern passt das Bild in die gewünschte Größe. Es füllt NICHT die angeforderte Boxgröße.

( ImageMagick-Handbuch )

Abhängig von der ImageMagick-Version und den beteiligten Eingabeformaten kann es in Ordnung sein, die Option -repage Wegzulassen. Manchmal ist dies jedoch erforderlich, und ohne diese Option enthält der Header PDF möglicherweise zu kleine Abmessungen. In jedem Fall sollte der -repage Nicht schaden.

Die Berechnungen verwenden Ganzzahlarithmetik, da bash dies nur unterstützt. Mit zsh können die Ausdrücke vereinfacht werden - d. H. Durch $((i*8.27))x$((i*11.69)) ersetzt werden.

Lineart Bilder

Wenn es sich bei den PNG-Dateien um Zwei-Ebenen-Bilder (Schwarzweiß a.k.a lineart) handelt, liefert das Tool img2pdf überlegene Ergebnisse gegenüber ImageMagick convert. Das heißt, img2pdf Ist schneller und liefert kleinere PDFs.

Beispiel:

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

oder:

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

Was Sie wirklich verwenden möchten, ist:

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

-extent Erweitert das Bild tatsächlich auf 1240 x 1753, während -resize Das Bildverhältnis beibehält und es entweder in 1240x... Oder ...x1753 Anpasst.

Der Parameter -gravity Ist optional, kann jedoch zum Zentrieren des Bildes beim Erweitern verwendet werden.

25
caugner

Ergänzung zu Caugner's Antwort :

nachdem ich IM v6.6.9-7 installiert hatte, fand ich heraus, dass -gravity Parameter muss zwischen -resize und -extent um eine Wirkung zu erzielen.

zusätzlich (obwohl nicht Teil der o.p.-Frage) fand ich das Einstellen einer anderen Hintergrundfarbe ansprechend, was zu dem Gesamtbefehl von führen würde

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

eine weitere nützliche Variante, die ich oft verwende, wenn ich ein Bild nicht neu skalieren möchte, das bereits das richtige Seitenverhältnis aufweist, aber seine individuelle Auflösung beibehält

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

dabei wird die Zieldichte dynamisch bestimmt, indem die Breite geteilt durch 8,27 berechnet wird (dies ist die Breite in Zoll einer A4-Seite). das -repage a4 Parameter kann die meiste Zeit weggelassen werden, aber ich hatte einige Fälle, in denen das resultierende PDF ein anderes Format hatte, das geringfügig von den A4-Abmessungen von 210 x 297 mm (8,27 x 11,6 ") abweicht.

9
antiplex

Ich finde das folgende Skript praktisch, das die hier aufgeführten Antworten sowie einige Probleme mit der Gleitkommaberechnung kombiniert:

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"

Das Skript wird aufgerufen (als Datei images2pdf gespeichert).

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

/ edit: "-l" -Flag gemäß Kommentar von tanius zur besseren Genauigkeit hinzugefügt.

2
rindPHI

Ich empfehle das Python CLI-Programm img2pdf für verlustfreie Umwandlung:

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

Anwendungsbeispiel:

img2pdf img1.png img2.png -o out.pdf
2
Adam Erickson

Ich fand Mikhers Code sehr nützlich, aber er zeigt das PDF vollständig als entweder Hochformat oder Querformat) an. Daher habe ich es geändert, um das Layout jeder Eingabedatei zu überprüfen und es in der Ausgabe abzugleichen.

Ich habe Yotams Bearbeitung nicht aufgenommen, da sie ohne sie auf meiner Ubuntu 15.04-Box funktioniert.

$#!/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
user173283

Ich hatte auch mit diesem Zeug zu kämpfen. Basierend auf den obigen Informationen habe ich ein Skript geschrieben, das alphabetisch sortierte Bilddateien zu einer einzelnen PDF-Datei hinzufügt.

Einige Variablen können im Skript eingestellt werden. Es hängt von ImageMagick und pdftk ab.

NB: Wenn das Eingabebild eine höhere Auflösung (dpi) als die gewünschte Auflösung von output.pdf hat, wird das Bild auf die niedrigere Auflösung neu abgetastet. Andernfalls wird das Bild nicht erneut abgetastet und nur so erweitert, dass es in den Seitenbereich passt.

#!/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."
1
Mikher

Ich habe gerade etwas Ähnliches wie maxschlepzigs Antwort unter Ubuntu 16.04/ImageMagick verwendet

Dies zentriert auch das Ergebnis

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
Martin Thoma

Ich wollte ein Bild in eine Seitengröße von 5,00 x 8,00 in konvertieren (vom Adobe Reader aus gesehen). Hier ist, was ich unter Ubuntu 18.04 OS gemacht habe. Stellen Sie zunächst die Seitengröße fest, nach der ich gesucht habe:

$ pdfinfo my-input.pdf

Und die Rückgabe lautet: Seitengröße: 360 x 576 Punkte

Dann wird das Bild in ein PDF derselben Größe wie folgt konvertiert:

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

Hinweis: um img2pdf zu installieren

$ Sudo apt install img2pdf

0
Harry