C#でPDFをOCR処理する方法: .NETでスキャンした文書からテキストを抽出する
スキャンされたPDF文書は、 .NET開発者にとって常に課題となる。テキストは画像としてのみ存在するため、検索、コピー、プログラムによる処理が不可能だからだ。 光学文字認識(OCR)は、スキャンした画像を編集可能で検索可能なデータに変換することでこの問題を解決します。つまり、紙の文書、カメラで撮影した画像、または画像ベースのPDFファイルなどを機械が読み取れるテキストに変換するのです。 紙媒体のアーカイブをデジタル化すること、データ抽出を自動化すること、あるいは文書処理パイプラインを構築することなど、目的が何であれ、C#でPDFファイルに対してOCRを実行できる機能は非常に重要です。
IronOCRは、Tesseract 5エンジンをベースに、精度をさらに向上させた.NET OCRライブラリです。 開発者は、このツールを使うことで、スキャンされたものか否かを問わず、あらゆるPDF文書からテキストを抽出できます。しかも、わずか数行のコードで実現可能です。 この記事では、基本的なPDF OCR、ページ選択処理、領域指定抽出、および難易度の高いスキャン画像に対する画像前処理といった、主要なワークフローについて解説します。
C#でPDFに対してOCRを実行するにはどうすればよいですか?
.NETで PDF テキストを抽出する最も速い方法は、 NuGet経由でIronOCR をインストールすることから始まります。 プロジェクトディレクトリでターミナルを開き、以下を実行します。
dotnet add package IronOcr
dotnet add package IronOcr
パッケージをインストールすると、以下のトップレベルステートメントプログラムはスキャンされたPDFを読み込み、抽出されたテキストを出力します。
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr
' Initialize the OCR engine
Dim ocr As New IronTesseract()
' Load the PDF and perform OCR
Using input As New OcrInput()
input.LoadPdf("scanned-report.pdf")
' Run recognition
Dim result As OcrResult = ocr.Read(input)
' Access the extracted text
Dim text As String = result.Text
Console.WriteLine(text)
End Using
IronTesseract クラスは、 .NET Coreと.NET Framework の両方のターゲット向けに、.NET ネイティブの最適化を施した Tesseract 5 をラップします。 OcrInput オブジェクトは、PDF の読み込みと内部ページレンダリングを管理します。 Read が呼び出されると、OCR プロセスは各ページを分析し、抽出されたテキスト全体と、段落、行、単語、およびそれらのピクセル座標に関する構造化データを含むOcrResult を返します。
結果はテキストファイルに書き込んだり、後続の処理ロジックに渡したり、データベースに保存したり、ドキュメントインデックス作成パイプラインに供給したりできます。基盤となるエンジンの詳細については、 Tesseract OCRのドキュメントとIronOCR APIリファレンスを参照してください。
入力

出力

