
import fitz # PyMuPDF
from PIL import Image
import os
ライブラリ名 | 何をするもの? |
---|---|
fitz | PDFファイルを読み込んだり、画像に変換する(PyMuPDFというツールの一部) |
PIL.Image | 画像を切り取ったり保存したりする |
os | フォルダを作ったりファイルを操作する |
順番
📄 スクリプトの流れ
① 入力PDFファイルと保存先の指定
input_pdf = "page_1.pdf" # 処理するPDFファイルの名前
output_dir = "split_pages_vertical" # 保存するフォルダの名前
os.makedirs(output_dir, exist_ok=True) # フォルダがなければ作る(あってもOK)
input_pdf
:もとになるPDFファイル(例:1ページに3つのボックスがあるPDF)output_dir
:分割したファイルを入れておくフォルダos.makedirs
:フォルダを作る
② PDFファイルを開く
doc = fitz.open(input_pdf)
この行でPDFファイルを開きます。
この doc
には、ページ情報が全部入ってます。
③ ページごとに処理する
for page_num in range(len(doc)): # 全ページに対して
page = doc.load_page(page_num) # ページを読み込む
この部分は「全ページに対して、1ページずつ処理していくよ」という意味。
④ ページを画像に変換する
pix = page.get_pixmap(dpi=300) # PDFページを画像に変換(高解像度)
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) # PIL画像に変換
PDFのページを「画像(写真のようなもの)」に変えています。
この画像をあとで「3つに切り取る」ことになります。
⑤ 画像を3等分して切り取る
part_height = img.height // 3 # 高さを3等分
for i in range(3): # 3回繰り返す(上・中・下)
top = i * part_height # 切り取りの上端
bottom = (i + 1) * part_height # 切り取りの下端
cropped = img.crop((0, top, img.width, bottom)) # 指定範囲で切り取る
ここで画像を「上・中・下」の3つに分割しています。
たとえば高さが900ピクセルなら、1つの高さは300ピクセルになります。
⑥ 分割した画像をPDFに変換して保存する
png_path = f"{output_dir}/page{page_num+1}_part{i+1}.png"
pdf_path = f"{output_dir}/page{page_num+1}_part{i+1}.pdf"
cropped.save(png_path) # いったん画像として保存
Image.open(png_path).convert("RGB").save(pdf_path, "PDF") # 画像をPDFに変換して保存
os.remove(png_path) # 画像ファイル(PNG)は削除(不要なので)
分割した部分は、
- まずPNG画像として保存
- それをPDFに変換
- PNGは削除(ゴミを残さないため)
という流れです。
⑦ 最後にPDFを閉じる
doc.close()
開いたPDFを閉じて、処理終了です。
🎉 結果としてできること
たとえば page_1.pdf
にこんなページがあったとすると:
+------------------------+
| PDF1 |
+------------------------+
| PDF2 |
+------------------------+
| PDF3 |
+------------------------+
このスクリプトを使うと、次の3つのPDFができます:
split_pages_vertical/page1_part1.pdf
→ PDF1の部分だけsplit_pages_vertical/page1_part2.pdf
→ PDF2の部分だけsplit_pages_vertical/page1_part3.pdf
→ PDF3の部分だけ
✅ まとめ
このスクリプトは:
- 1ページに3つ並んだPDF内容を
- 縦方向に3分割して
- それぞれを別々のPDFファイルにする