görüntüleri pdf dönüştürmek: nasıl PDF Sayfaları aynı boyutta yapmak


45

Gibi bir şey yaptım

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

Ancak 1. sayfa sonraki sayfalardan çok daha büyük. Bu, görüntü boyutları benzer olsa bile gerçekleşir. Bu görüntüler taranır ve kırpılır, böylece boyutlarda küçük farklılıklar olabilir

-page A4Sayfaların boyutunu düzeltmem gerektiğini düşündüm ?

Yanıtlar:


60

convertBöyle bir görev için en son kullandığımda , yeniden boyutlandırma yoluyla hedefin boyutunu açıkça belirttim:

$ 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

convertKomut daima kullanmaz DPI böylece biz açık bir şekilde belirtilen DPI belirtmek varsayılan yoğunluğu / sayfa biçimi birimi olarak -unitsseçeneğiyle (aksi takdirde farklı versiyonları / giriş formatı kombinasyonları ile değişik sonuçlar alabilirsiniz). Yeni boyut (ile belirtilir -resize), DIN A4 sayfasının piksel cinsinden boyutudur . Resize argümanı maksimum sayfa boyutunu belirtir. Tam olarak hangi çözünürlük ve kalitenin seçileceği, kullanım durumuna bağlıdır - Kağıda basıldığında çok kötü görünmese de, biraz yer kazanmak için 150 DPI ve ortalama kaliteyi seçtim .

convertVarsayılan olarak, yeniden boyutlandırma işleminde en boy oranının değişmediğini unutmayın :

Yeniden boyutlandırma, görüntüyü istenen boyuta sığdırır. İstenen kutu boyutunu doldurmaz.

( ImageMagick kılavuzu )

ImageMagick versiyonuna ve ilgili giriş formatlarına bağlı olarak, bu -repageseçeneği atlamak uygun olabilir . Ancak bazen gerekli olabilir ve bu seçenek olmadan PDF başlığı çok küçük boyutlar içerebilir. Her durumda, -repageacı vermemelisin.

Hesaplamalar, bashsadece bunu desteklediğinden dolayı tamsayı aritmetiği kullanır . İle zshifadeleri basitleştirilmiş olabilir - yani değiştirilir $((i*8.27))x$((i*11.69)).

Lineart Resimleri

PNG dosyaları iki seviyeli (siyah beyaz aka lineart) görüntülerse, img2pdfaraç ImageMagick'e göre daha üstün sonuçlar verir convert. Bu img2pdfdaha hızlı ve daha küçük PDF'ler demektir.

Örnek:

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

veya:

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

2
kullanırken -repage a4bir ainvalid argument for option '-repage': a4
Scolytus

1
@Scolytus, Fedora 19 sisteminde benzer bir sorun gözlemledim - -repageartık a4 adını desteklemiyor gibi görünüyor . Bu konuda kabuk aritmetik ile çalıştım:-repage $((150*8.27))x$((150*11.69))
maxschlepzig

Bu sihirli sayıların 150 dpi olduğunu ve A4'ün eski birimlerde ifade edildiğini varsayalım.
Michael Scheper

@MichaelScheper, evet, dpi ve inç.
maxschlepzig

Teşekkürler yardım et bana. Aslında -density 150argüman eklemek önemliydi.
dma_k

23

Gerçekten kullanmak istediğin şey:

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

-extentaslında görüntüyü 1240x1753 olacak şekilde uzatırken, -resizegörüntünün oranını ya 1240x...da içine sığdırmayı sürdürür ...x1753.

-gravityParametresi isteğe bağlıdır, ancak uzanan zaman görüntü merkezi kullanılabilir.


1
Teşekkür ederim! -extentgerçekte kullanmak istediğim şey :) - lütfen, önüne-cevapsız bıraktığın alıntı -eksten önünde, teşekkürler!
Brownian

Teşekkürler, sonunda eksik keneyi ekledim! ;-)
caugner 28:13

9

Caugner'in cevabına ek olarak :

IM v6.6.9-7 kurulduktan sonra, -gravityparametrenin arasına yerleştirilmesi -resizeve -extentetkisinin olması gerektiğini öğrendim .

ek olarak (op sorunun bir parçası olmasa da), toplam komutun sonuçlanmasına neden olacak farklı bir arka plan rengi çekici ayarını buldum.

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

Zaten doğru en boy oranına sahip bir görüntüyü yeniden ölçeklendirmek istemiyorsam, ancak özünürlüğünü devam ettirmek istemediğimde sıklıkla kullandığım bir başka kullanışlı değişiklik

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

burada hedef yoğunluk, 8.27'ye bölünmüş genişlik hesaplanarak dinamik olarak belirlenir (bu, A4 sayfanın inç cinsinden genişliğidir). -repage a4(8.27x11.6" ) parametresi çoğu zaman göz ardı edilebilir ama çıkan .pdf Sligtly 210x297mm A4 boyutlarında kapalı farklı bir biçim olurdu birkaç vakayı yaşadım


2

Mikher'in kodunu çok faydalı buldum, ancak PDF'yi tamamen Dikey veya Yatay olarak düzenliyor, bu yüzden her bir giriş dosyasının düzenini kontrol etmek ve çıktıda eşleştirmek için değiştirdim.

Yotam'ın düzenlemesini Ubuntu 15.04 kutumda onsuz çalıştığı için dahil etmedim.

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

Burada listelenen cevapları ve kayan nokta hesaplamasıyla karşılaştığım bazı problemleri birleştiren aşağıdaki betiği uygun buluyorum:

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"

Betik denir (bir dosya olarak kaydedilmiş

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

/ edit: Daha iyi hassasiyet için tanius'un yorumuna göre "-l" bayrağı eklendi.


Genel ipucu: $(echo "150*8.27" | bc)hala kayan nokta için mükemmel değil. Burada çalışıyor çünkü bu bir çarpma. İçin $(echo "150/8.27" | bc)de, sonuç olan 18(tam sayıya kesildi). Bunun yerine, bcyüksek olanı arayın scale: $(echo "150/8.27" | bc -l)sonuçları 18.137847….
tanius

1

Ben de o şeylerle mücadele ediyordum. Yukarıdaki bilgilere dayanarak, alfabetik olarak sıralanmış görüntü dosyalarını tek bir PDF'ye ekleyen bir komut dosyası yazdım.

Bazı değişkenler betiğin içinde ayarlanabilir. ImageMagick ve pdftk'ye bağlıdır.

Not: Girilen görüntünün istenen çıktı çözünürlüğünden daha yüksek çözünürlüğü (dpi) varsa, görüntü daha düşük çözünürlüğe yeniden örneklenir. Aksi takdirde, görüntü yeniden örneklenmez ve yalnızca sayfa tuvaline sığacak şekilde genişletilir.

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

Yukarıdaki, ben değişime zorunda -set density $ImgDensiçine-density $ImgDens
Yotam


0

Sadece Ubuntu 16.04 / ImageMagick altında maxschlepzigs cevap benzer bir şey kullandım

Bu aynı zamanda sonucu ortalar

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.