PowerShellでPDFの特定部分を抽出する方法|OCRを使った文字認識まで完全解説

業務の中でPDFの一部だけを自動的に読み取りたい、というケースは少なくありません。
たとえば請求書の「合計金額」や「日付」だけを抜き出したい場合、毎回手作業で確認するのは非効率です。
この記事では、PowerShellを使ってPDFの特定領域を抽出する方法を解説します。
さらに、画像ベースのPDF(スキャンデータなど)から文字を認識するためのOCR処理も紹介します。
無料で使えるツールやライブラリを活用しながら、実務にすぐ応用できる手順を解説します。


PowerShellでPDFを扱う際の基本方針

PowerShell単体ではPDF解析のネイティブ機能がありません。
しかし、外部ライブラリコマンドラインツールを組み合わせることで、高精度な処理が可能になります。

主なアプローチは以下の3つです。

  1. iTextSharp / PDFSharpなどの.NETライブラリを利用
  2. Poppler for Windowsなどのコマンドラインツールを呼び出す
  3. Tesseract OCRを組み合わせて画像PDFを解析する

これらを組み合わせることで、PDFの「特定ページ」「特定座標」から文字を抽出することができます。


方法①:PDFSharpで特定ページのテキストを抽出する

最もシンプルな方法は、PDFがテキストベースの場合です。
この場合、OCRは不要で、PDF内部のテキスト構造を直接読み取れます。

必要ツール

  • PDFSharp
  • PowerShell 7.x(.NET互換環境)

サンプルコード

# PDFSharpライブラリを読み込む
Add-Type -Path "C:\libs\PdfSharp.dll"

# PDFを開く
$pdfPath = "C:\docs\sample.pdf"
$doc = [PdfSharp.Pdf.IO.PdfReader]::Open($pdfPath, [PdfSharp.Pdf.IO.PdfDocumentOpenMode]::ReadOnly)

# 特定ページを指定(例:2ページ目)
$page = $doc.Pages[1]

# テキストを抽出(テキストベースPDFのみ)
$parser = New-Object PdfSharp.Pdf.Content.ContentReader
$content = [PdfSharp.Pdf.Content.ContentReader]::ReadContent($page)
Write-Output $content

この方法ではテキストが構造的に抽出されますが、レイアウトは保持されません。
そのため「ページ内の座標で抽出する」というよりも、「ページ内すべてのテキストを取得」してから後処理で必要な行を抜き出す形になります。


方法②:Poppler + PowerShellで特定領域を抽出する

PDFが複雑なレイアウトである場合や、テキストを位置情報と一緒に取得したい場合はPoppler for Windowsが便利です。
特に「pdftotext」「pdftoppm」などのコマンドをPowerShellから呼び出すことで、座標指定も可能になります。

事前準備

  1. Poppler for Windows をダウンロード
  2. C:\poppler\bin などに展開
  3. PowerShellのPATHに追加

座標指定でテキスト抽出

$pdfPath = "C:\docs\invoice.pdf"
$output = "C:\docs\output.txt"

# x,y,w,hはポイント単位(左上基準)
$command = "C:\poppler\bin\pdftotext.exe -f 1 -l 1 -x 100 -y 200 -W 200 -H 50 `"$pdfPath`" `"$output`""
Invoke-Expression $command

Get-Content $output

このコマンドでは、PDFの1ページ目のx=100,y=200付近の幅200px高さ50pxの範囲だけを抽出します。
位置が固定された領収書や請求書の特定項目を抜き出す場合に最適です。


方法③:画像PDFをOCRで解析する(Tesseract + PowerShell)

スキャンされたPDFは文字情報を持たない「画像」データです。
そのため、OCR(光学文字認識)を利用して文字を検出する必要があります。

必要ツール

  • Tesseract OCR
  • Poppler(pdftoppmでPDF→画像変換に使用)

手順

  1. PDFを画像(PNGなど)に変換
  2. Tesseractでテキスト化
  3. PowerShellで必要部分のみ抽出

サンプルコード

