文書はPCで閲覧・管理をしたいが,
最新版の日本ロボット学会誌などのように紙媒体でしか取得できないものもあるので,スキャンしてPCで見ることがよくある.
そのとき2ページ分が1つとなった両開きのスキャンとなるので,分割する必要がある.
pdfcrop
とpdftk
で解決したのでメモ.
input.pdf
をスキャンしたばかりの数ページが1つにまとまったpdfとする.
TL;DR
まず最初に最終スクリプトにすると
#!/bin/bash -x
# parameter
INPUT_FILE=$1
OUTPUT_FILE=${2:-"output.pdf"}
TMP_DIR=`mktemp -d`
OUT_DIR=`mktemp -d`
bp_per_pts=0.99628
if [ ! $INPUT_FILE ]
then
echo "You need to set an input pdf file"
exit
fi
# STEP 1
pdftk $INPUT_FILE burst output $TMP_DIR/file_%04d.pdf
# STEP 2
ls $TMP_DIR/
width_pts=`pdfinfo $TMP_DIR/file_0001.pdf | grep "Page size" | cut -d " " -f 8`
width_bp=`echo "$width_pts * $bp_per_pts" | bc`
half_width_bp=`echo "$width_bp / 2" | bc`
# STEP 3
for i in $TMP_DIR/*.pdf
do
pdfcrop --margins "0 0 -$half_width_bp 0" $i "$OUT_DIR/`basename $i`_1.pdf" &
pdfcrop --margins "-$half_width_bp 0 0 0" $i "$OUT_DIR/`basename $i`_2.pdf" &
done
wait
# STEP 4
pdftk $OUT_DIR/*.pdf cat output $OUTPUT_FILE
STEP 1: 複数ページを1つのPDFへとばらばらにする
mkdir /tmp/build
pdftk input.pdf burst output /tmp/build/file_%02d.pdf
STEP 2: サイズを確かめる
pdfinfo /tmp/build/file_01.pdf | grep "Page size"
これはptsという単位で表現される.
大抵はA4(297mm x 210mm)なので,838.32pts x 590.16ptsと返ってくる.
STEP 3: 両開きの各PDFを1ページことに分割する
pdfcrop
を使うが単位がbpであり,
例えば838.32pts x 590.16ptsのA4の例だとすると,
419pts x 590.16ptsにすれば良い.
より,1pts = 0.99628bpなので,
419pts = 418bpなので,例えば
mkdir /tmp/output
cd /tmp/output
pdfcrop --margins "0 0 -418 0" /tmp/build/file_01.pdf file_01_page_01.pdf
pdfcrop --margins "-418 0 0 0" /tmp/build/file_01.pdf file_01_page_02.pdf
とすれば良い.
STEP 4: 1ファイルにまとめる
pdftk /tmp/output/*.pdf cat output /tmp/output.pdf