PowerShellを使って複数のPDFから特定の文字列をまとめて検索する方法

経理の仕事をしていると会計基準をインターネットで調べることが良くありますが、結構な割合で監査法人が書いたPDFの説明資料がヒットします。こうした説明資料は監査法人として公表しているものなので、信頼性が高く会計基準を理解するうえで非常に役立つ物となっています。(コンサルにつなげるために個別具体的な内容は控え目になっていますが、概要や理論を知る上では最高のテキストです)

従って、検索するたびにPDFファイルをローカルフォルダにダウンロードしておくのですが、しばらくするとかなりの数のファイルがフォルダに溜まってしまい、後で読み返すときにどのファイルに何が書かれていたのか忘れてしまいます。1つ1つPDFファイルを開いて検索すると時間がかかるため、今回はPowerShellを使って複数のPDFをまとめて検索する方法を説明します。

itextsharp.dll

標準のPowerShellにはPDFを操作する機能が用意されていないため外部モジュールを導入する必要があります。今回使用するモジュールはitextsharp.dllというものになります。次のサイトからダウンロードをして下さい。

iTextSharp, a .NET PDF library(https://sourceforge.net/projects/itextsharp/

Downloadボタンを押せばダウンロードが始まります。


ダウンロードが完了したらitextsharp-all-5.5.10.zipというファイルが保存されているので、これを解凍してください。解凍すると下図の通りたくさんのファイルが表示されます。

この中で使用するのは赤枠で囲ったitextsharp-dll-core.zipです。このファイルをさらに解凍します。

itextsharp.dllを入手することができました。以降の説明はこのファイルはC:\tmpに保存した前提で進めて行きます。

PDFファイルの検索

今回作成したプログラムは次の通りです(ファイル名:pdf.ps1)。

## PowerShellからiTextSharpを使用
# itextsharp.dllの読み込み
[System.Reflection.Assembly]::LoadFrom("C:\tmp\itextsharp.dll")

$input = Read-Host "検索文字を入力してください"
Write-Host "=====検索結果====="

$fileList = Get-ChildItem -file -filter *.pdf*
foreach ($file in $fileList) {
    $f = New-Object System.Uri(Resolve-Path $file)
    $pdfRd = New-Object iTextSharp.text.pdf.Pdfreader($f)
    for ($i = 1; $i -lt $pdfRd.NumberOfPages; $i++) {
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($pdfRd, $i)
        if ($pageText.Contains($input)) {
            Write-Host $file.Name
            break
        }
    }
}

$pdfRd.Close()

使い方はシンプルで起動後に、「検索文字を入力してください:」の後に検索文字を入力すればそのフォルダ内(今回の場合はC:\tmp)のPDFファイルの中身を検索し始めます。

スクリプトの中身もそれほど複雑なものにはなっていません。

[11行目]

$f = New-Object System.Uri(Resolve-Path $file)

この部分は、Get-ChildItemにより取得したファイルの型が、System.IO.FileSystemInfo型である一方、iTextSharp.text.pdf.Pdfreader()の引数に必要な型がSystem.Uri型であったため型の変換を行っています。

以降は、ファイルを1つ1つ開いて1ページ毎に検索文字を探し、発見できればファイル名を表示して次のファイルへ、発見できなければ最後のページまで確認し次のPDFファイルへと検索していく流れです。

まとめ

大量のPDFを保存している場合、ファイル名だけでは内容の区別がつきにくいこともあるかと思います。そんな時は今回のプログラムを使えば簡単に内容の確認ができますので、皆さんも試してみてください。