# ファイルパス設定
$pdfPath = "C:\docs\scan.pdf"
$imagePrefix = "C:\docs\page"
$tessOut = "C:\docs\ocr.txt"

# Popplerで1ページ目を画像に変換
& "C:\poppler\bin\pdftoppm.exe" -f 1 -l 1 -png $pdfPath $imagePrefix

# OCR実行
& "C:\Program Files\Tesseract-OCR\tesseract.exe" "${imagePrefix}-1.png" $tessOut -l jpn

# OCR結果を読み込む
$content = Get-Content "${tessOut}.txt"
Write-Output $content

このコードでは、TesseractがPDF画像内の日本語文字を読み取り、テキストとして出力します。
-l jpn オプションにより、日本語OCRが有効になります。

さらに座標範囲を指定したい場合は、ImageMagickのconvertコマンドでトリミングしてからOCRにかける方法が有効です。


方法④:AI OCR APIを利用する(クラウド連携)

より高精度なOCRを求める場合は、Google Cloud Vision APIAzure Cognitive ServicesをPowerShellから呼び出す方法もあります。
クラウドOCRは精度が高く、表や複雑なフォントにも強いのが特徴です。

例:Google Cloud Vision API

$apiKey = "YOUR_GOOGLE_API_KEY"
$imageBase64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\docs\page-1.png"))

$body = @{
  requests = @(@{
    image = @{ content = $imageBase64 }
    features = @(@{ type = "TEXT_DETECTION" })
  })
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://vision.googleapis.com/v1/images:annotate?key=$apiKey" `
  -Method Post -Body $body -ContentType "application/json" | 
  ConvertTo-Json -Depth 5

これでOCR結果をJSON形式で受け取り、PowerShellでパースして必要な文字列だけを抽出できます。


方法⑤:PDFのレイアウトを自動解析して特定領域を抽出する

もし毎回同じフォーマットの帳票を処理するなら、レイアウト情報をJSONやCSVで定義しておくのも効率的です。

たとえば次のように座標を定義します。

{
  "invoice": {
    "total": { "page": 1, "x": 300, "y": 700, "width": 150, "height": 40 },
    "date":  { "page": 1, "x": 100, "y": 150, "width": 100, "height": 30 }
  }
}

PowerShellでこれを読み込み、Poppler + Tesseractの組み合わせで自動的に該当部分を抽出すれば、請求書自動読み取りシステムのように活用できます。


応用例:請求書の「合計金額」だけを自動抽出するスクリプト

$config = Get-Content "C:\config\areas.json" | ConvertFrom-Json
$area = $config.invoice.total

# 画像化
& "C:\poppler\bin\pdftoppm.exe" -f $($area.page) -l $($area.page) -png "C:\docs\invoice.pdf" "C:\docs\page"

# 切り抜き(ImageMagick)
& "C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\magick.exe" `
  "C:\docs\page-1.png" -crop "$($area.width)x$($area.height)+$($area.x)+$($area.y)" "C:\docs\crop.png"

# OCR実行
& "C:\Program Files\Tesseract-OCR\tesseract.exe" "C:\docs\crop.png" "C:\docs\ocr_total" -l jpn

# 結果出力
Get-Content "C:\docs\ocr_total.txt"

このスクリプトをタスクスケジューラで毎日実行すれば、受信フォルダのPDFから自動的に金額を集計することも可能です。


まとめ

PowerShellでも、外部ツールを組み合わせればPDFの特定領域抽出やOCR解析を実現できます。

方法特徴向いている用途
PDFSharpテキストベースPDFの解析構造化されたPDF文書
Poppler座標指定抽出固定フォーマット帳票
TesseractOCR処理スキャンPDFや画像PDF
Cloud OCR高精度文字認識表・複雑フォント対応
JSONレイアウト制御自動処理の仕組み化請求書・見積書管理

PowerShellは「ファイル処理」や「スクリプト自動化」との親和性が高く、
OCR・PDF処理を組み合わせることで、業務効率を劇的に改善できます。

日々の請求書処理、納品書管理、報告書抽出など、
あなたの現場に合わせた自動化をぜひPowerShellで実現してみてください。

タイトルとURLをコピーしました