社外秘の見積書を PDF で受け取って、特定の 2 ページだけ別途依頼先に送りたい。月初に届く取引先 4 社分の請求書を 1 つにまとめて経理に提出したい。営業資料のうち、機密ページだけ抜いて社外プレゼン用に再構成したい。
毎月そういう作業が発生するのに、選択肢は意外と限られています。有料ツールは使いたくない、無料の PDF 結合・分割サイトはどこも「ファイルをアップロード」を要求してきて、社外秘の書類を上げていいのか毎回迷います。会社 PC には Python も入れられないし、フリーソフトのインストールも稟議に時間がかかる。
この記事では、ブラウザ 1 枚で完結する Python 環境「fudebako」と Python の PDF 操作ライブラリ pypdf を組み合わせて、結合・分割・ページ抜き出し・機密ページ削除・並び替え・一括処理を全部ローカルで完結させる方法を紹介します。外部にファイルを送信せず、インストールも不要で、コードはコピペしてすぐ使えます。
この記事でわかること
- pypdf で PDF を結合・分割・ページ削除・並び替えする最小コード
- fudebako の Drive にファイルをアップロード/ダウンロードする手順
- fudebako 内蔵の PDF プレビュー機能で結果を確認する方法
- 「外部送信なし」が業務 PC で重要な理由
1. fudebako のセットアップ
fudebako は HTML 1 ファイル(v0.3.4 で約 100 MB)で動く Python 環境です。リリースページから fudebako-v0.3.4.html をダウンロードして、ブラウザで開くだけで起動します。インストール権限も管理者権限も要りません。
起動すると、左がコード入力欄、右が「ワークスペース」「ドライブ」のタブの画面が出ます。Pyodide ベースなので、業務 PC のブラウザ内で完結し、ファイルやデータが外部に送信されることはありません。
2. サンプルファイルの準備
今回は以下の 5 ファイルを使います。
-
sample_minutes.pdf— 9 ページの架空議事録(1 ページ目が表紙、5 ページ目が機密ページ想定) -
invoice_001.pdf〜invoice_004.pdf— 4 社分の架空請求書(各 1 ページ)
実際の業務では、お手元の PDF ファイルを使ってください。fudebako の右パネルで「ドライブ」タブを開き、上部の「+ インポート」ボタンからファイルをアップロードします。
ここからが本題です。
3. pypdf のインストール
fudebako のコード入力欄に以下を貼り付けて、Cmd + Enter(Mac) または Ctrl + Enter(Windows)で実行します。
import micropip
await micropip.install("pypdf")
import pypdf
print(f"pypdf version: {pypdf.__version__}")
数秒で pypdf version: 6.10.2 と出れば準備完了です。次に進みましょう。
4. 基本 1:複数 PDF を 1 つに結合する
経理に「今月の請求書を 1 つの PDF にまとめて出して」と頼まれた場面を想定します。4 社分を 1 ファイルに結合するコードがこちらです。
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
invoices = [
"invoice_001.pdf",
"invoice_002.pdf",
"invoice_003.pdf",
"invoice_004.pdf",
]
for path in invoices:
writer.append(path)
pages = len(PdfReader(path).pages)
print(f" + {path} ({pages} ページ)")
with open("invoices_merged.pdf", "wb") as f:
writer.write(f)
print("=== 結合完了: invoices_merged.pdf ===")
PdfWriter.append() がポイントで、ファイルパスを直接渡すだけで全ページを順番に追加してくれます。実行すると、ドライブタブに invoices_merged.pdf が現れます。
このファイルをドライブの行右端のダウンロードボタンから手元に保存できます。
5. 基本 2:1 つの PDF をページ毎に分割する
「9 ページの議事録を 1 ページずつバラバラにしたい」という要望。例えば議事録を、各議題ごとに別ファイルとして保管したい場合などです。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("sample_minutes.pdf")
print(f"元 PDF: {len(reader.pages)} ページ")
for i, page in enumerate(reader.pages, start=1):
w = PdfWriter()
w.add_page(page)
out = f"minutes_p{i:02d}.pdf"
with open(out, "wb") as f:
w.write(f)
print(f" → {out}")
reader.pages でページオブジェクトを取り出して、writer.add_page() で 1 ページ単位の PDF を作るだけです。9 個の minutes_p01.pdf 〜 minutes_p09.pdf がドライブに並びます。
6. 基本 3:必要なページだけ抜き出す(範囲抽出)
「議事録の 3〜5 ページ目だけ社外パートナーに共有したい」場合の範囲抽出。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("sample_minutes.pdf")
writer = PdfWriter()
# 3-5 ページ目(0-indexed なので pages[2:5])
for i in range(2, 5):
writer.add_page(reader.pages[i])
with open("minutes_summary.pdf", "wb") as f:
writer.write(f)
print(f"3 ページ抽出: minutes_summary.pdf")
ここで気をつけたいのは pypdf のページ番号が 0-indexed であること。「3 ページ目」と言いたい場合は pages[2] です。プログラミング に慣れていれば自然ですが、引っかかりやすいポイント。範囲指定なら pages[start-1:end] と覚えておくと混乱しません(3-5 ページ目 → pages[2:5])。
7. 応用 1:特定ページを除外して社外配布用に整形
議事録の 5 ページ目に「個別案件メモ(社外秘)」が入っているとします。社外提出前にそのページだけ除外したい場合のコード。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("sample_minutes.pdf")
writer = PdfWriter()
SECRET_PAGE = 5 # 1-indexed
for i, page in enumerate(reader.pages, start=1):
if i == SECRET_PAGE:
print(f" - {i} ページ目(個別案件メモ)を除外")
continue
writer.add_page(page)
with open("minutes_external.pdf", "wb") as f:
writer.write(f)
result = PdfReader("minutes_external.pdf")
print(f"社外配布用: {len(result.pages)} ページ")
実行すると 9 ページが 8 ページになります。「機密ページを抜いて再生成」が 10 行で書ける手軽さは pypdf の強みです。
8. 応用 2:ページの並び替え
「目次(最初)→ 決定事項(最後)→ 各議題(中盤)」の順に並んでいる議事録を、「サマリ → 決定事項 → 議題詳細」の順に再構成したい場合。
from pypdf import PdfReader, PdfWriter
reader = PdfReader("sample_minutes.pdf")
writer = PdfWriter()
# 並び替え順: 表紙 → サマリ → 決定事項 → 議題 1-3 → 個別案件 → 次回予定
order = [1, 2, 7, 3, 4, 5, 6, 8, 9]
for src in order:
writer.add_page(reader.pages[src - 1])
with open("minutes_reordered.pdf", "wb") as f:
writer.write(f)
print(f"並び替え完了: {len(order)} ページ")
order のリストを書き換えるだけで、任意の順序に再構成できます。Excel の VBA でこれをやるのは結構大変ですが、Python なら 10 行で済みます。
9. 応用 3:フォルダ内の PDF を一括結合
毎月発生するルーチン作業として「Drive 内の請求書を全部まとめる」を自動化します。
import os
from pypdf import PdfReader, PdfWriter
# Drive 内の invoice_*.pdf を全部拾う
files = sorted([f for f in os.listdir(".") if f.startswith("invoice_") and f.endswith(".pdf")])
print(f"対象: {len(files)} 件")
writer = PdfWriter()
for path in files:
writer.append(path)
print(f" + {path}")
with open("invoices_2026_04_all.pdf", "wb") as f:
writer.write(f)
result = PdfReader("invoices_2026_04_all.pdf")
size = os.path.getsize("invoices_2026_04_all.pdf")
print(f"\n一括結合: {len(result.pages)} ページ / {size:,} bytes")
os.listdir(".") で Drive 直下のファイル一覧を取得して、startswith("invoice_") で対象を絞ります。実際の業務では「2026-04 ディレクトリ配下」のような構造にすればフォルダ別の集計もできます。
10. fudebako 内蔵の PDF プレビュー
ここまで生成したファイルは、ドライブのファイル名をクリックすると fudebako 上で直接プレビューできます。
中央エリアに新しいタブが追加されて、PDF の中身がそのまま表示されます。「結合した結果が想定通りか」「機密ページが本当に除外されたか」を、ダウンロードしてから別アプリで開く前にその場で確認できます。
業務文書を扱うとき、確認・確認・確認の小さなループが地味に時間を食うので、この「コードの隣でそのまま見れる」のは効きます。
11. 制約・注意
利用前に知っておいてほしい制約も正直に書きます。
-
パスワード保護 PDF: pypdf は読み込み時に
reader.decrypt(password)を呼べばパスワード付き PDF も扱えますが、本記事では割愛。 -
OCR(スキャン PDF からの文字起こし): pypdf は単体では OCR できません。PDF の本文を Markdown 化したい場合は、別記事の
markitdown× fudebako が参考になります(精度には限界があります)。 - PDF の中身を編集: 文字や画像を「上書き」する用途には pypdf は向きません。あくまで「ページ単位の操作」です。
- 電子署名・タイムスタンプ: ページ操作した PDF からは元の電子署名が外れます。これは pypdf の制約というより、PDF 仕様上の挙動です。
12. なぜ「外部に送らない」が大事なのか
無料の PDF 結合・分割サイトは多数ありますが、規約をよく読むと「アップロードされたファイルは XX 時間後に削除」「サーバー側で処理」と書かれていることが大半です。社外秘の見積書・人事書類・契約書を、一時的にとはいえ第三者のサーバーに置くのは、組織のセキュリティ規程に抵触する可能性があります。
fudebako で pypdf を動かす場合、ファイルはブラウザ(ローカルPC)のサンドボックス内(Pyodide の仮想ファイルシステム)にしか存在せず、外部のサーバーには送信されません。「ローカル完結」が業務上の制約として効く環境では、有力な選択肢になるのではないでしょうか。
13. まとめ
- pypdf は fudebako(ブラウザ完結 Python)で動き、結合・分割・ページ削除・並び替え・一括処理が 10〜20 行のコードで書けます。
- ファイルは外部送信されないので、社外秘の PDF も安心して扱えます。
- fudebako 内蔵の PDF プレビュー機能で、生成結果をその場で確認できます。
- パスワード解除や OCR が必要なら別ライブラリの組み合わせを検討、それ以外のページ操作は pypdf でカバーできます。
「会社 PC で Python を使いたいが入れられない」と困っている方は、まずは 会社 PC に Python が入れられない人へ から始めるとスムーズです。「PDF を Markdown 化したい」場合は 記事 E:markitdown × fudebako も合わせてどうぞ。
fudebako 自体のリリースは GitHub にあります。意見・感想・「こんな業務もブラウザだけでできないか?」という相談は気軽にコメントでお寄せください。



