フッターコンテンツにスキップ
他のコンポーネントと比較する

Acrobat DC OCRの代替案であるIronOCRの活用

Google Cloud Vision が画像から文字を読み取る前に、既に GCP プロジェクトを作成し、Vision API を有効化し、サービスアカウントを作成し、RSAプライベートキーを含むJSONキー ファイルをダウンロードし、コードを実行するすべてのサーバーで GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定し、18,000リクエスト毎分のデフォルトのクォータが切れた時にStatusCode.ResourceExhaustedを処理するための再試行ループを記述済みです。 その後、PDF を処理するには、2つ目の NuGet パッケージ (Google.Cloud.Storage.V1)、GCS バケット、非同期ポーリング ループ、JSON 出力の解析、およびクラウドストレージからオブジェクトを削除するためのクリーンアップ ステップが必要なことを発見します。 Google Cloud Visionには確かに強みがあります。機械学習を活用したモデルは、中国語、日本語、韓国語のテキストに対して高い精度を発揮します。しかし、実際に1つの本番文書を処理する前から、その運用範囲は相当なものです。

Google Cloud Visionを理解する

Google Cloud Visionは、Googleの機械学習インフラストラクチャを基盤とした、クラウド上でホストされる画像解析APIです。 OCRについては、DOCUMENT_TEXT_DETECTIONは段落、表、マルチカラムレイアウトを持つ密集した文書に最適化されています。 サービスはGoogle.Cloud.Vision.V1というNuGetパッケージを通して呼び出され、これはgRPCトランスポートレイヤをラップし、Protobuf生成されたレスポンス オブジェクトを返します。

主な建築上の特徴:

-クラウドのみでの処理:すべてのドキュメントはGoogleのインフラストラクチャに送信され、そこで処理されます。 オンプレミスモードはありません。 -サービスアカウント認証:認証には、RSA秘密鍵、クライアントのメールアドレス、およびプロジェクトIDを含むJSONキーファイルが必要です。 このファイルはすべてのホストに配置され、GOOGLE_APPLICATION_CREDENTIALS 環境変数または Google Application Default Credentials を介して参照される必要があります。

  • PDF には GCS と非同期処理が必要です。PDFドキュメントの処理は、直接 API 呼び出しではありません。 PDFはGoogle Cloud Storageにアップロードされ、AsyncBatchAnnotateFilesAsync経由で提出、完了までポーリングされ、JSON出力ファイルはGCSからダウンロードされ解析されます。
  • Protobufレスポンス階層: TextAnnotation Protobuf オブジェクトを返し、PagesBlocksParagraphsWordsSymbolsの階層構造を持っています。 段落テキストを抽出するには、4つのレベルを繰り返し処理し、個々の記号文字列を連結する必要があります。 -レート制限:デフォルトのクォータは1分あたり1,800リクエストです。 この閾値を超えるバッチ処理では、StatusCode.ResourceExhaustedレスポンスの再試行ロジックを実装する必要があります。
  • FedRAMPステータス: Google Cloud VisionはFedRAMP認証を受けていないため、Azure Computer Vision(FedRAMP High)またはAWS Textract(FedRAMP High)が利用可能な代替手段である連邦政府機関のユースケースには適していません。
  • 料金: 月毎に最初の1,000ユニットは無料ユニットで、以降DOCUMENT_TEXT_DETECTIONに対する1,000画像毎の料金; PDF非同期処理はページごとに課金されます。 Google Cloud Vision料金ページで現在の料金を確認してください。

サービスアカウント認証情報の設定

google-vision-vs-ironocr-examples.csからの次のコードはクライアントの初期化パターンを例示しています。 インスタンスの行が隠している前提条件は、GOOGLE_APPLICATION_CREDENTIALS環境変数が現在のマシン上で有効なサービスアカウント JSON キーファイルを既に指し示していることです。

using Google.Cloud.Vision.V1;

public class GoogleVisionService
{
    private readonly ImageAnnotatorClient _client;

    public GoogleVisionService()
    {
        // Requires GOOGLE_APPLICATION_CREDENTIALS env var
        // pointing to a service account JSON key file
        _client = ImageAnnotatorClient.Create();
    }

    public string DetectText(string imagePath)
    {
        // WARNING: Image uploaded to Google Cloud
        var image = Image.FromFile(imagePath);
        var response = _client.DetectText(image);

        if (response.Count > 0)
        {
            return response[0].Description;
        }

        return string.Empty;
    }
}
using Google.Cloud.Vision.V1;

public class GoogleVisionService
{
    private readonly ImageAnnotatorClient _client;

    public GoogleVisionService()
    {
        // Requires GOOGLE_APPLICATION_CREDENTIALS env var
        // pointing to a service account JSON key file
        _client = ImageAnnotatorClient.Create();
    }

    public string DetectText(string imagePath)
    {
        // WARNING: Image uploaded to Google Cloud
        var image = Image.FromFile(imagePath);
        var response = _client.DetectText(image);

        if (response.Count > 0)
        {
            return response[0].Description;
        }

        return string.Empty;
    }
}
Imports Google.Cloud.Vision.V1

Public Class GoogleVisionService
    Private ReadOnly _client As ImageAnnotatorClient

    Public Sub New()
        ' Requires GOOGLE_APPLICATION_CREDENTIALS env var
        ' pointing to a service account JSON key file
        _client = ImageAnnotatorClient.Create()
    End Sub

    Public Function DetectText(imagePath As String) As String
        ' WARNING: Image uploaded to Google Cloud
        Dim image = Image.FromFile(imagePath)
        Dim response = _client.DetectText(image)

        If response.Count > 0 Then
            Return response(0).Description
        End If

        Return String.Empty
    End Function
End Class
$vbLabelText   $csharpLabel

JSONキーファイルには、RSA秘密鍵、クライアントのメールアドレス、およびプロジェクト識別子が含まれています。 ソース管理にコミットしてはならず、Dockerイメージから除外され、定期的にローテーションされ、適切なファイルシステム権限で保護されなければならない。 侵害されたキーは、GCPコンソールで手動で取り消されるまで、APIへのアクセスを許可します。

IronOCRを理解する

IronOCRは、最適化されたTesseract 5エンジンをベースに構築された、 .NET向けの商用オンプレミスOCRライブラリです。すべてのドキュメントをローカルで処理するため、クラウドへのデータ転送、インターネット接続、サードパーティによるデータ処理は一切不要です。 一つのNuGetパッケージインストール (IronOcr) がすべてを提供します: OCRエンジン、自動前処理フィルター、ネイティブPDFサポート、および個別NuGetパッケージとして利用可能な125以上の言語パック。

