フッターコンテンツにスキップ
IRONOCRの使い方

C#でPDFをOCR処理する方法: .NETでスキャンした文書からテキストを抽出する

スキャンされたPDF文書は、 .NET開発者にとって常に課題となる。テキストは画像としてのみ存在するため、検索、コピー、プログラムによる処理が不可能だからだ。 光学文字認識(OCR)は、スキャンした画像を編集可能で検索可能なデータに変換することでこの問題を解決します。つまり、紙の文書、カメラで撮影した画像、または画像ベースのPDFファイルなどを機械が読み取れるテキストに変換するのです。 紙媒体のアーカイブをデジタル化すること、データ抽出を自動化すること、あるいは文書処理パイプラインを構築することなど、目的が何であれ、C#でPDFファイルに対してOCRを実行できる機能は非常に重要です。

IronOCRは、Tesseract 5エンジンをベースに、精度をさらに向上させた.NET OCRライブラリです。 開発者は、このツールを使うことで、スキャンされたものか否かを問わず、あらゆるPDF文書からテキストを抽出できます。しかも、わずか数行のコードで実現可能です。 この記事では、基本的なPDF OCR、ページ選択処理、領域指定抽出、および難易度の高いスキャン画像に対する画像前処理といった、主要なワークフローについて解説します。

PDF で C#で OCR を実行するにはどうすればよいですか?

.NETで PDF テキストを抽出する最も速い方法は、 NuGet経由で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
$vbLabelText   $csharpLabel

IronTesseract クラスは、.NET Coreと.NET Frameworkの両方のターゲットに対して.NETネイティブ最適化を使用してTesseract 5をラップします。 OcrInput オブジェクトはPDFの読み込みと内部ページのレンダリングを管理します。 Read が呼び出されると、OCRプロセスは各ページを分析し、完全に抽出されたテキストと段落、行、単語、およびそれらのピクセル座標に関する構造化データを含むOcrResult を返します。

結果はテキストファイルに書き込んだり、後続の処理ロジックに渡したり、データベースに保存したり、ドキュメントインデックス作成パイプラインに供給したりできます。基盤となるエンジンの詳細については、 Tesseract OCRのドキュメントIronOCR APIリファレンスを参照してください。

入力

PDFをOCRする方法: C# .NET OCR PDFでスキャンされた文書からテキストを抽出: イメージ 1 - サンプルPDF入力

出力

PDFをOCRする方法: C# .NET OCR PDFでスキャンされた文書からテキストを抽出: イメージ 2 - コンソール出力

PDFファイルから特定のページを読み取るにはどうすればよいですか?

長い文書のすべてのページを処理すると、関連する内容が含まれているページが限られている場合、時間とメモリの無駄になります。 IronOCRを使用すると、ページのゼロベースのインデックスを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
$vbLabelText   $csharpLabel

選択的なページ読み込みは、処理時間とメモリ消費量の両方を削減します。これは、数百ページに及ぶアーカイブを扱う際に、必要なデータがごく一部のページにしか含まれていない場合に特に重要です。 0から始まるインデックス規則は、標準的な.NETコレクションと一致します。ページインデックス0は、ドキュメントの最初のページです。

関連するページが事前にわからない文書の場合は、まずDPIを下げて文書全体を高速にスキャンしてページ番号を特定し、その後、特定したページのみを対象にフル設定で再度スキャンすることを検討してください。

IronOCR ページ選択ドキュメンテーション でページレベルのコントロール詳細を学べます。

ページの特定領域からデータを抽出するにはどうすればよいですか?

請求書処理、フォームのデジタル化、構造化文書の解析などでは、ページ全体をスキャンするのではなく、特定の領域からテキストを抽出することが頻繁に必要となる。 IronOCR はContentAreas パラメータを通じて範囲に特化したOCRをサポートしており、各ページのどの部分を分析するかを指定する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
$vbLabelText   $csharpLabel

Rectangle コンストラクタは4つの整数パラメータを取り、それぞれX座標、Y座標、幅、および高さを指定します。これらはすべて、レンダリングされたページの左上隅からのピクセル単位で測定されます。 ページ全体ではなく小さな領域を対象とすることで、OCR処理時間を短縮できるだけでなく、エンジンが周囲のノイズや無関係なテキストフィールドを拾ってしまう可能性も低減できます。

