# addpage.py
#
#   PDFファイルにページ番号を追加
#
# 準備:
#   pip install reportlab, pdfrw
#
# 使い方:
#   python addpage.py PDFファイル名
# 
# 出力ファイルとして PDFファイル名_wpage.pdfが生成される

from reportlab.pdfgen.canvas import Canvas
from pdfrw import PdfReader, PageMerge
from pdfrw.toreportlab import makerl
from reportlab.lib.pagesizes import A4, landscape, portrait
from pdfrw.buildxobj import pagexobj
import sys
import os

if len(sys.argv) != 2 or ".pdf" not in sys.argv[1].lower():
    print(f"Usage: python {sys.argv[0]} <pdf filename>")
    sys.exit()

input_file = sys.argv[1]
output_file = os.path.splitext(sys.argv[1])[0] + "_wpage.pdf" # outputファイル名: inputファイル名_wpage.pdf
orientation = 'portrait'        # 縦: portrait, 横: landscape 大きさ A4で固定
expage = {}                     # ページ番号を非表示にしたいページをカンマで区切って指定 例: {3,5}

reader = PdfReader(input_file)
# pages = [pagexobj(p) for p in reader.pages]
pages = [pagexobj(PageMerge().add(p).render()) for p in reader.pages]
canvas = Canvas(output_file)

for page_num, page in enumerate(pages, start=1):
    canvas.doForm(makerl(canvas, page))
    footer_text = f"-{page_num}-"                       # ページ番号の書式
    canvas.saveState()
    canvas.setFillColorRGB(0, 0, 0)                     # ページ番号の色の設定
    canvas.setFont('Times-Roman', 14)                   # ページ番号のフォントの種類, サイズの設定
    if orientation == 'landscape':
        canvas.setPageSize(landscape(A4))
        if page_num not in expage:
            canvas.drawString(420, 20, footer_text)     # ページ番号の表示位置 横の場合
    else:
        if page_num not in expage:
            canvas.drawString(290, 20, footer_text)     # ページ番号の表示位置 縦の場合
    canvas.restoreState()
    canvas.showPage()

canvas.save()