主な特徴:

-オンプレミス処理:ドキュメントはお客様のインフラストラクチャから外部に持ち出されることはありません。 外部接続のないエアギャップ環境、機密ネットワーク、およびDockerコンテナ内で動作します。 -単一のNuGetデプロイメント: tessdata フォルダーがなく、ネイティブ ライブラリ管理がなく、ライセンス キー文字列以外の環境変数は必要ありません。 -自動前処理:デスクウ、ノイズ除去、コントラスト、バイナリ化、解像度向上フィルターは、低品質の入力に対して自動的に適用され、個別に明示的に制御することも可能です。

  • ネイティブPDF入力: PDFはinput.LoadPdf()を介して直接読み込まれ、同期処理されます。 パスワードで保護されたPDFには、1つのパラメータが必要です。
  • 構造化されたOcrResult: 結果はBarcodesとして型付き.NETオブジェクトとして公開されます - Protobufのデシリアライズなし、シンボルの連結なし。
  • スレッドセーフ: IronTesseractのインスタンスは並行使用に安全です。 バッチワークロードは追加の同期化なしでParallel.ForEachを使用できます。
  • 永続ライセンス: $999 Lite、$1,499 Plus、$2,999 Professional、$5,999 Unlimited - 1度の購入で取引コストなし。

機能比較

フィーチャー グーグル・クラウド・ビジョン IronOCR
処理モデル クラウドのみ 店内利用のみ
PDF処理 GCS + async API経由 直接的、同期的
認証 サービスアカウントのJSONキー ライセンスキー文字列
FedRAMP認証 許可されていません 該当なし(オンプレミス)
文書ごとの費用 ページごと ( Google Cloud Vision料金 を参照) None
オフライン/エアギャップ なし はい

詳細な機能比較

カテゴリ フィーチャー グーグル・クラウド・ビジョン IronOCR
入力 画像OCR はい はい
PDF OCR GCS経由 + 非同期処理 (50行以上) input.LoadPdf()(3行)
パスワードで保護されたPDF サポートされていません LoadPdf(path, Password: "...")
ストリーム入力 はい はい
URL入力 なし input.LoadImageFromUrl()
TIFF / GIF マルチフレーム 制限的 はい
認証 認証情報の種類 JSONキーファイル+環境変数 ライセンスキー文字列
資格ローテーション 必須(手動) 不要
CI/CD シークレットが必要です はい(キーファイル) はい(ライセンス文字列のみ)
処理 オフライン/エアギャップ なし はい
同期処理 画像のみ 画像とPDF
レート制限 デフォルト:1,800リクエスト/分 なし(CPUバウンド)
前処理(自動) なし(機械学習ベース) デスクウ、ノイズ除去、コントラスト調整、二値化、解像度向上
出力 プレーンテキスト はい はい
構造化された結果(型付き) Protobuf階層構造 OcrResult(.NETオブジェクト)
信頼度スコア シンボル/単語ごと 単語ごとおよび全体
検索可能なPDF出力 なし result.SaveAsSearchablePdf()
バーコード読み取り 別個のAPI機能 ocr.Configuration.ReadBarCodes = true
地域ベースのOCR 原産地作物なし 入力に対するCropRectangle
言語 言語数 約50 NuGetパック経由で125個以上
CJK精度 強力な(機械学習による裏付け) 良好(Tesseract 5 LSTM)
コンプライアンス FedRAMP 許可されていません 該当なし(オンプレミス)
HIPAA / ITAR BAA + 複合レビュー 第三者による取り扱いは行いません
GDPR第28条 DPAが必要 該当なし(地域別)
費用 価格設定モデル 現在の料金はGoogleにお問い合わせください 永続的 ($5,999)

認証の複雑性と資格情報管理

Google Cloud Visionで最も過小評価されているコストは、画像ごとの料金ではありません。 これは、アプリケーションが実行されるすべての環境において、サービスアカウントの認証情報を管理する際に発生する運用上のオーバーヘッドです。

Google Cloud Visionのアプローチ

クライアントの初期化は1行のように見えますが、その行は、7つの前提条件が揃っていない場合、StatusCode.PermissionDeniedをスローします。 google-cloud-vision-migration-examples.csから、資格情報設定が全体のストーリーを語っています:

public GoogleVisionCredentialSetup()
{
    // BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
    // pointing to a service account JSON key file:
    // export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
    //
    // The JSON file contains sensitive data:
    // - private_key: RSA private key
    // - client_email: service account email
    // - project_id: GCP project identifier
    //
    // Security concerns:
    // - Key file must never be committed to source control
    // - Key file must be rotated periodically
    // - Key file must be protected with file system permissions
    // - Key file compromise grants API access until revoked

    _client = ImageAnnotatorClient.Create();
}
public GoogleVisionCredentialSetup()
{
    // BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
    // pointing to a service account JSON key file:
    // export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
    //
    // The JSON file contains sensitive data:
    // - private_key: RSA private key
    // - client_email: service account email
    // - project_id: GCP project identifier
    //
    // Security concerns:
    // - Key file must never be committed to source control
    // - Key file must be rotated periodically
    // - Key file must be protected with file system permissions
    // - Key file compromise grants API access until revoked

    _client = ImageAnnotatorClient.Create();
}
Public Sub New()
    ' BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
    ' pointing to a service account JSON key file:
    ' export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
    '
    ' The JSON file contains sensitive data:
    ' - private_key: RSA private key
    ' - client_email: service account email
    ' - project_id: GCP project identifier
    '
    ' Security concerns:
    ' - Key file must never be committed to source control
    ' - Key file must be rotated periodically
    ' - Key file must be protected with file system permissions
    ' - Key file compromise grants API access until revoked

    _client = ImageAnnotatorClient.Create()
End Sub
$vbLabelText   $csharpLabel

Dockerベースのデプロイメントでは、JSONキーファイルをシークレットボリュームとしてマウントするか、Kubernetesシークレットを介して注入する必要があります。 複数リージョン構成の場合、各リージョンで同じ認証情報設定が必要です。 キーローテーションは手動プロセスであり、すべてのデプロイメントを同時に更新するか、古いキーと新しいキーの両方が有効な期間を受け入れる必要があります。 エラーハンドリング層は比例して増大します - プロダクションコードはStatusCode.DeadlineExceededの異なるキャッチブロックを必要とします。