バッチ請求書処理のワークフローでは、数百枚の文書の同じフィールド位置から構造化データを抽出するために、範囲の抽出をresult.Pages の反復と組み合わせます。 各ページの結果は、それぞれのコンテンツ領域における認識されたテキストを個別に表示します。

IronOCR コンテンツエリアの例は、マルチリージョンシナリオのための追加の構成オプションを提供します。

入力

PDFをOCRする方法: C# .NET OCR PDFでスキャンされた文書からテキストを抽出: イメージ 3 - サンプル請求書

出力

PDFをOCRする方法: C# .NET OCR PDFでスキャンされた文書からテキストを抽出: イメージ 4 - 抽出データ出力

スキャンした文書の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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

画像フォーマット -- PNG、JPEG、TIFF、BMP、GIF、およびマルチページTIFF -- は、対応するLoadImage または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
$vbLabelText   $csharpLabel

同じページに複数の言語が混在する文書の場合、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
$vbLabelText   $csharpLabel

出力ファイルは、どの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
$vbLabelText   $csharpLabel

これは、配送ラベルの処理、在庫管理、およびスキャンされた文書にバーコードと印刷されたテキストが一緒に表示されるあらゆるワークフローにおいて特に役立ちます。 IronOCR バーコード読み取りガイドには、Code 128、QR コード、データマトリックス、PDF417 を含むサポートされているフォーマットがカバーされています。

IronOCRの入力タイプにはどのような違いがありますか?

IronOCRは、PDFファイルを読み込むための2つの主要な方法を提供しており、それぞれ異なるシナリオに適しています。

IronOCRのPDF入力方法の比較
アプローチ クラス 最適な用途 注意事項
一般的な入力 OcrInput.LoadPdf() ほとんどのユースケース すべての前処理フィルター、ページ選択、コンテンツ領域をサポートします
PDF固有の OcrPdfInput シンプルなシナリオ 利便性を重視したラッパー。設定オプションは少なめ。
画像ファイル OcrInput.LoadImage() PNG、JPEG、TIFF、BMP PDF入力と同じ前処理と領域ターゲティング
複数ページのTIFF OcrInput.LoadImageFrames() ファックスアーカイブ、スキャナー出力 各フレームを個別のページとして処理します

ほとんどのプロダクションシナリオにおいて、OcrInput.LoadPdf() が推奨されるアプローチです。なぜなら、完全な前処理と設定APIを公開するからです。 デフォルト設定が十分な場合や迅速なプロトタイピングに適したOcrPdfInput がうまく機能します。

次のステップは何ですか?

上記のコード例は、C# で記述されたIronOCRの PDF OCR における主要なワークフローを網羅しています。 次のステップに進むための簡単なチェックリストを以下に示します。

  • パッケージのインストール: dotnet add package IronOcr またはNuGetのIronOCRを検索 -基本的な例を実行します:完全なパイプラインロジックを構築する前に、サンプルPDFからのテキスト抽出を確認します。
  • 前処理の適用: スキャンした文書を扱う場合、DeskewDeNoise の呼び出しを追加し、代表サンプルでテスト 追加機能を探索: 検索可能 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 の特定のページのみを処理できますか?

はい。リストを渡しますLoadPdfのpageIndicesパラメータに、ゼロベースのページインデックスを指定します。指定されたページのみがレンダリングおよび処理されるため、処理時間とメモリ使用量が削減されます。

スキャンした 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のドキュメントには、環境固有のセットアップガイドが含まれています。

Kannaopat Udonpant
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、Kannapatは北海道大学で環境資源の博士号を修了しました。博士号を追求する間に、彼はバイオプロダクションエンジニアリング学科の一部である車両ロボティクスラボラトリーのメンバーになりました。2022年には、C#のスキルを活用してIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。Kannapatは、IronPDFの多くのコードを執筆している開発者から直接学んでいるため、この仕事を大切にしています。同僚から学びながら、Iron Softwareでの働く社会的側面も楽しんでいます。コードやドキュメントを書いていない時は、KannapatはPS5でゲームをしたり、『The Last of Us』を再視聴したりしていることが多いです。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね