it-swarm-eu.dev

převést obrázky do formátu pdf: Jak vytvořit PDF Stránky stejné velikosti

Udělal jsem něco jako

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

Ale první stránka je mnohem větší než následující stránky. K tomu dochází, i když jsou rozměry obrázku podobné. Tyto obrázky jsou naskenovány a oříznuty, takže se mohou mírně lišit rozměry

Myslel jsem -page A4 by měl opravit velikost stránek?

47
Jiew Meng

Když jsem naposledy použil convert pro takový úkol, explicitně jsem určil velikost cíle pomocí změny velikosti:

$ 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

Příkaz convert nepoužívá vždy DPI jako výchozí jednotku hustoty/formát stránky, proto explicitně určíme DPI pomocí -units (jinak můžete získat různé výsledky s různými kombinacemi verzí/formátů vstupu). Nová velikost (zadaná pomocí -resize) Je rozměr a DIN A4 stránka v pixelech. Argument resize určuje maximální velikost stránky. rozlišení a kvalita vybrat přesně závisí na případu použití - vybral jsem 150 DPI a průměrnou kvalitu pro úsporu místa, zatímco při tisku nevypadá příliš špatně na papíře.

Všimněte si, že convert ve výchozím nastavení nemění poměr stran s operací změny velikosti:

Velikost změní obrázek na požadovanou velikost. NEVYPLŇUJE požadovanou velikost pole.

( Manuál ImageMagick )

V závislosti na verzi ImageMagick a příslušných vstupních formátech může být v pořádku vynechat možnost -repage. Ale někdy je to nutné a bez této možnosti by záhlaví PDF záhlaví PDF mohlo obsahovat příliš malé rozměry). -repage By v žádném případě nemělo být na škodu.

Výpočty používají celočíselnou aritmetiku, protože bash to podporuje pouze. S zsh mohou být výrazy zjednodušeny - tj. Nahrazeny $((i*8.27))x$((i*11.69)).

Lineart Images

Pokud jsou soubory PNG obrázky ve dvou úrovních (černobílé a.k.a lineart), pak nástroj img2pdf poskytuje lepší výsledky než ImageMagick convert. To znamená, že img2pdf Je rychlejší a přináší menší soubory PDF.

Příklad:

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

nebo:

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

Opravdu chcete použít:

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

-extent Ve skutečnosti rozšiřuje obrázek na 1240x1753, zatímco -resize Udržuje poměr obrázku a přizpůsobuje jej buď 1240x... Nebo ...x1753.

Parametr -gravity Je volitelný, ale lze jej použít při centrování obrazu při rozšiřování.

25
caugner

Přídavek k odpověď správce :

po instalaci IM v6.6.9-7 jsem zjistil, že parametr -gravity musí být vložen mezi -resize a -extent, aby měl efekt.

navíc (přestože není součástí otázky o.p.) jsem našel nastavení jiné přitažlivé barvy pozadí, což by mělo za následek celkový příkaz

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

další užitečnou variantu, kterou často používám, když nechci změnit měřítko obrázku, který již přichází ve správném poměru stran, ale zachovat jeho individuální rozlišení je

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

kde je cílová hustota dynamicky stanovena výpočtem šířky děleno 8,27 (což je šířka v palci stránky A4). Parametr -repage a4 lze většinu času vynechat, ale měl jsem několik případů, kdy by výsledný .pdf měl jiný formát, který by měl mít malý formát mimo rozměry A4 210 x 297 mm (8,27 x 11,6 ").

9
antiplex

Následující skript považuji za vhodný, který kombinuje zde uvedené odpovědi a některé problémy, které jsem měl s výpočtem s pohyblivou desetinnou čárkou:

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"

Skript je volán (uložen jako soubor images2pdf)

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

/ edit: Přidána příznak "-l" podle komentáře Tanius pro větší přesnost.

2
rindPHI

Velmi doporučuji program Python CLI program img2pdf pro bezeztrátovou konverzi:

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

Příklad použití:

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

Mikherův kód jsem shledal velmi užitečným, nicméně obsahuje pouzePDF úplně jako na výšku nebo na šířku), takže jsem jej upravil, abych zkontroloval rozložení každého vstupního souboru a shodoval se s ním ve výstupu.

Nezahrnul jsem Yotamovu úpravu, protože to funguje bez ní v mém 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
user173283

S těmi věcmi jsem také bojoval. Na základě výše uvedených informací jsem napsal skript, který přidává abecedně seřazené obrazové soubory do jediného PDF.

Některé proměnné jsou nastavitelné uvnitř skriptu. Záleží na ImageMagick a pdftk.

Pozn .: Pokud má vstupní obraz vyšší rozlišení (dpi) než požadované rozlišení output.pdf, je obraz převzorkován na nižší rozlišení. V opačném případě obrázek není převzorkován a je rozšířen pouze tak, aby se vešel na plátno stránky.

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

Jen jsem použil něco podobného odpovědi na maxschlepzigs pod Ubuntu 16.04/ImageMagick

To také centruje výsledek

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

Chtěl jsem převést obrázek na velikost stránky 5,00 x 8,00 palce (při pohledu z aplikace Adobe Reader) Tady je to, co jsem udělal na operačním systému Ubuntu 18.04. Nejprve zjistěte velikost stránky, kterou jsem po takhle:

$ pdfinfo my-input.pdf

A návrat je: Velikost stránky: 360 x 576 bodů

Poté je obrázek převeden na a PDF stejné velikosti, jako je tato:

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

Poznámka: Chcete-li nainstalovat img2pdf

$ Sudo apt install img2pdf

0
Harry