keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

既存のPDFに、Pythonでページを追加する方法

既存のPDFに、Pythonでページを追加する方法、まずChatGPTに聞いてみた

↓ これは、このままではエラーになるので、下記の「修正」を参考にして下さい。

import PyPDF2
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io

def add_page_numbers(input_pdf, output_pdf):
    # 読み込むPDFファイルを開く
    pdf_reader = PdfFileReader(open(input_pdf, "rb"))
    pdf_writer = PdfFileWriter()
    
    # 各ページに番号を追加
    for page_num in range(pdf_reader.getNumPages()):
        # PDFページを読み込む
        page = pdf_reader.getPage(page_num)
        
        # PDFのサイズを取得
        packet = io.BytesIO()
        can = canvas.Canvas(packet, pagesize=letter)
        width, height = letter
        
        # ページ番号を追加(右下に配置)
        can.drawString(width - 50, 10, str(page_num + 1))
        can.save()
        
        # 新しいページを作成
        packet.seek(0)
        new_pdf = PdfFileReader(packet)
        page.mergePage(new_pdf.getPage(0))
        
        # ページをPDFライターに追加
        pdf_writer.addPage(page)
    
    # 新しいPDFを保存
    with open(output_pdf, "wb") as output_pdf_stream:
        pdf_writer.write(output_pdf_stream)

# 使用例
input_pdf = "input.pdf"
output_pdf = "output_with_page_numbers.pdf"
add_page_numbers(input_pdf, output_pdf)

修正

上記のソースは、メソッドが古いのでエラーになる。。。以下のように修正

↓ これは、動作する。

import PyPDF2
from PyPDF2 import PdfWriter, PdfReader
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io

def add_page_numbers(input_pdf, output_pdf):
    # 読み込むPDFファイルを開く
    pdf_reader = PdfReader(open(input_pdf, "rb"))
    pdf_writer = PdfWriter()
    
    # 各ページに番号を追加
    for page_num in range(len(pdf_reader.pages)):##(pdf_reader.getNumPages()):
        # PDFページを読み込む
        page = pdf_reader.pages[page_num]##pdf_reader.getPage(page_num)
        
        # PDFのサイズを取得
        packet = io.BytesIO()
        can = canvas.Canvas(packet, pagesize=letter)
        width, height = letter
        
        # ページ番号を追加(右下に配置)
        can.drawString(width - 50, 10, str(page_num + 1))
        can.save()
        
        # 新しいページを作成
        packet.seek(0)
        new_pdf = PdfReader(packet)
        page.merge_page(new_pdf.pages[0])###getPage(0))
        
        # ページをPDFライターに追加
        pdf_writer.add_page(page)
    
    # 新しいPDFを保存
    with open(output_pdf, "wb") as output_pdf_stream:
        pdf_writer.write(output_pdf_stream)

# 使用例
input_pdf = "input.pdf"
output_pdf = "output_with_page_numbers.pdf"
add_page_numbers(input_pdf, output_pdf)