画像をPDFに変換:PDFページを同じサイズにする方法


45

私は次のようなことをしました

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

ただし、最初のページは後続のページよりもはるかに大きくなります。これは、画像の寸法が似ていても起こります。これらの画像はスキャンおよびトリミングされるため、寸法にわずかな違いがある場合があります

-page A4ページのサイズを修正する必要があると思いましたか?

回答:


60

前回convertこのようなタスクに使用したとき、サイズ変更によって宛先のサイズを明示的に指定しました。

$ 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

このconvertコマンドは、常にデフォルトの密度/ページ形式の単位としてDPIを使用するわけではないため、-unitsオプションでDPIを明示的に指定します(そうしないと、バージョン/入力形式の組み合わせが異なると、異なる結果が得られる場合があります)。新しいサイズ(で指定-resize)は、DIN A4ページのピクセル単位の寸法です。resize引数は、最大ページサイズを指定します。どの解像度と品質を選択するかは、ユースケースによって異なります。紙に印刷しても見た目が悪くないように、スペースを節約するために150 DPIと平均品質を選択しました。

convertデフォルトでは、サイズ変更操作でアスペクト比が変更されないことに注意してください。

サイズ変更は、画像を要求されたサイズに合わせます。要求されたボックスサイズではありません。

ImageMagickマニュアル

ImageMagickのバージョンと関連する入力形式によっては、-repageオプションを省略してもかまいません。ただし、必要な場合があり、そのオプションがないとPDFヘッダーに含まれる寸法が小さすぎる場合があります。いずれにせよ、-repage傷つけないでください。

計算は整数演算bashのみをサポートしているため、整数演算を使用します。zsh表現を簡略化することができる-すなわちに置き換えます$((i*8.27))x$((i*11.69))

ラインアート画像

PNGファイルがバイレベル(白黒とも呼ばれるラインアート)画像の場合、img2pdfツールはImageMagickよりも優れた結果をもたらしconvertます。つまり、img2pdfより高速で、より小さなPDFが生成されます。

例:

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

または:

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

2
使用するとき、-repage a4私はinvalid argument for option '-repage': a4
Scolytus 14年

1
@ Scolytus、Fedora 19システム上で同様の問題を観察しました-a4の-repage名前はもうサポートしていないようです。私は、シェルの算術を経由してこの問題を回避働いてきた:-repage $((150*8.27))x$((150*11.69))
maxschlepzig

それらのマジックナンバーは150dpiで、A4はレガシーユニットで表現されていると思いますか?
マイケルシェパー

@MichaelScheper、はい、dpiとインチ。
maxschlepzig

ありがとう、助けて。実際に-density 150議論を追加することが重要でした。
dma_k

23

本当に使いたいのは:

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

-extentは実際に画像を1240x1753に拡張します-resizeが、画像の比率を維持し、1240x...またはに適合させます...x1753

この-gravityパラメーターはオプションですが、拡張時に画像を中央に配置するために使用できます。


1
ありがとうございました!-extent本当に私が使用したいものです:)-ください、-extentの前に忘れられた左引用を追加してください、ありがとう!
ブラウニアン

ありがとう、私は最終的に行方不明のダニを追加しました!;-)
caugner

9

caugnerの答えへの追加:

インストールしたIMは私が見つけたv6.6.9-7 -gravityの間に配置するパラメータニーズ-resize-extent効果を持つようにします。

さらに(ただし、opの質問の一部ではありません)、異なる背景色を魅力的に設定することがわかりました。

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

別の便利なバリエーションは、すでに正しいアスペクト比になっている画像を再スケーリングしたくないが、個々の解像度を維持したいときによく使用します

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

ここで、幅を8.27(A4ページのインチ単位の幅)で割って計算することにより、ターゲット密度が動的に決定されます。-repage a4ほとんどの場合、パラメータは省略できますが、結果の.pdfがA4寸法210x297mm(8.27x11.6 ")からわずかに異なるフォーマットを持つ場合がいくつかあります


2

Mikherのコードは非常に便利であることがわかりましたが、PDFを完全に縦向きまたは横向きにレイアウトするため、各入力ファイルのレイアウトをチェックして出力で一致するように修正しました。

私のUbuntu 15.04ボックスでは、Yotamの編集がなくても動作するため、Yotamの編集は含めませんでした。

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

ここにリストされている答えと、浮動小数点計算で発生したいくつかの問題を組み合わせた次のスクリプトが便利だと思います。

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"

スクリプトが呼び出されます(ファイルimages2pdfとして保存)

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

/ edit:精度を上げるために、タニウスのコメントに従って「-l」フラグを追加しました。


一般的なヒント:$(echo "150*8.27" | bc)浮動小数点にはまだ適していません。乗算なので、ここで動作します。以下のために$(echo "150/8.27" | bc)かかわらず、結果がされ18(整数に切り捨て)。代わりに、bchigher scale:で呼び出し$(echo "150/8.27" | bc -l)、結果は18.137847…です。
タニウス

1

私もそのようなものに苦労していました。上記の情報に基づいて、アルファベット順にソートされた画像ファイルを単一のPDFに追加するスクリプトを作成しました。

一部の変数は、スクリプト内で設定可能です。ImageMagickとpdftkに依存します。

NB:入力イメージの解像度(dpi)がoutput.pdfの必要な解像度よりも高い場合、イメージは低解像度にリサンプリングされます。それ以外の場合、画像はリサンプリングされず、ページキャンバスに合わせて拡張されます。

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

上記では、次のように変更する必要があり-set density $ImgDensました-density $ImgDens
Yotam


0

Ubuntu 16.04 / ImageMagickでmaxschlepzigs answerに似たものを使用しました

これも結果を中央に配置します

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.