Tips · Unlock · Batch

フォルダ内の PDF を一括でパスワード解除する

毎週届く資料など、同じ運用の PDF が複数あるとき。GUI の一括モードか CLI の unlock batch で、パスワードなしのコピーを一括作成します。

GUI

  1. 左メニューから Unlock を開く。
  2. 一括モード(フォルダ) にチェックを入れる。
  3. 入力フォルダ と 出力フォルダ を指定する。
  4. 必要なら サブフォルダを含める をオンにする。
  5. パスワードなしで保存 を押す。パスワード入力ダイアログが出たら入力する。
  6. 処理中に止めたいときは キャンセル で中断できる。
  7. 出力フォルダ内の PDF を開き、パスワードを聞かれないことを確認する。
ManaPDFのUnlock画面

CLI の基本

フォルダ内の PDF を同じパスワードで一括解除:

manapdf unlock batch .\pdfs --output-dir .\out --password "your-password" --recursive

ファイルごとにパスワードが違うとき(CSV は path,password 形式・UTF-8 BOM 可):

manapdf unlock batch .\pdfs --output-dir .\out --password-csv passwords.csv --recursive

対話入力で進めたいとき:

manapdf unlock batch .\pdfs --output-dir .\out --ask-password --recursive
  • unlock batch — フォルダ内の PDF を走査し、パスワードなしのコピーを --output-dir に保存します。入力 PDF は変更されません。
  • --password-csv — 1 行につき PDFのパス,パスワード。先頭行が path,password ならヘッダーとして読み飛ばします。パス列はファイル名だけ(例: 明細.pdf)でも、入力フォルダからの相対パスでも、フルパスでも構いません。
  • パスワードにカンマやダブルクォートが含まれるときは、CSV の値を "pa""ss,word" のようにクォートします。
  • 処理順はファイル名の自然順(file2.pdf が file10.pdf より前)です。--dry-run で対象と順番を確認できます。
  • --recursive なしのとき、出力は出力フォルダ直下に元と同じファイル名で作られます。サブフォルダを含めるときは、出力側でも同じ階層構造を維持します。

実行前の確認:

manapdf unlock batch .\pdfs --output-dir .\out --recursive --dry-run

1 件でも失敗したらエラー終了にしたいときは --strict を付けます。

例1 — CSV の path 列にファイル名だけ書く

入力フォルダ直下に PDF が並んでいるとき、CSV の 1 列目はファイル名だけで十分です。

path,password
明細_202403.pdf,abc123
契約書_A社.pdf,secret99
請求書.pdf,monthly
manapdf unlock batch .\pdfs --output-dir .\out --password-csv passwords.csv --force
  • CSV の path 列と、実際の PDF ファイル名が一致している必要があります(大文字小文字は Windows では区別しません)。
  • サブフォルダ内の PDF には、docs\locked.pdf のように入力フォルダからの相対パスを書きます(--recursive を付けて実行)。

例2 — テキストファイルの上から順にパスワードを当てる

passwords.txt に 1 行 1 パスワードだけ書いてあるとき、--password-csv は行番号ではなくパスで対応するため、そのままでは使えません。ManaPDF が処理する PDF の並び(自然順)に合わせて CSV を作ってから unlock batch します。

passwords.txt の例(1 行目が 明細_202403.pdf 用、2 行目が 契約書_A社.pdf 用…):

abc123
secret99
monthly

PowerShell で CSV を生成して一括解除:

$inputDir  = ".\pdfs"
$outputDir = ".\out"
$pwdFile   = ".\passwords.txt"

# ManaPDF と同じ並び・同じ対象を dry-run で取得
$plan = manapdf unlock batch $inputDir --output-dir $outputDir --dry-run --json --quiet | ConvertFrom-Json
$passwords = Get-Content $pwdFile | Where-Object { $_ -match '\S' }

if ($plan.files.Count -ne $passwords.Count) {
  throw "PDF $($plan.files.Count) 件とパスワード $($passwords.Count) 行が一致しません"
}

