この記事でわかること
- Pythonライブラリ「pikepdf」を使ったPDFパスワード解除の方法
- 複数ファイルをフォルダごと一括処理するスクリプトの実装例
- 情報セキュリティの観点から見た安全な運用ルール
はじめに
こんにちは、Satomemoです。 いよいよ2026年4月の復職が近づいてきました。育休中は「時間があるようで全くない」日々でしたが、復職後はさらに「分刻み」のスケジュールになることが目に見えています。
そこで、今のうちに「毎月発生する数分の無駄作業」をPythonで自動化して、少しでも未来の自分を楽にさせることにしました。
課題:ペーパーレス化の弊害「パスワード地獄」
最近は給与明細、保育園の請求書、銀行の取引明細など、あらゆる書類がPDFで電子交付されるようになりました。これ自体はありがたいのですが、問題なのは「パスワード」です。
- メールからPDFをダウンロードする
- ファイルを開く
- いつものパスワード(誕生日の下4桁とか)を入力する
- 「パスワードなし」で別名保存し直す
- 家計簿アプリ(Money Forwardなど)に取り込む
この作業、1つなら数秒ですが、毎月複数のファイルで発生すると地味にストレスです。特にスマホで確認したい時にパスワードを求められると「もういいや」となりがちです。
解決策:Pythonで「パスワード解除→リネーム保存」を自動化する
「決まったパスワードを入力する」という単純作業は、コンピュータが最も得意とする分野です。 今回は、以下の動きをするシンプルなスクリプトを作成しました。
- 特定のフォルダに入れたPDFを検知
- あらかじめ設定したパスワードリスト(自分や家族の誕生日など)を総当たりで試行
- ヒットしたらパスワードを解除
- 「unlocked_(元のファイル名).pdf」として保存
これなら、ダウンロードしたファイルを「Inboxフォルダ」に放り込んでスクリプトを叩くだけで、整理されたPDFが出来上がります。
環境準備:pikepdfのインストール
まずは必要なライブラリをインストールします。ターミナルで以下を実行するだけです。
pip install pikepdf
macOSでインストールがうまくいかない場合は、依存ライブラリ qpdf を先に入れると解決することがあります。
brew install qpdf
pip install pikepdf
実装:ライブラリ「pikepdf」を使えば一瞬
PDF操作のライブラリはいくつかありますが、今回は処理が高速で解除に強い pikepdf を採用しました。
開発環境
- PC: MacBook Air (13-inch, M4, 2025)
- OS: macOS Tahoe 26.2
- 言語: Python 3.14.1
コードのイメージ あくまで自分用の効率化ツールなので、コードは非常にシンプルです。
Python
import pikepdf
import os
# 対象のファイルとパスワード
target_file = "payslip_202601.pdf"
password_list = ["19850101", "password123"] # 自分のパスワードリスト
try:
# パスワードリストを順番に試す
for pwd in password_list:
try:
# PDFを開いてみる
pdf = pikepdf.open(target_file, password=pwd)
# 開けたらパスワード解除して保存
new_filename = f"unlocked_{target_file}"
pdf.save(new_filename)
print(f"成功!パスワードは {pwd} でした。")
break
except pikepdf.PasswordError:
continue # パスワード違いなら次へ
except Exception as e:
print(f"エラーが発生しました: {e}")
これだけで、いちいち手入力していた作業から解放されました。 (※実際にはフォルダ内の全ファイルをループ処理させたり、日付をファイル名に入れたりして運用しています)
実用版:フォルダ内の全PDFを一括処理するスクリプト
実際に運用しているのは、以下のような「Inboxフォルダに放り込んだPDFをまとめて処理する」バージョンです。
import pikepdf
import os
from pathlib import Path
# 設定
INBOX_DIR = Path.home() / "Downloads" / "pdf_inbox" # 処理対象フォルダ
OUTPUT_DIR = Path.home() / "Downloads" / "pdf_unlocked" # 出力先フォルダ
PASSWORD_LIST = ["19850101", "password123"] # 試すパスワードリスト
OUTPUT_DIR.mkdir(exist_ok=True)
results = {"success": 0, "failed": 0, "skipped": 0}
for pdf_path in INBOX_DIR.glob("*.pdf"):
out_path = OUTPUT_DIR / f"unlocked_{pdf_path.name}"
# 処理済みはスキップ
if out_path.exists():
print(f"スキップ: {pdf_path.name}")
results["skipped"] += 1
continue
unlocked = False
for pwd in PASSWORD_LIST:
try:
with pikepdf.open(pdf_path, password=pwd) as pdf:
pdf.save(out_path)
print(f"✓ 解除成功: {pdf_path.name} (パスワード: {pwd})")
unlocked = True
results["success"] += 1
break
except pikepdf.PasswordError:
continue
if not unlocked:
# パスワードなしで開けるか確認(もともと無圧縮のPDF)
try:
with pikepdf.open(pdf_path) as pdf:
pdf.save(out_path)
print(f"✓ パスワードなし: {pdf_path.name}")
results["success"] += 1
except Exception:
print(f"✗ 失敗: {pdf_path.name} (パスワードリストに該当なし)")
results["failed"] += 1
print(f"
完了: 成功 {results['success']} / 失敗 {results['failed']} / スキップ {results['skipped']}")
これを毎月の明細日に実行するだけで、パスワード入力の手間が完全になくなります。スクリプトの実行をもっと楽にしたい場合は、Macの右クリックから一発実行する方法をあわせてご覧ください。
注意点:セキュリティと利便性のバランス
情報セキュリティの仕事をしている身として、一応補足しておきます。
このスクリプトは「自分が正規に権限を持っている(パスワードを知っている)ファイルの閲覧を楽にする」ためのものです。 解除したPDFは誰でも見られる状態になるので、保存先を暗号化されたディスク領域にするか、個人のローカルPC内だけで管理するなど、取り扱いには注意が必要です。
「便利になる」=「ガードが下がる」ということなので、クラウドストレージ(Google Drive等)にアップロードする際は、逆にパスワードをかける等の運用ルールを決めておきましょう。
まとめ:復職に向けて「秒」を削り出す
たかがパスワード入力、されどパスワード入力。 「面倒くさいな」という感情は、自動化への第一歩です。
情シスとしてのスキルを家庭内の事務作業にも活かして、来るべき復職ライフを少しでも快適にしていきたいと思います。 次は「保育園のプリント整理」あたりを自動化したいですね…。


コメント