[マージン狭め]冊子印刷のPDFをページの並び替えで作る(Mac/Win/Linux)
Macで冊子(Booklet)印刷する際に、ページの並び替えで実現する方法です。
わたしはEPSONのプリンターを使っています。このEPSONのプリンタードライバーでは、2021年頃まで冊子印刷(booklet printing)ができませんでした。
ところが、いつのまにか、EPSONプリンターのドライバー・ソフトウェアのアップデートで、冊子印刷ができるようになりました。
しかし、冊子印刷をするとページマージンが大きすぎて、使えない!
このため、冊子印刷をしたいときは、手動で"PDFを並び替える"方法を使っています。
冊子印刷のPDFを作るときのページ順
印刷するときは、以下ののように並び替えた上で、プリンター印刷設定を
Paper Per Sheetを2ページ
Layout Directionを右、もしくは左(綴じ方向と同じ)
両面(Two-sided)
Layout > Short-Edge binding
を選択ください。
一枚あたりに4ページ印刷できるため、冊子印刷では4の倍数でしか指定できません。4の倍数でないときは、後ろに空ページを挿入して、4の倍数に揃えてください。
ページが多いときは、作業が面倒です。分割して、4や8ページ構成を組み合わせた方が楽です。
4ページ構成
4,1,2,3
8ページ構成
8,1,2,7,6,3,4,5
12ページ構成
12,1,2,11,10,3,4,9,8,5,6,7
16ページ構成
16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9
20ページ構成
20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11
24ページ構成
24,1,2,23,22,3,4,21,20,5,6,19,18,7,8,17,16,9,10,15,14,11,12,13
28ページ構成
28,1,2,27,26,3,4,25,24,5,6,23,22,7,8,21,20,9,10,19,18,11,12,17,16,13,14,15
32ページ構成
32,1,2,31,30,3,4,29,28,5,6,27,26,7,8,25,24,9,10,23,22,11,12,21,20,13,14,19,18,15,16,17
36ページ構成
36,1,2,35,34,3,4,33,32,5,6,31,30,7,8,29,28,9,10,27,26,11,12,25,24,13,14,23,22,15,16,21,20,17,18,19
40ページ構成
40,1,2,39,38,3,4,37,36,5,6,35,34,7,8,33,32,9,10,31,30,11,12,29,28,13,14,27,26,15,16,25,24,17,18,23,22,19,20,21
並び替えシェル(プログラム)
印刷したいページ数が多くなると、さすがに手動が難しくなってきます。なんせ、間違えます。
並び替えをシェル(プログラム)で印刷用PDFを生成しています。
参考までに。生成AIを使えば、改造できるはずです。
配列処理の箇所はリファクタできるんですが、わざとページ順を明示的に残しています。
※ ImageMagick と img2pdf を使っています。
#!/bin/bash
# ディレクトリのパスを指定
directory_path="."
# 出力ディレクトリの名前を指定
output_directory="pmb-output"
# 結合方向のデフォルトを左から右に設定
direction="left"
# オプション解析
while getopts ":r" opt; do
case $opt in
r)
direction="right"
;;
\?)
echo "無効なオプション: -$OPTARG" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
# パスが指定されなかった場合エラーメッセージを表示して終了
if [ -z "$1" ]; then
echo "エラー: 変換するPDFファイルのパスを指定してください。"
exit 1
fi
pdf_file="$1"
# ファイル名を、拡張子を除いて抽出
filename=$(basename "$1")
pdf_org_filename="${filename%.*}"
# 出力ディレクトリを作成
mkdir -p "$output_directory"
# 既に存在する処理生成の画像ページを削除
rm -f "${output_directory}/bl"*.jpg
rm -f "${output_directory}/pmb"*.jpg
rm -f "${output_directory}/pmb"*.png
# convertコマンドを使用して指定されたPDFをpngに変換
# -qualityオプションは通常JPEG形式での品質を調整するために使われますが、PNG形式には効果がない
# convert -density 300 "$1" -quality 100 "${output_directory}/pmb%03d.png"
convert -density 600 "${pdf_file}" "${output_directory}/pmb%03d.png"
# 画像ファイルの一覧を取得して文字列に格納
image_files=$(find "${directory_path}/${output_directory}" -type f \
\( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.tif" \))
# 拡張子別にファイル名昇順にソート
sorted_image_files=$(echo "$image_files" | tr ' ' '\n' | sort)
# ファイル数ごとに順番を変更
file_count=$(echo "$sorted_image_files" | wc -l)
# ファイル数ごとに順番を変更
if [ "$file_count" -le 4 ]; then
needed_blank_pages=$((4 - file_count))
elif [ "$file_count" -le 8 ]; then
needed_blank_pages=$((8 - file_count))
elif [ "$file_count" -le 12 ]; then
needed_blank_pages=$((12 - file_count))
elif [ "$file_count" -le 16 ]; then
needed_blank_pages=$((16 - file_count))
elif [ "$file_count" -le 20 ]; then
needed_blank_pages=$((20 - file_count))
elif [ "$file_count" -le 24 ]; then
needed_blank_pages=$((24 - file_count))
elif [ "$file_count" -le 28 ]; then
needed_blank_pages=$((28 - file_count))
elif [ "$file_count" -le 32 ]; then
needed_blank_pages=$((32 - file_count))
elif [ "$file_count" -le 36 ]; then
needed_blank_pages=$((36 - file_count))
elif [ "$file_count" -le 40 ]; then
needed_blank_pages=$((40 - file_count))
fi
# 空白画像ページを生成
for ((i=0; i<needed_blank_pages; i++)); do
# 空白ページの画像を作成
first_image="${sorted_image_files%%$'\n'*}"
convert -size $(identify -format "%wx%h" "$first_image") xc:white "./${output_directory}/bl${i}.jpg"
done
# 空白画像ページをファイルリストに追加
blank_files=$(find "./${output_directory}" -type f -iname "bl*.jpg")
sorted_image_files="${sorted_image_files}
"${blank_files}""
# ファイル数ごとに順番を変更したリストを出力
echo "${sorted_image_files}"
echo ""
echo ""
if [ "$file_count" -le 4 ]; then
sorted_image_files=$(echo "$sorted_image_files" | awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[4],a[1],a[2],a[3]}')
elif [ "$file_count" -le 8 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[8],a[1],a[2],a[7],a[6],a[3],a[4],a[5]}')
elif [ "$file_count" -le 12 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[12],a[1],a[2],a[11],a[10],a[3],a[4],a[9],a[8],a[5],a[6],a[7]}')
elif [ "$file_count" -le 16 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[16],a[1],a[2],a[15],a[14],a[3],a[4],a[13],a[12],a[5],a[6],a[11],a[10],a[7],a[8],a[9]}')
elif [ "$file_count" -le 20 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[20],a[1],a[2],a[19],a[18],a[3],a[4],a[17],a[16],a[5],a[6],a[15],a[14],a[7],a[8],a[13],a[12],a[9],a[10],a[11]}')
elif [ "$file_count" -le 24 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[24],a[1],a[2],a[23],a[22],a[3],a[4],a[21],a[20],a[5],a[6],a[19],a[18],a[7],a[8],a[17],a[16],a[9],a[10],a[15],a[14],a[11],a[12],a[13]}')
elif [ "$file_count" -le 28 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[28],a[1],a[2],a[27],a[26],a[3],a[4],a[25],a[24],a[5],a[6],a[23],a[22],a[7],a[8],a[21],a[20],a[9],a[10],a[19],a[18],a[11],a[12],a[17],a[16],a[13],a[14],a[15]}')
elif [ "$file_count" -le 32 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[32],a[1],a[2],a[31],a[30],a[3],a[4],a[29],a[28],a[5],a[6],a[27],a[26],a[7],a[8],a[25],a[24],a[9],a[10],a[23],a[22],a[11],a[12],a[21],a[20],a[13],a[14],a[19],a[18],a[15],a[16],a[17]}')
elif [ "$file_count" -le 36 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[36],a[1],a[2],a[35],a[34],a[3],a[4],a[33],a[32],a[5],a[6],a[31],a[30],a[7],a[8],a[29],a[28],a[9],a[10],a[27],a[26],a[11],a[12],a[25],a[24],a[13],a[14],a[23],a[22],a[15],a[16],a[21],a[20],a[17],a[18],a[19]}')
elif [ "$file_count" -le 40 ]; then
sorted_image_files=$(echo "$sorted_image_files" | \
awk 'BEGIN{ORS=RS} {a[NR]=$0} END{print a[40],a[1],a[2],a[39],a[38],a[3],a[4],a[37],a[36],a[5],a[6],a[35],a[34],a[7],a[8],a[33],a[32],a[9],a[10],a[31],a[30],a[11],a[12],a[29],a[28],a[13],a[14],a[27],a[26],a[15],a[16],a[25],a[24],a[17],a[18],a[23],a[22],a[19],a[20],a[21]}')
fi
#
# echo ${sorted_image_files}
# exit;
# 始めから2つずつ画像ファイルを左右に結合
counter=0
id=1
for file in $sorted_image_files; do
if [ $counter -eq 0 ]; then
first_file="$file"
counter=1
else
second_file="$file"
if [ "$direction" == "right" ]; then
output_file="${output_directory}/pmb-output-R$(printf "%02d" $id)_$(basename "${second_file%.*}")-$(basename "${first_file%.*}").jpg"
# convert +append "$second_file" "$first_file" "$output_file"
# appendは"+"で横
# -border 境界(マージン)を入れる 幅ピクセルx高ピクセル
convert +append -bordercolor white -border 50x0 "$second_file" "$first_file" "$output_file"
else
output_file="${output_directory}/pmb-output-L$(printf "%02d" $id)_$(basename "${first_file%.*}")-$(basename "${second_file%.*}").jpg"
# convert +append "$first_file" "$second_file" "$output_file"
convert +append -bordercolor white -border 50x0 "$first_file" "$second_file" "$output_file"
fi
echo "画像が結合されました。出力ファイル: $output_file"
counter=0
id=$((id+1))
fi
done
/Users/username/.pyenv/shims/img2pdf "${output_directory}"/pmb-output*.jpg -o "${directory_path}/${pdf_org_filename}_out_booklet_`date +"%Y%m%d-%H%M%S"`.pdf"
# 生成した画像ページを削除
# rm -f "${output_directory}/bl"*.jpg
# rm -f "${output_directory}/pmb"*.jpg
# rm -f "${output_directory}/pmb"*.png
この方法で所蔵PDFから、必要な箇所だけを冊子印刷できます。結構な枚数を印刷しており、インク代が気になるところ。
計算するとわかりますが、正規品インクで印刷すると、書籍を買うよりもコスト高です。出版されている書籍の印刷はいかにコスト低なのだろう。
わたしは互換インクを使っています。問題なく使用できています。
#冊子印刷
#PDF
#印刷
#EPSON
#プリンター
#印刷設定
#両面印刷
#PDF編集
#印刷テクニック
#Mac
#Windows
#Linux
#シェルスクリプト
#PDF加工
#ImageMagick
#img2pdf
#PDF生成
#シェルスクリプト
この記事が気に入ったらサポートをしてみませんか?