日本語縦組み文書 PDF 面付シェルスクリプト

日本語縦組み文書 PDF を右から左への 2 up で両面印刷(1 枚の表面右に第一ページ,左に第二ページ,裏面右に第三ページ,左に第四ページを割り付ける印刷)し,紙の中央を折って重ね合わせて右綴じにすると簡単な和書冊子体になるように,PDF のページを再構成するシェルスクリプトを組んでみた。自作漢詩集『狂溟集』の冊子体を作りたくなったためである。ホチキス止めのぼろいものだが。

印刷業の世界では,四折,八折のように,大きな紙に複数のページを印刷し,折り畳んでカットすると書籍の 8 ページ分,16 ページ分として成立するような方法が行われる。そのためには折り畳んだときページがノンブル昇順に整列するように大紙 1 枚の裏表の版面を構成しなければならず,この作業を面付という。今回の課題は単純に両面 4 ページ分を 1 回折るだけの二折,ページを上下逆転する必要のない単純な面付である。

縦組み文書を p.1,p.2,p.3,p.4 というように,通常の順番で右から左への 2 up で両面印刷し(これはプリンタの機能に依存する),中央で谷折りにすると,冊子体としてみた場合,1 ページ目に p.4,2 ページ目に p.1,3 ページ目に p.2,4 ページ目に p.3 が配置されてしまう。これをきちんと p.1,p.2,p.3,p.4 の順番になるようにするには,文書 PDF のページ構成を p.2,p.3,p.4,p.1 の順番に組み替えておく必要がある。p.5 以降もこのセットの各ページに 4 を加えた構成で行わなければならない。すなわち,両面印刷した紙の n 枚目のページ構成は,以下のイメージのとおり,4n-2,4n-1,4n,4n-3(0 < n,4n-3 < 最大ページ数)と元文書のページが並ぶように再構成する。

20170927-mentsuke-image.png
n 枚目の元文書ページ構成

また,4 ページひと組みのページセットを最大ページに達するまで再構成するわけだが,文書のページ数は 4 の倍数とは限らず,ページセット中の要素が最大ページ数を超えることがあり,その場合,超えたページは空白ページとする工夫も必要である。たとえば,10 ページの文書を再構成すると両面印刷 3 枚となり,最後の紙のページセットは 10 11 12 9 となるわけだが,最大ページ数は 10 であるため,11 と 12 の要素のところには空白ページを用いるようにページ再構成を行わなければならない。

目的とする PDF 文書(コンテンツとして 1 ページから順に,1-2-3-4-5-6-7-8-... と並んだ普通の文書)に対し,このようなページ再構成(2-3-4-1-6-7-8-5-... 順のページ構成)を行うボーンシェルスクリプト例を下に掲げる。

処理方式は次のとおり。

  1. PDF 文書をページ毎に p_x.pdfx はページ番号)というページ PDF ファイルにバラす。
  2. 4 ページひと組のページセットを H H+1 H+2 H-1H はページセットの先頭ノンブル。両面印刷の紙 n 枚を基準としてページセットを表現した場合,4n-2 4n-1 4n 4n-3)として H(もしくは 4n-2)が最大ページに達するまで連結して,ページ再構成リストを作成する。
  3. ページ再構成リストの要素(ページ番号)を,その数値に応じた PDF ファイル名 p_x.pdf に置換する。このとき,最大ページ数を超過するものについては,空白ページ PDF ファイル名 blank.pdf に置換する。あらかじめ目的 PDF 文書と同一判型でかつ 1 ページ分の空白ページ文書 blank.pdf を用意しておく必要がある。
  4. ページ PDF ファイル名に置換済みページ再構成ファイルリスト従って,再度これらのページ PDF ファイルを単一のページ再構成済 PDF 文書に結合する。

元の PDF 文書のページ数が増減しても対応可能である。横組みの文書 PDF でも,左から右への 2 up で両面印刷(1 枚の表面左に第一ページ,右に第二ページ,裏面左に第三ページ,右に第四ページを割り付ける印刷)をするのであれば,このスクリプトはそのまま使うことができる。もちろん,この場合は左綴じとなる。

#!/bin/sh
# pdfmentsuke.sh: 冊子用面付 PDF の生成
# - PDFを右綴 2 up(右から左にページを割り付ける 2 up)・両面印刷する前提で,
#   中央を折って綴じ合わせると冊子体となるように PDF のページを再構成する。
# - 面 左 p.3 右 p.2,裏 左 p.1 右 p.4 の構成で両面印刷し,p5 以降も同じ面付をする。
# - 最大ページをオーバーしたとき当該ページを空白ページ(blank.pdf)とする。
# - usage: pdfmentsuke.sh pdf-file
# 2017(c) isao yasuda
# $Id: pdfmentsuke.sh 60 2017-09-26 14:42:22Z isao $
 
