A4PDFをA3に4アップするシェルスクリプト

2023/09/16に公開

(Ubuntu22.04)

やりたいこと

  • A4のPDF(縦)を、4ページずつA3のPDF(縦)に入れて出力する

私の用途

  • IPAの問題集で、A5の本をPDF(A4)で配布してくれるのですが、コンビニ印刷では思うように小さく印刷できない
  • A4からA3に4アップにしてから、小冊子にして印刷しています。これで本より少し小さい(80%くらい)で印刷できて嬉しい

コード

使い方

bash merge_a4_to_a3.sh input.pdf output.pdf

前提:pdftkpdfjamがインストールされていること

sudo apt update
sudo apt install pdftk texlive-extra-utils
merge_a4_to_a3.sh
#!/bin/bash

# Check for input file
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 inputfile.pdf outputfile.pdf"
    exit 1
fi

inputfile=$1
outputfile=$2

# Extract number of pages
numpages=$(pdftk "$inputfile" dump_data | grep NumberOfPages | cut -d " " -f2)

# Process all pages
startpage=1
temppages=()

while [ $startpage -le $numpages ]
do
    # Calculate end page for the current batch of 4 pages
    endpage=$((startpage + 3))
    [ $endpage -gt $numpages ] && endpage=$numpages

    tempfile="temp_pdfjam_$startpage-$endpage.pdf"
    temppages+=("$tempfile")

    # List each page only once
    pages=$(seq $startpage $endpage | tr '\n' ',' | sed 's/,$//')

    # Convert the pages. Using portrait orientation for A3
    pdfjam "$inputfile" $pages --nup 2x2 --frame true --outfile "$tempfile" --papersize '{297mm,420mm}'

    # Update the start page for the next iteration
    startpage=$((endpage + 1))
done

# Merge all temporary files
pdftk "${temppages[@]}" cat output "$outputfile"

# Remove temporary files
rm "${temppages[@]}"

echo "Processing completed. Check $outputfile."

説明

説明:
このシェルスクリプトは、A4サイズのページが含まれる入力PDFファイルを受け取り、次のフォーマットで、4つのA4ページを1つのA3サイズのページに結合する出力PDFファイルを作成します。

page1 page2
page3 page4

スクリプトの説明:

  • スクリプトは、正しい数の引数が提供されているかどうかを確認して開始します。入力PDFファイル名と出力PDFファイル名を期待しています。

  • 入力PDFのページ数をpdftkを使用して取得します。

  • スクリプトは、ページを4つずつ(または4ページ未満の場合はそれ未満)で処理します。各グループに対して:

    • 結合されるページのシーケンス(startpageからendpageまで)を計算します。

    • pdfjamユーティリティを使用して、これらのページをA3ページの2x2のグリッドに結合し、結果を一時ファイルに保存します。

  • 全てのページを処理した後、スクリプトはpdftkを使用して、一時的なA3ページを単一の出力PDFに結合します。

  • 最後に、スクリプトは一時ファイルを削除してクリーンアップします。

Discussion