IronOCRのアプローチ

IronOCRの設定はライセンスキー文字列で行います。 デプロイするファイルはなく、キー自体以外の環境変数もなく、ローテーションスケジュールもありません。

public IronOcrCredentialSetup()
{
    // Simple license key - no key files, no environment variables required
    IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
        ?? "YOUR-LICENSE-KEY";

    // なし service accounts, no key rotation, no IAM configuration
    _ocr = new IronTesseract();
}
public IronOcrCredentialSetup()
{
    // Simple license key - no key files, no environment variables required
    IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
        ?? "YOUR-LICENSE-KEY";

    // なし service accounts, no key rotation, no IAM configuration
    _ocr = new IronTesseract();
}
Public Sub New()
    ' Simple license key - no key files, no environment variables required
    IronOcr.License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONOCR_LICENSE"), "YOUR-LICENSE-KEY")

    ' なし service accounts, no key rotation, no IAM configuration
    _ocr = New IronTesseract()
End Sub
$vbLabelText   $csharpLabel

CI/CDでは、ライセンスキーは単一のパイプラインシークレットです。 Dockerでは、それは単一の環境変数です。 マウントするJSONファイルも、割り当てるIAMロールも、操作するGCPコンソールもありません。 開発者がチームに参加すると、1つの文字列を受け取ります。 認証関連のエラーで考えられる原因は、鍵が無効であるか、試用期間が終了しているかのいずれかです。

PDF処理:GCSパイプラインと直接ロードの比較

PDF処理は、両図書館間の運用上のギャップが明確になる部分である。 Google Cloud Visionは、PDFファイルを直接API入力として受け付けません。ファイルはGoogle Cloud Storageを経由して転送される必要があります。

Google Cloud Visionのアプローチ

DownloadAndParseResultsAsync実装前に40行を超えます - それ自体がGCS出力URIの解析、結果オブジェクトのリストアップ、JSONファイルのダウンロード、ページ間のテキストの連結を要求します。

public async Task<string> ProcessPdfAsync(string pdfPath)
{
    // Step 1: Create storage client
    var storageClient = StorageClient.Create();
    var objectName = $"ocr-input/{Guid.NewGuid()}.pdf";

    // Step 2: Upload PDF to GCS (document leaves your infrastructure)
    using (var stream = File.OpenRead(pdfPath))
    {
        await storageClient.UploadObjectAsync(
            _bucketName, objectName, "application/pdf", stream);
    }

    // Step 3: Build async annotation request
    var asyncRequest = new AsyncAnnotateFileRequest
    {
        InputConfig = new InputConfig
        {
            GcsSource = new GcsSource { Uri = $"gs://{_bucketName}/{objectName}" },
            MimeType = "application/pdf"
        },
        Features = { new フィーチャー { Type = Feature.Types.Type.DocumentTextDetection } },
        OutputConfig = new OutputConfig
        {
            GcsDestination = new GcsDestination { Uri = $"gs://{_bucketName}/ocr-output/" },
            BatchSize = 1
        }
    };

    // Step 4: Submit and wait for async operation
    var operation = await _visionClient.AsyncBatchAnnotateFilesAsync(
        new[] { asyncRequest });
    var completedOperation = await operation.PollUntilCompletedAsync();

    // Step 5: Download and parse results from GCS output
    var outputUri = completedOperation.Result.Responses[0]
        .OutputConfig.GcsDestination.Uri;
    var text = await DownloadAndParseResultsAsync(storageClient, outputUri);

    // Step 6: Clean up input file from GCS
    await storageClient.DeleteObjectAsync(_bucketName, objectName);

    return text;
}
public async Task<string> ProcessPdfAsync(string pdfPath)
{
    // Step 1: Create storage client
    var storageClient = StorageClient.Create();
    var objectName = $"ocr-input/{Guid.NewGuid()}.pdf";

    // Step 2: Upload PDF to GCS (document leaves your infrastructure)
    using (var stream = File.OpenRead(pdfPath))
    {
        await storageClient.UploadObjectAsync(
            _bucketName, objectName, "application/pdf", stream);
    }

    // Step 3: Build async annotation request
    var asyncRequest = new AsyncAnnotateFileRequest
    {
        InputConfig = new InputConfig
        {
            GcsSource = new GcsSource { Uri = $"gs://{_bucketName}/{objectName}" },
            MimeType = "application/pdf"
        },
        Features = { new フィーチャー { Type = Feature.Types.Type.DocumentTextDetection } },
        OutputConfig = new OutputConfig
        {
            GcsDestination = new GcsDestination { Uri = $"gs://{_bucketName}/ocr-output/" },
            BatchSize = 1
        }
    };

    // Step 4: Submit and wait for async operation
    var operation = await _visionClient.AsyncBatchAnnotateFilesAsync(
        new[] { asyncRequest });
    var completedOperation = await operation.PollUntilCompletedAsync();

    // Step 5: Download and parse results from GCS output
    var outputUri = completedOperation.Result.Responses[0]
        .OutputConfig.GcsDestination.Uri;
    var text = await DownloadAndParseResultsAsync(storageClient, outputUri);

    // Step 6: Clean up input file from GCS
    await storageClient.DeleteObjectAsync(_bucketName, objectName);

    return text;
}
Imports System
Imports System.IO
Imports System.Threading.Tasks

Public Class PdfProcessor
    Private _bucketName As String
    Private _visionClient As VisionClient

    Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of String)
        ' Step 1: Create storage client
        Dim storageClient = StorageClient.Create()
        Dim objectName = $"ocr-input/{Guid.NewGuid()}.pdf"

        ' Step 2: Upload PDF to GCS (document leaves your infrastructure)
        Using stream = File.OpenRead(pdfPath)
            Await storageClient.UploadObjectAsync(_bucketName, objectName, "application/pdf", stream)
        End Using

        ' Step 3: Build async annotation request
        Dim asyncRequest = New AsyncAnnotateFileRequest With {
            .InputConfig = New InputConfig With {
                .GcsSource = New GcsSource With {.Uri = $"gs://{_bucketName}/{objectName}"},
                .MimeType = "application/pdf"
            },
            .Features = {New Feature With {.Type = Feature.Types.Type.DocumentTextDetection}},
            .OutputConfig = New OutputConfig With {
                .GcsDestination = New GcsDestination With {.Uri = $"gs://{_bucketName}/ocr-output/"},
                .BatchSize = 1
            }
        }

        ' Step 4: Submit and wait for async operation
        Dim operation = Await _visionClient.AsyncBatchAnnotateFilesAsync({asyncRequest})
        Dim completedOperation = Await operation.PollUntilCompletedAsync()

        ' Step 5: Download and parse results from GCS output
        Dim outputUri = completedOperation.Result.Responses(0).OutputConfig.GcsDestination.Uri
        Dim text = Await DownloadAndParseResultsAsync(storageClient, outputUri)

        ' Step 6: Clean up input file from GCS
        Await storageClient.DeleteObjectAsync(_bucketName, objectName)

        Return text
    End Function

    Private Async Function DownloadAndParseResultsAsync(storageClient As StorageClient, outputUri As String) As Task(Of String)
        ' Implementation for downloading and parsing results
        Return String.Empty
    End Function