PDFファイルから特定のページを読み取るにはどうすればよいですか?
長い文書のすべてのページを処理すると、関連する内容が含まれているページが限られている場合、時間とメモリの無駄になります。 IronOCR、0 ベースのページインデックスを LoadPdf に渡すことで特定のページをターゲットにすることができます。
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System.Collections.Generic
Dim ocr As New IronTesseract()
' Specify pages to process (zero-based: 0 = first page)
Dim targetPages As New List(Of Integer) From {0, 2, 4}
Using input As New OcrInput()
input.LoadPdf("lengthy-document.pdf", pageIndices:=targetPages)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
選択的なページ読み込みは、処理時間とメモリ消費量の両方を削減します。これは、数百ページに及ぶアーカイブを扱う際に、必要なデータがごく一部のページにしか含まれていない場合に特に重要です。 0から始まるインデックス規則は、標準的な.NETコレクションと一致します。ページインデックス0は、ドキュメントの最初のページです。
関連するページが事前にわからない文書の場合は、まずDPIを下げて文書全体を高速にスキャンしてページ番号を特定し、その後、特定したページのみを対象にフル設定で再度スキャンすることを検討してください。
ページレベルの制御に関する詳細は、 IronOCRのページ選択に関するドキュメントを参照してください。
ページの特定領域からデータを抽出するにはどうすればよいですか?
請求書処理、フォームのデジタル化、構造化文書の解析などでは、ページ全体をスキャンするのではなく、特定の領域からテキストを抽出することが頻繁に必要となる。 IronOCRは、Rectangleオブジェクトの配列を受け入れます。
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing
Dim ocr As New IronTesseract()
' Define the scan region: X, Y, Width, Height (all in pixels from top-left)
Dim invoiceFields As Rectangle() = {
New Rectangle(130, 290, 250, 50) ' Invoice number field
}
Using input As New OcrInput()
input.LoadPdf("invoice.pdf", contentAreas:=invoiceFields)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Rectangle コンストラクタは、レンダリングされたページの左上隅からのピクセル単位で測定される、X 座標、Y 座標、幅、高さの 4 つの整数パラメータを受け取ります。 ページ全体ではなく小さな領域を対象とすることで、OCR処理時間を短縮できるだけでなく、エンジンが周囲のノイズや無関係なテキストフィールドを拾ってしまう可能性も低減できます。
バッチ請求書処理ワークフローでは、領域抽出と result.Pages の反復処理を組み合わせて、数百のドキュメントにわたって同じフィールド位置から構造化データを抽出します。 各ページの結果は、それぞれのコンテンツ領域における認識されたテキストを個別に表示します。
IronOCRのコンテンツ領域の例では、複数地域シナリオ向けの追加設定オプションが提供されています。
入力

出力

スキャンした文書のOCR精度を向上させるにはどうすればよいですか?
実際のスキャン文書には、ページの歪み、低解像度、スキャン機器やソフトウェアによって発生するデジタルノイズなど、品質上の問題が頻繁に発生します。 IronOCRには、認識エンジンを実行する前にこれらの問題を修正する一連の画像前処理フィルターが含まれています。
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr = New IronTesseract()
Using input = New OcrInput()
' Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi:=300)
' Apply image correction filters
input.Deskew() ' Automatically straighten rotated pages
input.DeNoise() ' Remove scanning artifacts and speckles
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
dpi パラメータは、認識処理が実行される前に PDF ページがレンダリングされる解像度を制御します。 200~300 DPIといった高い値に設定すると、文字が小さい文書や文字密度の高い文書の精度が向上しますが、処理時に若干多くのメモリが必要になります。 Deskew メソッドは、ページの回転を自動的に検出して修正します。 DeNoise は、文字認識ステップを混乱させる可能性のある斑点やアーティファクトを除去します。
より高度な画像補正が必要な文書の場合、 IronOCRはコントラスト強調、二値化(ページを白黒に変換)、およびスケール調整も提供します。 複数のフィルターを順番に組み合わせることで、本来であれば文字化けしてしまうようなスキャン画像から、使用可能なテキストを復元することができる。 利用可能な前処理操作の完全なリストについては、 IronOCRの画像フィルタリファレンスを参照してください。
パスワードで保護された文書や複数形式の文書はどのように処理しますか?
IronOCRは標準的なPDFファイルに限定されません。 このライブラリは、文書処理ワークフローで頻繁に発生するさまざまな入力シナリオに対応しています。
パスワードで保護されたPDFは、入力構築時に認証情報を渡すことでサポートされます。
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("protected.pdf", password:="secret123")
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
画像フォーマット(PNG、JPEG、TIFF、BMP、GIF、マルチページTIFF)は、対応するLoadImageFramesメソッドで読み込まれます。 入力形式に関わらず、同じ前処理フィルターと領域ターゲティングオプションが適用されます。
多言語文書は、IronOCRの言語パックシステムを通じて処理されます。 このライブラリはデフォルトで英語が同梱されており、ラテン文字、キリル文字、CJK、アラビア文字、その他の文字体系を含む 125 種類以上の言語パックをサポートしています。Read を呼び出す前に、追加の言語をロードしてください。
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.German
同じページに複数の言語が混在する文書の場合、MultiLanguage モードが利用可能です。 これは、ヘッダー、明細項目、住所が異なる言語で表示される可能性がある国際的な環境における請求書処理において特に価値があります。
デプロイメントは、Windows、Linux、macOS、およびAzureやDockerコンテナを含むクラウド環境全体で機能します。
スキャンした文書から検索可能なPDFを作成するにはどうすればよいですか?
IronOCRは、テキストを文字列として抽出するだけでなく、検索可能なPDF出力を作成することもできます。これは、元のスキャン画像が視覚的なレイヤーとして保持され、検索やコピー操作のために目に見えないテキストレイヤーが埋め込まれたPDFです。 これは、Professionalのドキュメントスキャナーで生成される標準フォーマットです。
IronOCRの検索可能なPDF機能は、 OcrResultを受け取り、新しいPDFファイルを作成します。
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("scanned-archive.pdf")
Dim result As OcrResult = ocr.Read(input)
' Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
出力ファイルは、どのPDFリーダーでも開くことができます。 テキストの選択、検索、コピー操作は、埋め込まれたテキストレイヤー上で行われ、元のスキャン画像の外観は保持されます。 この形式は、コンプライアンスアーカイブ、法的文書リポジトリ、およびEnterpriseコンテンツ管理システムで一般的に必要とされます。
追加の出力形式として、OcrResult オブジェクトは、ページごとの信頼度スコア、単語レベルの境界ボックス、構造化された段落データも公開します。これらはすべて、後続の分類やインデックス作成タスクに役立ちます。
テキストと並んで表示されるバーコードやQRコードはどのように読み取るのですか?
文書処理パイプラインでは、多くの場合、同じ文書から人間が読めるテキストと機械が読めるコードの両方を抽出する必要がある。 IronOCRは、別途ライブラリを必要とせず、同一のOCR処理中にバーコードとQRコードを検出およびデコードできます。
処理前に、IronTesseract インスタンスでバーコード読み取りを有効にしてください。
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True
Using input As New OcrInput()
input.LoadPdf("shipment-labels.pdf")
Dim result As OcrResult = ocr.Read(input)
' Access recognized text
Console.WriteLine(result.Text)
' Access barcode data
For Each barcode In result.Barcodes
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}")
Next
End Using
これは、配送ラベルの処理、在庫管理、およびスキャンされた文書にバーコードと印刷されたテキストが一緒に表示されるあらゆるワークフローにおいて特に役立ちます。 IronOCRのバーコード読み取りガイドでは、Code 128、QRコード、Data Matrix、PDF417など、サポートされているフォーマットについて解説しています。
IronOCRの入力タイプにはどのような違いがありますか?
IronOCRは、PDFファイルを読み込むための2つの主要な方法を提供しており、それぞれ異なるシナリオに適しています。
| アプローチ | クラス | 最適な用途 | 注意事項 |
|---|---|---|---|
| 一般的な入力 | `OcrInput.LoadPdf()` | ほとんどのユースケース | すべての前処理フィルター、ページ選択、コンテンツ領域をサポートします |
| PDF固有の | `OcrPdfInput` | シンプルなシナリオ | 利便性を重視したラッパー。設定オプションは少なめ。 |
| 画像ファイル | `OcrInput.LoadImage()` | PNG、JPEG、TIFF、BMP | PDF入力と同じ前処理と領域ターゲティング |
| 複数ページのTIFF | `OcrInput.LoadImageFrames()` | ファックスアーカイブ、スキャナー出力 | 各フレームを個別のページとして処理します |
ほとんどの運用シナリオでは、完全な前処理および構成APIを公開するため、OcrInput.LoadPdf() が推奨されるアプローチです。 OcrPdfInput は、迅速なプロトタイピングや、デフォルト設定で十分な状況に適しています。
次のステップは何ですか?
上記のコード例は、C# で記述されたIronOCRの PDF OCR における主要なワークフローを網羅しています。 次のステップに進むための簡単なチェックリストを以下に示します。
パッケージをインストールする:dotnet add package IronOcr またはNuGetでIronOCRを検索してください
-基本的な例を実行します:完全なパイプラインロジックを構築する前に、サンプルPDFからのテキスト抽出を確認します。
-前処理を適用する: スキャンしたドキュメントを扱う場合は、Deskew と DeNoise の呼び出しを追加し、代表的なサンプルでテストしてください。
その他の機能をご覧ください:検索可能なPDF出力、バーコード読み取り、多言語対応、構造化データ出力
-デプロイに関するガイダンスを確認してください。Azure、Docker、Linuxのデプロイに関する記事では、環境固有の構成について説明しています。
無料トライアルをお試しください:ライセンス契約前に、無料トライアルを開始して全機能をテストできます。
-ライセンスを取得する: IronOCRのライセンスオプションは、個人開発者からEnterprise展開までをカバーし、ロイヤリティフリーの再配布が可能です。
具体的な使用例に関する質問については、 IronOCRのハウツーライブラリに、数十のシナリオを網羅したステップバイステップの記事が用意されています。 APIの全機能はIronOCR APIリファレンスに記載されています。
よくある質問
C# で PDF を OCR するために必要な最小限のコードは何ですか?
IronOCRを使用する場合、最小限のコードは次のようになります。IronTesseract インスタンスを作成し、OcrInput を作成し、ファイルパスを指定して input.LoadPdf を呼び出し、ocr.Read(input) を呼び出します。result.Text プロパティは抽出された文字列を返します。
.NETプロジェクトにIronOCRをインストールするにはどうすればよいですか?
ターミナルで「dotnet add package IronOCR 」を実行するか、Visual Studio 内のNuGetパッケージ マネージャーでIronOCRを検索します。
IronOCR はPDF の特定のページのみを処理できますか?
はい。リストを渡します
スキャンした PDF の特定の領域からテキストを抽出するにはどうすればよいですか?
LoadPdfのcontentAreasパラメータにRectangleオブジェクトの配列を渡します。各四角形は、ページの左上隅からのX位置、Y位置、幅、高さをピクセル単位で指定します。
IronOCR はスキャンされたドキュメントに対してどのような前処理フィルターを提供しますか?
IronOCRは、デスキュー(ページの回転を補正)、ノイズ除去(スキャン時のノイズを除去)、コントラスト強調、二値化、スケール調整などの機能を備えています。これらを組み合わせることで、低品質のスキャンでも精度を向上させることができます。
IronOCR はパスワードで保護された PDF ファイルをサポートしていますか?
はい。LoadPdfのパスワードパラメータにパスワード文字列を渡してください。ライブラリはOCR用にページをレンダリングする前にドキュメントを復号化します。
IronOCR は検索可能な PDF 出力を作成できますか?
はい。ocr.Read(input) を呼び出した後、出力ファイルパスを指定して result.SaveAsSearchablePdf を呼び出します。生成されたPDFは、元のスキャンをビジュアルレイヤーとして保存し、検索やコピー操作のための非表示のテキストレイヤーが埋め込まれます。
IronOCR はどの言語をサポートしていますか?
IronOCRは、ラテン文字、キリル文字、CJK、アラビア文字など、125以上の言語パックをサポートしています。Readを呼び出す前に、IronTesseractインスタンスのLanguageプロパティを設定してください。
IronOCR はPDF ドキュメントからバーコードや QR コードを読み取ることができますか?
はい。Readを呼び出す前に、ocr.Configuration.ReadBarCodesをtrueに設定してください。OcrResult.Barcodesコレクションには、検出されたすべてのコードのデコードされた値とフォーマットタイプが含まれています。
IronOCR はLinux および Docker コンテナで動作しますか?
はい。IronOCRは、Windows、Linux、macOS、そしてAzureやDockerコンテナを含むクラウド環境へのデプロイをサポートしています。IronSoftwareのドキュメントには、環境固有のセットアップガイドが含まれています。