$csvLines = @("path,password")
$root = (Resolve-Path $inputDir).Path
for ($i = 0; $i -lt $plan.files.Count; $i++) {
  $rel  = $plan.files[$i].input.Substring($root.Length).TrimStart('\', '/')
  $pass = $passwords[$i] -replace '"', '""'
  if ($pass -match '[,"]') { $pass = "`"$pass`"" }
  $csvLines += "$rel,$pass"
}
$csvPath = Join-Path $env:TEMP "manapdf-passwords.csv"
$csvLines | Set-Content $csvPath -Encoding utf8

manapdf unlock batch $inputDir --output-dir $outputDir --password-csv $csvPath --recursive --force
  • --dry-run --json — 実際には解除せず、処理対象 PDF の一覧と順番だけを JSON で返します。ここでの順番が本番の unlock batch と同じです。
  • Get-Content で読んだ行の並びを、上から PDF 1 件目・2 件目…に対応させます。空行は除いています。
  • 件数が合わないときは CSV を作らずに止めます。先に --dry-run(テキスト出力)で PDF の並びを目視確認してください。
  • Get-ChildItem | Sort-Object Name だけでは ManaPDF の自然順とずれることがあります(例: file10.pdf と file2.pdf)。並びの基準は dry-run に合わせるのが確実です。

例3 — ファイル名からパスワードを拾って CSV を作る

ファイル名の末尾にパスワードが入っている運用(例: 明細_202403_pw-abc123.pdf)なら、PowerShell でパスワードを抜き出し、path,password の CSV を生成してから unlock batch します。

$inputDir = ".\pdfs"
$csvPath  = ".\passwords.csv"

$rows = Get-ChildItem $inputDir -Filter *.pdf -File | ForEach-Object {
  if ($_.Name -notmatch '_pw-(.+)\.pdf$') {
    Write-Warning "パスワード形式と合わない: $($_.Name)"
    return
  }
  $pass = $Matches[1] -replace '"', '""'
  if ($pass -match '[,"]') { $pass = "`"$pass`"" }
  [pscustomobject]@{ Line = "$($_.Name),$pass" }
}

"path,password", ($rows.Line) | Set-Content $csvPath -Encoding utf8
manapdf unlock batch $inputDir --output-dir .\out --password-csv $csvPath --force
  • _pw- の直後から拡張子の手前までをパスワードとして使う例です。社内の命名ルールに合わせて正規表現(-match のパターン)を変えてください。
  • 解除後の PDF は元のファイル名のまま出力されます(パスワード部分をファイル名から除きたい場合は、別途リネームが必要です)。
  • サブフォルダを含むときは Get-ChildItem -Recurse にし、CSV の path 列には入力フォルダからの相対パスを書くようにします。

例4 — 1 ファイルずつ unlock する(CSV を使わない)

件数が少ない、またはパスワード一覧と PDF をループで直結したいときは、単体の unlock を繰り返します。出力ファイル名は入力と同じ名前にできます。

$inputDir  = ".\pdfs"
$outputDir = ".\out"
$passwords = Get-Content .\passwords.txt | Where-Object { $_ -match '\S' }

$plan = manapdf unlock batch $inputDir --output-dir $outputDir --dry-run --json --quiet | ConvertFrom-Json
if ($plan.files.Count -ne $passwords.Count) { throw "件数が一致しません" }

for ($i = 0; $i -lt $plan.files.Count; $i++) {
  $in  = $plan.files[$i].input
  $out = $plan.files[$i].output
  manapdf unlock $in -o $out --password $passwords[$i] --force
}
  • unlock 入力.pdf -o 出力.pdf --password — 1 ファイルだけ解除します。単体コマンドに --ask-password はありません。
  • dry-run の output パスをそのまま使うと、unlock batch と同じ出力先・ファイル名になります。
  • 件数が多いときは、例2 の CSV 生成 + unlock batch の方が速く、途中再開もしやすいです。