私は何かをした
convert -page A4 -compress A4 *.png CH00.pdf
しかし、最初のページは後続のページよりもはるかに大きいです。これは、画像の寸法が似ていても発生します。これらの画像はスキャンおよびトリミングされるため、寸法にわずかな違いがある場合があります
-page A4
ページのサイズを修正する必要がありますか?
前回このようなタスクに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
で指定)は aの寸法DIN A4ページ ピクセル単位です。resize引数は最大ページサイズを指定します。選択する解像度と品質ユースケースによって異なります-150 [〜#〜] dpi [〜#〜] と平均品質を選択して、紙に印刷したときに見た目が悪くなく、スペースを節約しました。
デフォルトではconvert
はサイズ変更操作でアスペクト比を変更しないことに注意してください。
サイズ変更は、画像を要求されたサイズに合わせます。要求されたボックスサイズではありません。
( ImageMagickマニュアル )
ImageMagickのバージョンと関連する入力形式によっては、-repage
オプションを省略してもかまいません。しかし、それが必要な場合もあり、そのオプションがない場合、PDFヘッダーに含まれる寸法が小さすぎる可能性があります。いずれの場合も、-repage
は問題ありません。
bash
は整数演算のみをサポートしているため、計算では整数演算が使用されます。 zsh
を使用すると、式を簡略化できます。つまり、$((i*8.27))x$((i*11.69))
に置き換えます。
PNGファイルが2層(白黒のa.k.aラインアート)画像である場合、 img2pdf
tool はImageMagick convert
より優れた結果をもたらします。つまり、img2pdf
はより高速で、より小さなPDFを生成します。
例:
$ img2pdf -o multipage.pdf a.png b.png
または:
$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
あなたが本当に使いたいのは:
$ 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
パラメータはオプションですが、拡張時に画像を中央に配置するために使用できます。
caugner's answer への追加:
iM v6.6.9-7をインストールしたら、-gravity
パラメータを-resize
と-extent
の間に配置する必要があることがわかりました。
さらに(o.p.の質問の一部ではありませんが)異なる背景色を魅力的に設定すると、
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が210x297mm(8.27x11.6 ")のA4寸法とは異なる形式である場合があります。
ここに記載されている回答と、浮動小数点計算で発生したいくつかの問題を組み合わせた次のスクリプトが便利です。
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:精度向上のため、taniusのコメントに応じて「-l」フラグを追加しました。
Python CLIプログラムimg2pdf
ロスレス変換の場合:
https://gitlab.mister-muffin.de/josch/img2pdf
使用例:
img2pdf img1.png img2.png -o out.pdf
Mikherのコードは非常に便利だと思いましたが、PDF全体が縦長または横長のいずれかとしてレイアウトされているため、各入力ファイルのレイアウトをチェックして出力と一致するように変更しました。
それは私の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."
私もそのことに苦労していました。上記の情報に基づいて、アルファベット順にソートされた画像ファイルを1つのPDFに追加するスクリプトを作成しました。
一部の変数はスクリプト内で設定できます。 ImageMagickとpdftkに依存します。
注意:入力画像の解像度(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."
私はちょうどUbuntu 16.04/ImageMagickでmaxschlepzigsの答えに似たものを使用しました
これも結果の中心です
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
画像を5.00 x 8.00 in(Adobeリーダーから表示)のページサイズに変換したかったので、ubuntu 18.04 OSでこれを実行しました。最初に、私が好きなページサイズを把握します:
$ pdfinfo my-input.pdf
そして、戻り値はページサイズ:360 x 576ポイント
次に、画像は次のように同じサイズのPDF=に変換されます。
$ img2pdf --pagesize 360x576 -o outpage.pdf input_pic.jpg
注:img2pdfをインストールするには
$ Sudo apt install img2pdf