End Class

Public Class StorageClient
    Public Shared Function Create() As StorageClient
        Return New StorageClient()
    End Function

    Public Async Function UploadObjectAsync(bucketName As String, objectName As String, mimeType As String, stream As Stream) As Task
        ' Implementation for uploading object
    End Function

    Public Async Function DeleteObjectAsync(bucketName As String, objectName As String) As Task
        ' Implementation for deleting object
    End Function
End Class

Public Class VisionClient
    Public Async Function AsyncBatchAnnotateFilesAsync(requests As AsyncAnnotateFileRequest()) As Task(Of Operation)
        ' Implementation for async batch annotate files
        Return New Operation()
    End Function
End Class

Public Class Operation
    Public Async Function PollUntilCompletedAsync() As Task(Of OperationResult)
        ' Implementation for polling until completed
        Return New OperationResult()
    End Function
End Class

Public Class OperationResult
    Public Property Responses As Response()
End Class

Public Class Response
    Public Property OutputConfig As OutputConfig
End Class

Public Class AsyncAnnotateFileRequest
    Public Property InputConfig As InputConfig
    Public Property Features As List(Of Feature)
    Public Property OutputConfig As OutputConfig
End Class

Public Class InputConfig
    Public Property GcsSource As GcsSource
    Public Property MimeType As String
End Class

Public Class GcsSource
    Public Property Uri As String
End Class

Public Class Feature
    Public Class Types
        Public Enum Type
            DocumentTextDetection
        End Enum
    End Class

    Public Property Type As Types.Type
End Class

Public Class OutputConfig
    Public Property GcsDestination As GcsDestination
    Public Property BatchSize As Integer
End Class

Public Class GcsDestination
    Public Property Uri As String
End Class
$vbLabelText   $csharpLabel

これは最低限の動作要件を満たす実装であり、本番環境での運用に耐えうるものではありません。 本番コードでは、GCSへのアップロード失敗時の再試行ロジック、低速な非同期操作のタイムアウト処理、出力オブジェクト(入力オブジェクトだけでなく)のクリーンアップ、操作が途中で失敗した場合のエラー処理、および中間状態のログ記録が追加されています。 パスワードで保護されたPDFファイルは、複雑さのレベルに関わらずサポートされていません。

IronOCRのアプローチ

IronOCRのPDFサポートは、ファイルを直接読み込み、同期的に処理します。

public string ProcessPdf(string pdfPath)
{
    // DirectPDF処理- no GCS, no async, no cleanup
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return _ocr.Read(input).Text;
}

public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
    // Process specific page range
    using var input = new OcrInput();
    input.LoadPdfPages(pdfPath, startPage, endPage);
    return _ocr.Read(input).Text;
}

public string ProcessEncryptedPdf(string pdfPath, string password)
{
    // Password-protected PDFs - not possible with Google Cloud Vision
    using var input = new OcrInput();
    input.LoadPdf(pdfPath, Password: password);
    return _ocr.Read(input).Text;
}
public string ProcessPdf(string pdfPath)
{
    // DirectPDF処理- no GCS, no async, no cleanup
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return _ocr.Read(input).Text;
}

public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
    // Process specific page range
    using var input = new OcrInput();
    input.LoadPdfPages(pdfPath, startPage, endPage);
    return _ocr.Read(input).Text;
}

public string ProcessEncryptedPdf(string pdfPath, string password)
{
    // Password-protected PDFs - not possible with Google Cloud Vision
    using var input = new OcrInput();
    input.LoadPdf(pdfPath, Password: password);
    return _ocr.Read(input).Text;
}
Imports System

Public Class PdfProcessor
    Public Function ProcessPdf(pdfPath As String) As String
        ' DirectPDF処理- no GCS, no async, no cleanup
        Using input As New OcrInput()
            input.LoadPdf(pdfPath)
            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ProcessPdfPages(pdfPath As String, startPage As Integer, endPage As Integer) As String
        ' Process specific page range
        Using input As New OcrInput()
            input.LoadPdfPages(pdfPath, startPage, endPage)
            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ProcessEncryptedPdf(pdfPath As String, password As String) As String
        ' Password-protected PDFs - not possible with Google Cloud Vision
        Using input As New OcrInput()
            input.LoadPdf(pdfPath, Password:=password)
            Return _ocr.Read(input).Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

2つ目のNuGetパッケージはありません。 プロビジョニングやメンテナンスが必要なGCSバケットはありません。 クリーンアップ手順は不要です。非同期ステートマシンも不要です。パスワード保護版では、パラメータが1つだけ追加されます。 スキャンされた入力から検索可能なPDFを生成する必要があるチーム向けに、result.SaveAsSearchablePdf("output.pdf")検索可能PDF出力を追加1行で処理します -グーグル・クラウド・ビジョンがあらゆるAPIの複雑さレベルで提供しない機能です。

Protobufレスポンスの解析とプレーンOCRResultの比較

DOCUMENT_TEXT_DETECTION呼び出しから構造化データを取得するには、Protobufレスポンス階層をナビゲートする必要があります。 API呼び出しから段落テキストに至るまでのプロセスは、5段階のネストされた反復処理を経る。

Google Cloud Visionのアプローチ

密度の高い文書から段落テキストを抽出するには、ページ、ブロック、段落を順にたどり、各単語からシンボルを連結する必要があります。これは、Protobufの設計ではテキストが単語レベルや段落レベルではなく、シンボルレベルで格納されるためです。

