1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PDF を結合・分割する:Acrobat も無料サイトも不要

1
Posted at

社外秘の見積書を 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.pdfinvoice_004.pdf — 4 社分の架空請求書(各 1 ページ)

実際の業務では、お手元の PDF ファイルを使ってください。fudebako の右パネルで「ドライブ」タブを開き、上部の「+ インポート」ボタンからファイルをアップロードします。

Drive にアップロードした 5 PDF

ここからが本題です。

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.pdfminutes_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 プレビュー機能

中央エリアに新しいタブが追加されて、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 にあります。意見・感想・「こんな業務もブラウザだけでできないか?」という相談は気軽にコメントでお寄せください。

1
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?