PyMuPDF を用いて PDF の並びを変更して仕上がり A5 版の自作本を印刷するための PDF を作成した。
A5 縦で元の PDF を作成
LaTeX で組版する場合は以下のように記述。
\documentclass{jsarticle}
\usepackage{geometry}
\pdfpageheight=210mm
\pdfpagewidth=148mm
:
\begin{document}
:
:
\end{document}
印刷用の PDF を作成
以下を実行すると imposition.pdf が作成される。サイズが大きくなるので印刷後は削除した方が良い。blankA5.pdf は「A5 縦」の空白ページでこのスクリプトと同じディレクトリに配置する。
「A6 縦」の原稿にも対応させた。
# -*- coding: utf-8 -*-
import os, sys
import fitz
def imposit_A5(infile):
blank = fitz.open(os.path.join(os.path.dirname(__file__), 'blankA5.pdf'))
page_count = infile.page_count
page_max = int((page_count + 3) / 4) * 4
doc = fitz.open()
j = 0
for i in range(page_max):
mod = i % 4
if mod == 0: k = j
elif mod == 1: k = j + 2
elif mod == 2: k = j + 3
elif mod == 3: k = j + 1; j += 4
if k >= page_count:
doc.insert_pdf(blank)
else:
doc.insert_pdf(infile, from_page = k, to_page = k)
doc.save('imposition.pdf')
def imposit_A6(infile):
blank = fitz.open(os.path.join(os.path.dirname(__file__), 'blankA6.pdf'))
page_count = infile.page_count
page_max = int((page_count + 7) / 8) * 8
doc = fitz.open()
j = 0
for i in range(page_max):
mod = i % 8
if mod == 0: k = j
elif mod == 1: k = j + 2
elif mod == 2: k = j + 4
elif mod == 3: k = j + 6
elif mod == 4: k = j + 5
elif mod == 5: k = j + 7
elif mod == 6: k = j + 1
elif mod == 7: k = j + 3; j += 8
if k >= page_count:
doc.insert_pdf(blank)
elif mod < 4:
doc.insert_pdf(infile, from_page = k, to_page = k)
else:
doc.insert_pdf(infile, from_page = k, to_page = k, rotate = 180)
doc.save('imposition.pdf')
def main(src):
infile = fitz.open(src)
width = int(infile[0].rect.width * 25.4 / 72)
if width == 105:
imposit_A6(infile)
elif width == 148:
imposit_A5(infile)
else:
sys.exit(f'{src} is A5 nor A6.')
if __name__ == "__main__":
main(sys.argv[1])
印刷・裁断・製本
Adbe Acrobat Reader の印刷用のフォームで以下のように設定。
両面印刷して中央で裁断して並べ替える。製本は例えばこの動画を参考に行う。
訂 正
Adbe Acrobat Reader の面付けではマージン(上図の「ページ境界線」)が加わり原稿の版面が維持されないことが分かった。そこで、一手間増えるが、次の PDFMate Free PDF Merger を用いて A4 サイズの PDF に集約することにした。