public DocumentStructure ExtractDocumentStructure(string imagePath)
{
    var image = Image.FromFile(imagePath);
    var annotation = _client.DetectDocumentText(image);

    var structure = new DocumentStructure
    {
        FullText = annotation.Text,
        Pages = new List<PageInfo>()
    };

    // Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
    foreach (var page in annotation.Pages)
    {
        var pageInfo = new PageInfo
        {
            Confidence = page.Confidence,
            Paragraphs = new List<ParagraphInfo>()
        };

        foreach (var block in page.Blocks)
        {
            foreach (var paragraph in block.Paragraphs)
            {
                // Must concatenate symbols to get paragraph text
                var text = string.Join("", paragraph.Words
                    .SelectMany(w => w.Symbols)
                    .Select(s => s.Text));

                pageInfo.Paragraphs.Add(new ParagraphInfo
                {
                    Text = text,
                    Confidence = paragraph.Confidence
                });
            }
        }
        structure.Pages.Add(pageInfo);
    }

    return structure;
}
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
    var image = Image.FromFile(imagePath);
    var annotation = _client.DetectDocumentText(image);

    var structure = new DocumentStructure
    {
        FullText = annotation.Text,
        Pages = new List<PageInfo>()
    };

    // Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
    foreach (var page in annotation.Pages)
    {
        var pageInfo = new PageInfo
        {
            Confidence = page.Confidence,
            Paragraphs = new List<ParagraphInfo>()
        };

        foreach (var block in page.Blocks)
        {
            foreach (var paragraph in block.Paragraphs)
            {
                // Must concatenate symbols to get paragraph text
                var text = string.Join("", paragraph.Words
                    .SelectMany(w => w.Symbols)
                    .Select(s => s.Text));

                pageInfo.Paragraphs.Add(new ParagraphInfo
                {
                    Text = text,
                    Confidence = paragraph.Confidence
                });
            }
        }
        structure.Pages.Add(pageInfo);
    }

    return structure;
}
Imports System.Drawing

Public Function ExtractDocumentStructure(imagePath As String) As DocumentStructure
    Dim image = Image.FromFile(imagePath)
    Dim annotation = _client.DetectDocumentText(image)

    Dim structure As New DocumentStructure With {
        .FullText = annotation.Text,
        .Pages = New List(Of PageInfo)()
    }

    ' Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
    For Each page In annotation.Pages
        Dim pageInfo As New PageInfo With {
            .Confidence = page.Confidence,
            .Paragraphs = New List(Of ParagraphInfo)()
        }

        For Each block In page.Blocks
            For Each paragraph In block.Paragraphs
                ' Must concatenate symbols to get paragraph text
                Dim text = String.Join("", paragraph.Words _
                    .SelectMany(Function(w) w.Symbols) _
                    .Select(Function(s) s.Text))

                pageInfo.Paragraphs.Add(New ParagraphInfo With {
                    .Text = text,
                    .Confidence = paragraph.Confidence
                })
            Next
        Next
        structure.Pages.Add(pageInfo)
    Next

    Return structure
End Function
$vbLabelText   $csharpLabel

シンボルレベルの連結は任意ではありません - paragraph.TextはProtobufレスポンスに直接的なプロパティとして存在しません。 このAPIを使用するすべてのチームは、同じネストループ集約の独自のバリエーションを作成します。 単語レベルの信頼性にはword.Confidence値にアクセスするための6段階目の反復が必要で、シンボル連結の結果にそれらを戻します。

IronOCRのアプローチ

IronOCRのOcrResultはフラットで型付きのAPIを公開しています。 Heightを使用する準備が整った直感的なプロパティです。

public DocumentStructure ExtractDocumentStructure(string imagePath)
{
    var result = _ocr.Read(imagePath);

    // Direct access - no symbol concatenation, no nested loops
    return new DocumentStructure
    {
        FullText = result.Text,
        Confidence = result.Confidence,
        Paragraphs = result.Paragraphs.Select(p => new ParagraphInfo
        {
            Text = p.Text,
            Confidence = p.Confidence
        }).ToList(),
        Lines = result.Lines.Select(l => new LineInfo
        {
            Text = l.Text,
            X = l.X,
            Y = l.Y
        }).ToList()
    };
}
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
    var result = _ocr.Read(imagePath);

    // Direct access - no symbol concatenation, no nested loops
    return new DocumentStructure
    {
        FullText = result.Text,
        Confidence = result.Confidence,
        Paragraphs = result.Paragraphs.Select(p => new ParagraphInfo
        {
            Text = p.Text,
            Confidence = p.Confidence
        }).ToList(),
        Lines = result.Lines.Select(l => new LineInfo
        {
            Text = l.Text,
            X = l.X,
            Y = l.Y
        }).ToList()
    };
}
Public Function ExtractDocumentStructure(imagePath As String) As DocumentStructure
    Dim result = _ocr.Read(imagePath)

    ' Direct access - no symbol concatenation, no nested loops
    Return New DocumentStructure With {
        .FullText = result.Text,
        .Confidence = result.Confidence,
        .Paragraphs = result.Paragraphs.Select(Function(p) New ParagraphInfo With {
            .Text = p.Text,
            .Confidence = p.Confidence
        }).ToList(),
        .Lines = result.Lines.Select(Function(l) New LineInfo With {
            .Text = l.Text,
            .X = l.X,
            .Y = l.Y
        }).ToList()
    }
End Function
$vbLabelText   $csharpLabel

読み取り結果ガイドでは、構造化データAPIの全機能を網羅しています。 単語レベルの位置と信頼度のスコアは、result.Words[i].Confidenceで利用可能で、中間階層にナビゲートする必要はありません。 地域に基づくOCRCropRectangleOcrInputに適用し、ヘッダー行または特定のフィールドだけが必要な場合には全画像を処理しないようにします。

コストモデル:画像ごとの課金 vs. 永久ライセンス

コスト比較は、数量と期間に大きく左右される。

Google Cloud Visionのアプローチ

Google Cloud Vision の料金は使用量に基づいており、機能の種類やボリュームによって異なります。 Google Cloud Vision料金ページで現在の料金を確認してください。 総コストには、PDFワークフローにおけるGCSストレージや操作料金、ネットワークの出口コスト、認証管理とキーのローテーションにかかるエンジニアリング時間も含まれる可能性があります。

ドキュメントのボリュームが高い場合、画像ごとの料金は著しく増加し、ボリュームとともに線形的にコストが増加し、確約利用契約を交渉しない限り上限はありません。

IronOCRのアプローチ

