1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PyMuPDF を用いて印刷用の PDF を作成

Last updated at Posted at 2022-03-21

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 の印刷用のフォームで以下のように設定。
両面印刷して中央で裁断して並べ替える。製本は例えばこの動画を参考に行う。
prn_acrobat.png

訂 正

Adbe Acrobat Reader の面付けではマージン(上図の「ページ境界線」)が加わり原稿の版面が維持されないことが分かった。そこで、一手間増えるが、次の PDFMate Free PDF Merger を用いて A4 サイズの PDF に集約することにした。
PDFMate.png

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?