if [ $# -ne 1 ]; then
    echo usage: $0 pdf-file
    exit 1
fi
F=$1
P=`basename $0`
nbsp;
# 対象 PDF の最大ページ数の取得
PG=`pdftk $F dump_data | grep NumberOfPages |\
    sed 's/NumberOfPages: //' | tr -d '\n'`
 
# ページリストの作成
# - 両面 2 枚以降の先頭に位置するページを変数 H にセットし,最大ページとなるまで
#   ページリストに連結
 
# ページリスト
PL=""
# 再構成ページセット先頭ページ初期値
H=2
# H H+1 H+2 H-1 の 4 ページひと組のページセットで回して PL=2 3 4 1 6 7 8 5 ... と
# ページリストを連結する
while [ $H -le $PG ];
do
    PL="${PL}$H `expr $H + 1` `expr $H + 2` `expr $H - 1` "
    H=`expr $H + 4`
done
 
# PDF のページ分割 (p_1.pdf, p_2.pdf, ...)
pdftk $F burst output p_%d.pdf
 
# PDF ファイルリストの作成
# - ページリストを分割 PDF ファイル名に変換して結合順のファイルリストを作成
# - 最大ページ数を超える場合は blank.pdf(空白ページ PDF)に置換
PLF=""
for i in $PL
do
    if [ $i -gt $PG ]; then
        PLF="${PLF}blank.pdf "
    else
        PLF="${PLF}p_$i.pdf "
    fi
done
echo - $P page rebuilding:
echo $PLF
 
# PDF ファイルリストの順での p_ページ番号.pdf ファイルの結合
BN=`basename $F .pdf`
pdftk $PLF cat output $BN-men.pdf
echo - $P wrote $BN-men.pdf.
 
# clean up
rm -f p_*.pdf
 
exit 0

ここで,PDF の分割と結合,最大ページ数の取得には,フリーの PDF 編集ツールキット PDFtk を利用している。

pdfmentsuke.sh foo.pdf とすると,foo.pdf を読み込んでページ再構成を行い,foo-men.pdf という名の再構成 PDF ファイルを出力する。kyomeishu-shibun.texptex2pdf で処理して PDF を生成し,ページ再構成を行う操作を以下に示す。この文書は toc ファイルを読んで目次出力を行う必要があるため,ptex2pdf を二回実行している。

[isao@margarita:~/src/litera/kansi]$ ptex2pdf -l kyomeishu-shibun.tex
[isao@margarita:~/src/litera/kansi]$ ptex2pdf -l kyomeishu-shibun.tex
[isao@margarita:~/src/litera/kansi]$ ./pdfmentsuke.sh kyomeishu-shibun.pdf
- pdfmentsuke.sh page rebuilding:
p_2.pdf p_3.pdf p_4.pdf p_1.pdf p_6.pdf p_7.pdf p_8.pdf p_5.pdf p_10.pdf p_11.pd
f p_12.pdf p_9.pdf p_14.pdf p_15.pdf p_16.pdf p_13.pdf p_18.pdf p_19.pdf p_20.pd
f p_17.pdf p_22.pdf p_23.pdf p_24.pdf p_21.pdf p_26.pdf p_27.pdf p_28.pdf p_25.p
df p_30.pdf p_31.pdf p_32.pdf p_29.pdf p_34.pdf p_35.pdf p_36.pdf p_33.pdf p_38.
pdf p_39.pdf p_40.pdf p_37.pdf p_42.pdf p_43.pdf p_44.pdf p_41.pdf p_46.pdf blan
k.pdf blank.pdf p_45.pdf
- pdfmentsuke.sh wrote kyomeishu-shibun-men.pdf.
[isao@margarita:~/src/litera/kansi]$

macOS Sierra では,現時点で MacPorts が PDFtk をサポートしていない。Stackoverflow: PDFtk hanging on MacOS Sierra に掲げられている pdftk_server-2.02-mac_osx-10.11-setup.pkg をダウンロードしてインストールする。

pdftk コマンドは,上記スクリプトで使用しているページ分割,複数 PDF 結合,PDF ページ情報出力のほか,ローテイト(上下逆転,回転)機能も備わっており,四折,八折等のもっと複雑な面付にも利用できる。ただし,試した範囲では,分割・結合した PDF は元のものより十倍以上容量が大きくなってしまった。理由はよくわからない。PDFtk についても Hack している書籍を挙げておく。

PDF構造解説
John Whitington
オライリージャパン