IronOCRの価格は一度きりで、永続的な購入です: $999 Lite (1 開発者)、$1,499 Plus (3 開発者)、$2,999 Professional (10 開発者)、$5,999 Unlimited。 このライセンスは、無制限の文書処理をカバーし、処理量に制限はありません。 2年目は費用無料です。 3年目は費用無料です。 ドキュメントのボリュームが高い場合、IronOCR の永続ライセンスは、画像ごとのクラウド料金よりも迅速に費用効果が高くなります。 IronOCR ライセンシングページで現在のティアの詳細を確認してください。

IronOCR がグーグル・クラウド・ビジョンよりも安価になる交差点は、ボリュームと Google の現在の価格によって決まります。 生産現場で一貫してドキュメントを処理しているほとんどのチームにとって、IronOCR の永続ライセンスは最初の数か月間の使用で投資回収できます。

APIマッピングリファレンス

グーグル・クラウド・ビジョン IronOCR ノート
ImageAnnotatorClient.Create() new IronTesseract() クライアントの初期化
_client.DetectText(image) _ocr.Read(imagePath).Text 基本的なテキスト抽出
_client.DetectDocumentText(image) _ocr.Read(imagePath) 高密度文書OCR
AsyncBatchAnnotateFilesAsync() input.LoadPdf(); _ocr.Read(input) PDF処理
StorageClient.Create() 不要 IronOCRではGCSは不要です
storageClient.UploadObjectAsync() 不要 PDFは直接読み込まれます
operation.PollUntilCompletedAsync() 不要 処理は同期的に行われます
TextAnnotation OcrResult 結果コンテナ
annotation.Text result.Text 文書全文
annotation.Pages[i] result.Pages[i] ページごとのアクセス
page.Blocks[i].Paragraphs[j] result.Paragraphs[i] 段落アクセス
paragraph.Words.SelectMany(w => w.Symbols).Select(s => s.Text) paragraph.Text 直接テキストプロパティ
word.Confidence word.Confidence 単語ごとの信頼度
page.Confidence result.Confidence 全体的な自信
Feature.Types.Type.DocumentTextDetection 自動翻訳 IronOCRがモードを自動選択
Image.FromFile(path) _ocr.Read(path) または input.LoadImage(path) 画像読み込み中
response[0].Description result.Text 全文抽出
annotation.BoundingPoly.Vertices word.X, word.Y, word.Width, word.Height 境界座標
RpcException (StatusCode.ResourceExhausted) 該当なし 地域によってはレート制限はありません
RpcException (StatusCode.PermissionDenied) 該当なし 実行時に認証なし

チームがGoogle Cloud VisionからIronOCRへの移行を検討する際

コンプライアンス要件 ブロッククラウド処理

最も一般的な移行のきっかけはコストではなく、コンプライアンス監査である。 政府請負業者はITAR(国際武器取引規則)の規制に直面し、管理対象の技術データをGoogle Cloudに送信することが禁止されていることを知る。 医療機関が文書処理パイプラインを構築する際、HIPAAセキュリティ責任者がすべてのデータ処理業者に対して事業提携契約(BAA)のレビューを要求し、Googleのクラウドインフラストラクチャの範囲評価が彼らのリスク許容度を超えていることに気づく。 機密性の高い顧客文書を処理する法務部門は、弁護士・依頼者間の秘匿特権に関する懸念が、クラウド処理の利便性よりも重要であると判断する。 防衛関連企業は、組織の境界外に流出したデータをすべて問題視するCMMC(コンピュータ化保守認証)の要件に抵触している。 これらのシナリオすべてにおいて、Googleの機械学習モデルの技術的な品質は関係なく、アーキテクチャそのものが不適格となる要因となる。 IronOCRのオンプレミスモデルでは、処理に第三者が関与しないため、第三者データ処理業者に関するコンプライアンス要件全体が不要になります。

PDFワークフローは規模が大きくなると管理不能になる

画像OCRにGoogle Cloud Visionを使い始めたチームは、スコープを拡張する必要が生じた際に、PDFの複雑さに気づくことが多い。 GCSの非同期パイプラインを使って1日に200個のPDFを処理することは可能だが、非常に手間がかかる。 1日に1万個のPDFを処理するには、パイプライン全体を強化する必要があります。具体的には、GCSへのアップロード失敗に対する再試行ロジック、完了しない操作のためのデッドレターキュー、パイプラインの途中でアプリケーションがクラッシュした場合に孤立したGCSオブジェクトをクリーンアップするジョブ、そしてVision APIのコストとGCSストレージコストの両方を監視する必要があります。 この規模に達したチームは、 IronOCRへの移行が非常に簡単であることを一貫して実感しています。非同期のGCSパイプライン全体が、ローカルファイルの直接読み込みとそれに続く単一の読み取り呼び出しに集約され、障害モードもネットワークタイムアウト、認証失敗、GCSクォータエラー、JSON解析例外から、ローカルファイルのI/O例外のみに縮小します。

予算の予測可能性は、画像ごとの柔軟性よりも重要である

初期段階のプロジェクトでは、無料利用枠で初期開発コストを賄えること、また処理が行われていないときは画像ごとの料金モデルがゼロになるため、Google Cloud Visionが選ばれることが多い。 製品の生産量が安定的に推移するようになると(通常は月間5万件以上の文書)、財務チームはその定期的な項目に気づく。 ビジネスの成長に合わせて拡張するSaaSサブスクリプションとは異なり、IronOCRの永久ライセンスは、OCRを変動的な運営費用から固定的な設備投資へと転換します。 規制産業で文書を処理する10開発者チームにとって、$2,999の一度限りのProfessionalライセンスは、進行中の1画像毎クラウド価格に比べて、通常、最初の生産ボリューム四半期以内に正当化されます。

バッチ処理がレート制限に達しました

文書処理量の多いワークフロー(法的証拠開示、財務文書のデジタル化、保険金請求処理など)では、日常的に1時間に数千もの文書を処理する必要がある。 Google Cloud Visionのデフォルトのクォータは1分あたり1,800リクエストであるため、3,000件のドキュメントが一斉に送信されるとレート制限が作動し、GCPコンソール経由でクォータ増加をリクエストするか(Googleの承認を待つ必要があります)、ジッター付き指数バックオフを実装する必要があります。 割り当て量を一度でも超過すると、処理パイプライン全体が停止し、再試行前に必ず60秒間待機することになります。 IronOCRのローカル処理は利用可能なCPUコア数のみに制限され、並列処理では外部の承認を必要とせずにすべてのCPUコアが使用されます。

エアギャップ展開が必要

一部の環境では、設計上、外部へのインターネット接続が一切ありません。例えば、機密扱いの軍事ネットワーク、産業制御システム、金融決済のためのセキュアなデータセンターなどが挙げられます。 Google Cloud Visionは、どのようなレベルのアーキテクチャ設計においても、これらの環境では機能しません。APIはGoogleのエンドポイントへのインターネット接続を必要とするためです。 IronOCRのDockerデプロイメントは、外部接続なしで動作します。 ライセンスキーは初回使用時に検証され、キャッシュされます。 以降の利用にはネットワークアクセスは不要です。

一般的な移行の考慮事項

GCSへの依存関係の削除

移行時に最も大きな構造的変更となるのは、GCSパイプラインを完全に廃止することです。 Googleパッケージを削除する前に、OCRの入出力用に作成されたすべてのGCSバケットを記録し、継続的なストレージ料金が発生しないようにそれらをクリーンアップしてください。 すべてのデプロイメント構成、CI/CDシークレット、および開発者マシンから GOOGLE_APPLICATION_CREDENTIALS 環境変数とJSONキーファイルを削除する必要があります。 GCPコンソールのIAMサービスアカウントは、他のサービスがそれに依存していないことを確認した後、無効化または削除できます。

Readコールに減少します。 エラー処理に関する契約が変更されます。ネットワーク例外、認証例外、レート制限例外はすべてなくなります。 残りの例外はファイルI/Oの例外(ファイルが見つからない、ファイルがロックされている)とOcrExceptionで、処理の失敗に対して生じます。 IronOCRの画像入力ガイドPDF入力ガイドでは、ストリーム、バイト配列、URL読み込みなど、入力APIの全範囲を網羅しています。

Protobufシンボル連結による直接テキストアクセス

Protobuf階層から段落や単語のテキストを抽出するために書いたコードベースのあらゆる場所は、直接的なプロパティアクセスになります。 IronOCRの結果オブジェクトには、word.Textが型付けされた文字列プロパティとして存在します。 構造化データ抽出コードをすべて見直し、中間集計ロジックを削除してください。 結果読み取りハウツーガイドは、OcrResult.Wordに利用可能なすべてのプロパティをマップしています。

PDFワークフローにおける非同期から同期への移行

Google Cloud VisionのPDF処理は、GCSを経由する往復処理が必要なため、非同期処理のみに対応しています。 IronOCRのReadメソッドは同期処理です。 アプリケーションのPDF処理レイヤーがTask.Runラッパーです。

public async Task<string> ProcessPdfAsync(string pdfPath)
{
    return await Task.Run(() =>
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);
        return _ocr.Read(input).Text;
    });
}
public async Task<string> ProcessPdfAsync(string pdfPath)
{
    return await Task.Run(() =>
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);
        return _ocr.Read(input).Text;
    });
}
Imports System.Threading.Tasks

Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of String)
    Return Await Task.Run(Function()
                              Using input As New OcrInput()
                                  input.LoadPdf(pdfPath)
                                  Return _ocr.Read(input).Text
                              End Using
                          End Function)
End Function
$vbLabelText   $csharpLabel

これにより、スレッドプール上でOCR処理を実行しながら、呼び出し元に対して非同期インターフェースが維持されます。 高スループットシナリオにおいて、IronOCRのビルトイン非同期OCRサポートがこのパターンをネイティブに処理し、Task.Runラッパーを必要としません。

Googleの機械学習が処理した画像の事前処理

Google Cloud Visionの機械学習を活用したモデルは、低コントラスト、軽微な歪み、中程度のノイズといった画像品質の問題を、明示的な前処理設定なしに処理します。 IronOCRを含むTesseractベースのエンジンは、劣化した入力データに対して明示的な前処理を行うことで効果を発揮する。 あなたのドキュメントコーパスに低品質のスキャンが含まれている場合、入力パイプラインにinput.EnhanceResolution(300)を追加してください。IronOCRの自動前処理は、画像品質の問題を検出した場合にこれらのフィルタを賢く適用しますが、既知の問題のあるスキャンソースに対しては明示的なフィルタ適用が決定的な結果をもたらします。 画像品質補正ガイドでは、フィルターAPIの全範囲を網羅しており、画像色補正ガイドでは、照明が不均一なスキャン画像のコントラストと二値化について解説しています。

IronOCRの追加機能

上記比較で取り上げた機能以外にも、 IronOCRはGoogle Cloud VisionのOCR機能にはない独自の機能を提供しています。

  • hOCR出力: 結果をresult.SaveAsHocrFile()付きのhOCRファイルとして保存し、hOCRフォーマットを使用する下流ツールに使います。 -バッチジョブの進捗状況追跡長時間実行されるバッチワークロードは、キューをポーリングしたりログ出力を解析したりすることなく、進捗状況追跡APIを介してドキュメントごとの完了を報告できます。 -特殊な文書タイプ IronOCRには、パスポート、ナンバープレート、MICR小切手、手書き文書など、一般的なOCRを超えた特別なエンジン調整が必要な文書タイプ向けに、事前に調整された構成が含まれています。 -文書からの表の抽出スキャンされた文書内の構造化された表データを、生のテキストストリームを後処理することなく、行と列の出力として抽出できます。 -画像の色補正コントラスト正規化、二値化閾値調整、グレースケール変換は、照明が不均一なスキャンやインクが薄れたスキャンに対して、明示的な前処理ステップとして利用できます。

.NETの互換性と将来の準備

IronOCRは.NET 8および.NET 9を積極的にサポートしており、レガシーコードベース向けに.NET Framework 4.6.2から4.8、および.NET Standard 2.0をサポートしています。 デプロイガイドは、WindowsLinuxmacOSDockerAzure 、およびAWS Lambdaを対象としており、同じNuGetパッケージをプラットフォーム固有の設定なしで全てにデプロイできます。グーグル・クラウド・ビジョンは REST/gRPC APIとして、自身 for .NET バージョン依存性がありませんが、Google.Cloud.Vision.V1 クライアントライブラリは .NET Standard 2.0 以降をターゲットとしており、その依存関係のツリー(gRPC、Protobuf)は、それらのライブラリの各主要バージョンで成長していくNuGetパッケージ管理の面を追加します。

結論

