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

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

私は次のことをしました

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

ただし、最初のページは次のページよりはるかに大きいです。これは、画像のサイズが似ている場合にも発生します。対応する画像はスキャンされ、切り取られた画像であるため、サイズが若干異なる場合があります。

-page A4ページサイズを固定する必要があると思いますか?

答え1

この種のジョブに最後に使用したときに、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コマンドが常に使用されるわけではありませんディープPIデフォルトの密度/ページ形式単位なので、-unitsそのオプションを使用してDPIを明示的に指定します(そうでない場合は、バージョン/入力形式の組み合わせによって結果が異なる場合があります)。新しいサイズ(で指定-resize)は次のとおりです。DIN A4 ページ寸法ピクセル単位です。 resizeパラメーターは、最大ページサイズを指定します。選択する解像度と品質はユースケースによって異なります。私は150を選択しました。ディープPI品質は平均的でスペースも節約され、紙に印刷しても大丈夫です。

デフォルトでは、convertサイズ変更操作はアスペクト比を変更しません。

サイズ変更は画像を目的のサイズに合わせます。要求されたボックスサイズを埋めません。

ImageMagick マニュアル)

ImageMagickのバージョンと関連する入力形式によっては、この-repageオプションを省略できます。しかし、時にはこれが必要な場合もあります。このオプションがないと、PDFヘッダーに小さすぎるサイズが含まれる可能性があります。とにかく-repage病気ではないはずです。

bash整数演算のみがサポートされているため、計算は整数演算を使用します。 Withzsh式は単純化できます。つまり、 に置き換えられます$((i*8.27))x$((i*11.69))

ラインアート画像

PNGファイルが2レイヤー(線形とも呼ばれる白黒)画像の場合img2pdfツールImageMagickよりも優れた結果を生成しますconvert。これはimg2pdfより速い速度とより小さい結果PDFを意味します。

例:

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

または:

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

答え2

実際に使いたいものは次のとおりです。

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

-extent-resize実際に画像の割合を維持しながら、画像を1240 x 1753に拡大または1240x...一致させます...x1753

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

答え3

とは別にカウグナーの回答:

IM v6.6.9-7をインストールした後、このパラメータを適用するにはと-gravityの間に配置する必要があることがわかりました。-resize-extent

また、(動作問題の一部ではありませんが)他の背景色を設定したい誘惑を感じます。これにより、全体の制御が可能になります。

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

すでに正しいアスペクト比を持っていますが、個々の解像度を維持する画像のサイズを変更したくない場合によく使用されるもう1つの便利なバリエーションは次のとおりです。

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 ")とわずかに異なる場合があります。

答え4

Mikherのコードは非常に便利だと思いましたが、PDF全体が垂直または水平に配置されているので、各入力ファイルのレイアウトを確認して出力に一致するように修正しました。

Yotamの編集内容は、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."

関連情報