Google Cloud Vision は技術的に優れたOCRサービスで、本当の強みを持っています: そのMLバックのモデルはCJK(中国語、日本語、韓国語)のテキスト、手書き、および自然のシーン画像に対して良好に動作し、DOCUMENT_TEXT_DETECTION 機能の階層的なProtobuf出力は、それを必要とするユースケースのための詳細なシンボルレベルデータを提供します。 これらの強みは適切な状況下では重要だが、アーキテクチャ上の制約(クラウド送信の義務化、JSONキーファイル認証情報の管理、GCSに依存するPDF処理、画像ごとの課金、1分あたり1,800リクエストのレート制限、FedRAMP認証の欠如など)は、調整可能な設定項目ではない。 これらはクラウドAPIの基本的な特性です。

IronOCRのオンプレミスモデルは、これらの制約のほぼすべてを覆します。 文書は処理サーバーから決して外部に持ち出されません。 ライセンスキーは、JSONキーファイルとサービスアカウントのIAM設定を置き換えます。 PDF処理は3行の同期処理です。 レート制限はなく、プロビジョニングするGCSバケットもなく、非同期ポーリングループもなく、Protobufの逆シリアル化もありません。 OcrResult オブジェクトは段落テキストを読み取るためにシンボル連結を必要とするProtobuf階層ではなく、型付き.NETプロパティとして構造化されたデータを公開します。

この決定は、建築に関する一つの問題に帰着する。 文書をコンプライアンス、規制、または契約上の問題なくGoogleのインフラストラクチャに転送でき、かつデータ量が少なく、画像あたりのコストが許容範囲内であれば、Google Cloud Visionの機械学習の精度とマネージドインフラストラクチャは正当な利点となります。 HIPAA、ITAR、CMMC、政府請負業者の要件、エアギャップ展開、またはデータ主権ポリシーなどの理由で文書をオンプレミスに保持する必要がある場合、その質問は他の機能を評価する前に既に回答済みです。 IronOCRの永久ライセンスは、OCRを文書量に応じて変動するコストから固定費へと変更するため、生産規模での予算計画を大幅に簡素化します。

移行を検討しているチーム向けに、 IronOCRのドキュメントとチュートリアルハブでは、前処理、構造化データ、Google Cloud VisionのOCRの範囲外である特殊なドキュメント機能など、API全体を網羅的に解説しています。

ご注意AWS Textract, Azure Computer Vision, Google Cloud Vision, and Tesseractは、それぞれの所有者の登録商標です。 このサイトはAmazon Web Services、Google、またはMicrosoftによって、承認、支援、後援されていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

Google Cloud Vision API とは何ですか?

Google Cloud Vision API は、開発者や企業が画像や文書からテキストを抽出するために使用する OCR ソリューションです。.NETアプリケーション開発のためにIronOCRとともに評価されるいくつかのOCRオプションの一つです。

IronOCRは.NET開発者向けGoogle Cloud Vision APIと比較してどうですか?

IronOCRはNuGetネイティブ for .NET OCRライブラリで、IronTesseractをコアエンジンとして使用しています。Google Cloud Vision APIと比較して、よりシンプルなデプロイメント(SDKインストーラーなし)、定額料金、COMインターオプやクラウド依存のないクリーンなC# APIを提供します。

IronOCRはGoogle Cloud Vision APIよりセットアップが簡単ですか?

IronOCRは単一のNuGetパッケージでインストールされます。SDKインストーラー、ライセンスファイルのコピー、COMコンポーネントの登録、ランタイムバイナリの管理は必要ありません。OCRエンジン全体がパッケージにバンドルされています。

Google Cloud Vision APIとIronOCRにはどのような精度の違いがありますか?

IronOCRは、標準的なビジネス文書、請求書、領収書、スキャンしたフォームに対して高い認識精度を達成します。高度に劣化した文書や一般的でないスクリプトの場合、精度はソースの品質によって異なります。IronOCRは低品質入力の認識を向上させる画像前処理フィルターを含んでいます。

IronOCRはPDFテキスト抽出をサポートしていますか?

IronOCRは、ネイティブPDFとスキャンしたPDFイメージの両方から、一回の呼び出しでテキストを抽出します。また、複数ページのTIFFファイル、画像、ストリームもサポートします。スキャンしたPDFの場合、OCRはページごとに適用され、ページごとの結果オブジェクトを持ちます。

Google Cloud Vision APIライセンスはIronOCRと比較してどうですか?

IronOCRは、定額制の永久ライセンスで、ページ毎やスキャン毎の課金はありません。大量のドキュメントを処理する組織は、ボリュームに関係なく同じライセンス費用を支払います。詳しくはIronOCRライセンスページをご覧ください。

IronOCR はどの言語をサポートしていますか?

IronOCRは個別のNuGet言語パックにより127言語をサポートしています。言語を追加するには'dotnet add package IronOcr.Languages.{Language}'コマンドを実行するだけです。手動でのファイル配置やパス設定は必要ありません。

.NETプロジェクトにIronOCRをインストールするにはどうすればよいですか?

NuGet経由でインストールします:パッケージマネージャーコンソールで'Install-Package IronOcr'、またはCLIで'dotnet add package IronOcr'。追加の言語パックも同様にインストールされます。ネイティブSDKインストーラーは必要ありません。

IronOCRはGoogle Cloud Visionとは異なり、Dockerやコンテナ・デプロイメントに適していますか?

IronOCRはNuGetパッケージによってDockerコンテナで動作します。ライセンスキーは環境変数で設定します。OCRエンジン自体にはライセンスファイル、SDKパス、ボリュームマウントは必要ありません。

Google Cloud Visionと比較して、購入前にIronOCRを試すことはできますか?

IronOCRのトライアルモードでは、ドキュメントを処理し、出力に透かしをオーバーレイしたOCR結果を返します。ライセンスを購入する前に、ご自身の文書で精度を確認することができます。

IronOCRはテキスト抽出とバーコード読み取りをサポートしていますか?

IronOCRはテキスト抽出とOCRに重点を置いています。バーコード読み取りについては、Iron SoftwareはIronBarcodeをコンパニオンライブラリとして提供しています。どちらも個別に、あるいはIron Suiteのバンドルとして提供されています。

Google Cloud Vision APIからIronOCRへの移行は簡単ですか?

Google Cloud Vision APIからIronOCRへの移行は通常、初期化シーケンスをIronTesseractのインスタンス生成に置き換え、COMライフサイクル管理を削除し、APIコールを更新します。ほとんどの移行はコードの複雑さを大幅に軽減します。

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

アイアンサポートチーム

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