Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

Alternatywy dla funkcji OCR w programie Acrobat DC z wykorzystaniem IronOCR

ZanimGoogle Cloud Visionodczyta jakikolwiek znak z obrazu, już utworzyłeś projekt GCP, włączyłeś Vision API, utworzyłeś konto usługi, pobrałeś plik klucza JSON zawierający prywatny klucz RSA, ustawiłeś zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na każdym serwerze, który kiedykolwiek uruchomi Twój kod, oraz napisałeś pętlę powtórzeń do obsługi StatusCode.ResourceExhausted, gdy domyślny limit 1 800 żądań na minutę zostanie wyczerpany. Następnie odkrywasz, że przetwarzanie PDF wymaga drugiego pakietu NuGet (Google.Cloud.Storage.V1), wiadra GCS, asynchronicznej pętli sondowania, parsowania wyniku JSON oraz kroku czyszczenia w celu usunięcia obiektów z chmury.Google Cloud Visionma prawdziwe atuty — jego modele oparte na uczeniu maszynowym zapewniają wysoką dokładność w przypadku tekstów w języku chińskim, japońskim i koreańskim — ale zakres operacyjny jest znaczny, zanim przetworzy się choćby jeden dokument produkcyjny.

Zrozumienie Google Cloud Vision

Google Cloud Vision to hostowany w chmurze interfejs API do analizy obrazów, oparty na infrastrukturze uczenia maszynowego Google. Dla OCR, zapewnia dwa różne typy funkcji: TEXT_DETECTION, zoptymalizowany dla rzadkiego tekstu w naturalnych scenach, takich jak znaki uliczne i etykiety produktów, oraz DOCUMENT_TEXT_DETECTION, zoptymalizowany dla gęstych dokumentów z akapitami, tabelami i układami wielokolumnowymi. Usługa jest wywoływana za pośrednictwem pakietu NuGet Google.Cloud.Vision.V1, który obejmuje warstwę transportową gRPC i zwraca obiekty odpowiedzi wygenerowane przez Protobuf.

Kluczowe cechy architektury:

  • Przetwarzanie wyłącznie w chmurze: każdy dokument jest przesyłany do infrastruktury Google i tam przetwarzany. Nie ma trybu lokalnego.
  • Uwierzytelnianie konta usługowego: Uwierzytelnianie wymaga pliku klucza JSON zawierającego klucz prywatny RSA, adres e-mail klienta oraz identyfikator projektu. Plik musi być wdrożony na każdym hoście i odwoływany przez zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS lub domyślne poświadczenia aplikacji Google.
  • PDF wymaga GCS i async: Przetwarzanie dokumentów PDF nie jest bezpośrednim wywołaniem API. PDFy muszą być przesyłane do Google Cloud Storage, zgłaszane za pośrednictwem AsyncBatchAnnotateFilesAsync, monitorowane do zakończenia, a pliki wyjściowe JSON pobierane i parsowane z GCS.
  • Hierarchia odpowiedzi Protobuf: DOCUMENT_TEXT_DETECTION zwraca obiekt Protobuf TextAnnotation z hierarchią PagesBlocksParagraphsWordsSymbols. Wyodrębnianie tekstu akapitu wymaga iteracji czterech poziomów i łączenia poszczególnych ciągów znaków.
  • Limity szybkości: domyślny limit wynosi 1800 żądań na minutę. Przetwarzanie wsadowe powyżej tego progu wymaga implementacji logiki powtarzania dla odpowiedzi StatusCode.ResourceExhausted.
  • Status FedRAMP:Google Cloud Visionnie posiada certyfikatu FedRAMP, co wyklucza go z zastosowań w agencjach federalnych, gdzie Azure Computer Vision (FedRAMP High) lub AWS Textract (FedRAMP High) pozostają dostępnymi alternatywami.
  • Ceny: Stawki za 1 000 obrazów dla TEXT_DETECTION i DOCUMENT_TEXT_DETECTION po pierwszych 1 000 bezpłatnych jednostkach miesięcznie; Przetwarzanie asynchroniczne PDF jest rozliczane od strony. Zapoznaj się ze stroną cen Google Cloud Vision w celu uzyskania aktualnych stawek.

Konfiguracja poświadczeń konta usługowego

Poniższy kod z google-vision-vs-ironocr-examples.cs ilustruje wzorzec inicjalizacji klienta. To, co ukrywa linia instancji, to warunek wstępny: zmienna środowiskowa GOOGLE_APPLICATION_CREDENTIALS już musi wskazywać na prawidłowy plik klucza JSON konta usługi na bieżącej maszynie:

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

Plik klucza JSON zawiera klucz prywatny RSA, adres e-mail klienta oraz identyfikatory projektu. Nie wolno go nigdy umieszczać w systemie kontroli wersji, należy go wykluczyć z obrazów Docker, należy go okresowo wymieniać oraz chronić odpowiednimi uprawnieniami systemu plików. Narażony klucz zapewnia dostęp do API do momentu ręcznego cofnięcia go w konsoli GCP.

Zrozumienie IronOCR

IronOCR to komercyjna biblioteka OCR dla platformy .NET, oparta na zoptymalizowanym silniku Tesseract 5. Przetwarza wszystkie dokumenty lokalnie — bez przesyłania do chmury, bez konieczności połączenia z Internetem i bez przetwarzania danych przez podmioty zewnętrzne. Pojedyncza instalacja pakietu NuGet (IronOcr) dostarcza wszystko: silnik OCR, automatyczne filtry przetwarzania wstępnego, natywną obsługę PDF i ponad 125 pakietów językowych dostępnych jako oddzielne pakiety NuGet.

Kluczowe cechy:

  • Przetwarzanie lokalne: dokumenty nigdy nie opuszczają Twojej infrastruktury. Działa w środowiskach odizolowanych, sieciach o ograniczonym dostępie oraz kontenerach Docker bez łączności wychodzącej.
  • Pojedyncze wdrożenie NuGet: bez folderów tessdata, bez zarządzania bibliotekami natywnymi, bez zmiennych środowiskowych poza ciągiem klucza licencyjnego.
  • Automatyczne przetwarzanie wstępne: filtry Deskew, DeNoise, Contrast, Binarize i EnhanceResolution są stosowane automatycznie w przypadku danych wejściowych o niskiej jakości i są dostępne indywidualnie w celu wyraźnej kontroli.
  • Natywne wejście PDF: PDFy są ładowane bezpośrednio przez input.LoadPdf() z synchronicznym przetwarzaniem. Pliki PDF chronione hasłem wymagają jednego parametru.
  • Ustrukturyzowana OcrResult: Wyniki ujawniają Text, Confidence, Pages, Paragraphs, Lines, Words i Barcodes jako typowe obiekty .NET — bez deserializacji Protobuf, bez konkatenacji symboli.
  • Bezpieczny wątkowo: instancje IronTesseract są bezpieczne do równoległego użycia. Obciążenia wsadowe mogą używać Parallel.ForEach bez dodatkowej synchronizacji.
  • Licencjonowanie wieczyste: $999 Lite, $1,499 Plus, $2,999 Professional, $5,999 Unlimited — jednorazowy zakup bez kosztów per transakcję.

Porównanie funkcji

Funkcja Google Cloud Vision IronOCR
Model przetwarzania Tylko w chmurze Tylko na miejscu
Przetwarzanie plików PDF Za pośrednictwem GCS + async API Bezpośredni, synchroniczny
Uwierzytelnianie Klucz JSON konta usługowego Ciąg klucza licencyjnego
AutoryzacjaFedRAMP Brak uprawnień Nie dotyczy (lokalnie)
Koszt za dokument Od strony (zobacz ceny Google Cloud Vision) None
Tryb offline / izolacja sieciowa Nie Tak

Szczegółowe porównanie funkcji

Kategoria Funkcja Google Cloud Vision IronOCR
Dane wejściowe OCR obrazów Tak Tak
OCR PDF Za pośrednictwem GCS + async (ponad 50 wierszy) input.LoadPdf() (3 linie)
Plik PDF chroniony hasłem Nieobsługiwane LoadPdf(path, Password: "...")
Dane wejściowe strumienia Tak Tak
Wprowadź adres URL Nie input.LoadImageFromUrl()
TIFF / GIF wieloklatkowy Ograniczone Tak
Uwierzytelnianie Typ poświadczenia Plik kluczy JSON + zmienna środowiskowa Ciąg klucza licencyjnego
Rotacja haseł Wymagane (ręczne) Nie jest wymagane
Wymagane sekrety CI/CD Tak (plik klucza) Tak (tylko ciąg licencji)
Przetwarzanie Tryb offline / izolacja sieciowa Nie Tak
Przetwarzanie synchroniczne Tylko obrazy Obrazy i pliki PDF
Limity szybkości 1800 słów/min (domyślnie) Brak (zależne od procesora)
Przetwarzanie wstępne (automatyczne) Brak (oparte na ML) Deskew, DeNoise, Contrast, Binarize, EnhanceResolution
Wynik Zwykły tekst Tak Tak
Wynik ustrukturyzowany (wpisany) Hierarchia Protobuf OcrResult (obiekty .NET)
Wyniki pewności Za znak/słowo Za słowo i całość
Wynik w formacie PDF z możliwością wyszukiwania Nie result.SaveAsSearchablePdf()
Odczytywanie BarCode Oddzielna funkcja API ocr.Configuration.ReadBarCodes = true
OCR oparte na regionie Brak przycięcia regionu natywnego CropRectangle na wejściu
Język Liczba słów ~50 Ponad 125 pakietów dostępnych za pośrednictwem NuGet
Dokładność w językach chińskim, japońskim i koreańskim Silne (wspierane przez ML) Dobre (Tesseract 5 LSTM)
Zgodność FedRAMP Brak uprawnień Nie dotyczy (lokalnie)
HIPAA / ITAR BAA + kompleksowa weryfikacja Brak obsługi stron trzecich
Artykuł 28 RODO Wymagane DPA Nie dotyczy (lokalne)
Koszt Model cenowy Skontaktuj się z Google, aby uzyskać aktualne ceny Wieczysta ($5,999)

Złożoność uwierzytelniania i zarządzanie danymi uwierzytelniającymi

Najbardziej niedocenianym kosztemGoogle Cloud Visionnie jest opłata za obraz. To obciążenie operacyjne związane z zarządzaniem danymi uwierzytelniającymi kont usługowych we wszystkich środowiskach, w których działa aplikacja.

Podejście Google Cloud Vision

Inicjalizacja klienta wygląda jak jedna linia, ale ta linia rzuci RpcException z StatusCode.PermissionDenied, chyba że spełniono siedem warunków wstępnych. Z google-cloud-vision-migration-examples.cs, konfiguracja poświadczeń opowiada całą historię:

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

W przypadku wdrożenia opartego na Dockerze plik klucza JSON musi zostać zamontowany jako wolumin tajny lub wstrzyknięty za pośrednictwem sekretów Kubernetes. W konfiguracji wieloregionalnej każdy region wymaga tej samej konfiguracji poświadczeń. Rotacja kluczy to proces ręczny, który wymaga jednoczesnej aktualizacji przy każdym wdrożeniu lub zaakceptowania okresu, w którym zarówno stare, jak i nowe klucze są ważne. Warstwa obsługi błędów rośnie proporcjonalnie — kod produkcyjny wymaga odrębnych bloków przechwytywania dla StatusCode.PermissionDenied, StatusCode.ResourceExhausted, StatusCode.Unavailable i StatusCode.DeadlineExceeded.

Podejście IronOCR

Konfiguracja IronOCR polega na wprowadzeniu ciągu znaków klucza licencyjnego. Brak plików do wdrożenia, brak zmiennych środowiskowych poza samym kluczem, brak harmonogramu rotacji:

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

    // Nie 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";

    // Nie 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")

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

W CI/CD klucz licencyjny jest pojedynczym sekretem potoku. W Dockerze jest to pojedyncza zmienna środowiskowa. Nie ma pliku JSON do zamontowania, nie ma roli IAM do przypisania, nie ma konsoli GCP, z którą można by współpracować. Kiedy programista dołącza do zespołu, otrzymuje jeden ciąg znaków. Pełny zakres błędów związanych z uwierzytelnianiem to: klucz jest nieprawidłowy lub okres próbny wygasł.

Przetwarzanie plików PDF: GCS Pipeline a Direct Load

Przetwarzanie plików PDF to obszar, w którym różnice w działaniu obu bibliotek stają się najbardziej widoczne.Google Cloud Visionnie akceptuje plików PDF jako bezpośredniego danych wejściowych API — plik musi przejść przez Google Cloud Storage jako pośrednika.

Podejście Google Cloud Vision

Kompletny przepływ przetwarzania PDF od google-cloud-vision-migration-examples.cs obejmuje ponad 40 linii przed implementacją DownloadAndParseResultsAsync — co samo w sobie wymaga parsowania URI wyjściowych GCS, listowania obiektów wyników, pobierania plików JSON i łączenia tekstu przez strony:

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 Funkcja { 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 Funkcja { 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 Await Task.FromResult(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
        Await Task.CompletedTask
    End Function

    Public Async Function DeleteObjectAsync(bucketName As String, objectName As String) As Task
        ' Implementation for deleting object
        Await Task.CompletedTask
    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 Await Task.FromResult(New Operation())
    End Function
End Class

Public Class Operation
    Public Async Function PollUntilCompletedAsync() As Task(Of OperationResult)
        ' Implementation for polling until completed
        Return Await Task.FromResult(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 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 Property Type As Feature.Types.Type

    Public Class Types
        Public Enum Type
            DocumentTextDetection
        End Enum
    End Class
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

Jest to minimalna wersja robocza, a nie wersja gotowa do wdrożenia w środowisku produkcyjnym. Kod produkcyjny dodaje logikę ponownych prób w przypadku niepowodzeń przesyłania do GCS, obsługę limitów czasu dla powolnych operacji asynchronicznych, czyszczenie obiektów wyjściowych (nie tylko obiektów wejściowych), obsługę błędów w przypadku niepowodzenia operacji w trakcie jej wykonywania oraz rejestrowanie stanów pośrednich. Pliki PDF chronione hasłem nie są obsługiwane niezależnie od poziomu złożoności.

Podejście IronOCR

Obsługa plików PDF w IronOCR polega na bezpośrednim wczytaniu pliku i przetwarzaniu go w trybie synchronicznym:

public string ProcessPdf(string pdfPath)
{
    // Direct Przetwarzanie plików PDF - 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)
{
    // Direct Przetwarzanie plików PDF - 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
        ' Direct Przetwarzanie plików PDF - 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

Brak drugiego pakietu NuGet. Nie ma potrzeby tworzenia ani utrzymywania zasobnika GCS. Brak etapu czyszczenia. Brak asynchronicznej maszyny stanów. Wariant chroniony hasłem dodaje dokładnie jeden parametr. Dla zespołów, które muszą tworzyć przeszukiwalne PDFy z zeskanowanego wejścia, result.SaveAsSearchablePdf("output.pdf") obsługuje wyjście przeszukiwalnego PDF w jednej dodatkowej linii — coGoogle Cloud Visionnie oferuje na żadnym poziomie złożoności API.

Analiza odpowiedzi Protobuf a zwykły OcrResult

Uzyskanie ustrukturyzowanych danych z wywołania DOCUMENT_TEXT_DETECTION wymaga nawigacji po hierarchii odpowiedzi Protobuf. Ścieżka od wywołania API do tekstu akapitu przebiega przez pięć poziomów zagnieżdżonych iteracji.

Podejście Google Cloud Vision

Wyodrębnianie tekstu akapitu z gęstego dokumentu wymaga przejścia przez strony, następnie bloki, a potem akapity, a na końcu połączenia symboli z każdego WORD-a — ponieważ projekt Protobuf przechowuje tekst na poziomie symboli, a nie słów czy akapitów:

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

Konkatenacja na poziomie symboli nie jest opcjonalna — paragraph.Text nie istnieje jako bezpośrednia właściwość w odpowiedzi Protobuf. Każdy zespół korzystający z tego API pisze własną wersję tej samej agregacji w pętli zagnieżdżonej. Pewność na poziomie słów wymaga szóstego poziomu iteracji w celu uzyskania wartości word.Confidence, a następnie zmapowania ich z powrotem do wyniku łączenia symboli.

Podejście IronOCR

IronOCR's OcrResult exposes a flat, typed API. Pages, Paragraphs, Lines i Words są wszystkimi bezpośrednimi właściwościami z Text, Confidence, X, Y, Width i Height gotowymi do użytku:

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

Przewodnik po wynikach odczytu obejmuje pełny interfejs API danych strukturalnych. Pozycjonowanie i wyniki pewności na poziomie słów są dostępne na result.Words[i].X, result.Words[i].Y i result.Words[i].Confidence bez nawigowania po pośredniej hierarchii. Dla ekstrakcji specyficznej dla regionu, OCR na podstawie regionu używa CropRectangle na OcrInput, co unika przetwarzania całego obrazu, gdy potrzebny jest tylko wiersz nagłówka lub określone pole.

Model kosztowy: rozliczenie za obraz a Licencja wieczysta

Porównanie kosztów zależy w dużej mierze od objętości i horyzontu czasowego.

Podejście Google Cloud Vision

CenyGoogle Cloud Visionsą oparte na wykorzystaniu i różnią się w zależności od typu funkcji i objętości. Zapoznaj się ze stroną cen Google Cloud Vision w celu uzyskania aktualnych stawek. Należy zauważyć, że całkowite koszty mogą również obejmować opłaty za przechowywanie GCS i opłaty operacyjne dla przepływów pracy PDF, koszty wyjścia sieciowego oraz czas wygospodarowany na zarządzanie poświadczeniami i rotacje kluczy.

Przy wysokich objętościach dokumentów, opłaty za obraz kumulują się znacząco, z kosztami rosnącymi liniowo z objętością i bez limitu, chyba że zostanie wynegocjowana umowa na zobowiązane użytkowanie.

Podejście IronOCR

Ceny IronOCR to jednorazowy zakup wieczysty: $999 Lite (1 deweloper), $1,499 Plus (3 deweloperów), $2,999 Professional (10 deweloperów), $5,999 Unlimited. Licencja obejmuje nieograniczone przetwarzanie dokumentów bez pomiaru. Drugi rok jest bezpłatny. Trzeci rok jest bezpłatny. Przy wysokich objętościach dokumentów, wieczysta licencja IronOCR szybko staje się bardziej opłacalna niż ceny w chmurze za obraz. Zobacz stronę licencji IronOCR dla aktualnych szczegółów poziomu.

Punkt przecięcia, w którym IronOCR staje się tańszy od Google Cloud Vision, zależy od twojego wolumenu i obecnych cen Google. Dla większości zespołów przetwarzających dokumenty konsekwentnie w produkcji, wieczysta licencja IronOCR zwraca się w ciągu kilku pierwszych miesięcy użytkowania.

Przewodnik po mapowaniu API

Google Cloud Vision IronOCR Uwagi
ImageAnnotatorClient.Create() new IronTesseract() Inicjalizacja klienta
_client.DetectText(image) _ocr.Read(imagePath).Text Podstawowe wyodrębnianie tekstu
_client.DetectDocumentText(image) _ocr.Read(imagePath) OCR dokumentów o dużej gęstości
AsyncBatchAnnotateFilesAsync() input.LoadPdf(); _ocr.Read(input) Przetwarzanie plików PDF
StorageClient.Create() Nie jest potrzebne GCS nie jest wymagane w IronOCR
storageClient.UploadObjectAsync() Nie jest potrzebne Pliki PDF ładują się bezpośrednio
operation.PollUntilCompletedAsync() Nie jest potrzebne Przetwarzanie jest synchroniczne
TextAnnotation OcrResult Pojemnik wyników
annotation.Text result.Text Pełny tekst dokumentu
annotation.Pages[i] result.Pages[i] Dostęp na stronę
page.Blocks[i].Paragraphs[j] result.Paragraphs[i] Dostęp do akapitów
paragraph.Words.SelectMany(w => w.Symbols).Select(s => s.Text) paragraph.Text Właściwość tekstu bezpośredniego
word.Confidence word.Confidence Pewność dla poszczególnych słów
page.Confidence result.Confidence Ogólna pewność
Feature.Types.Type.DocumentTextDetection Automatyczne IronOCR automatycznie wybiera tryb
Image.FromFile(path) _ocr.Read(path) lub input.LoadImage(path) Ładowanie obrazów
response[0].Description result.Text Wyodrębnianie pełnego tekstu
annotation.BoundingPoly.Vertices word.X, word.Y, word.Width, word.Height Współrzędne graniczne
RpcException (StatusCode.ResourceExhausted) Nie dotyczy Brak lokalnych limitów stawek
RpcException (StatusCode.PermissionDenied) Nie dotyczy Brak uwierzytelniania w czasie wykonywania

Kiedy zespoły rozważają przejście zGoogle Cloud Visionna IronOCR

Wymagania dotyczące zgodności Przetwarzanie w chmurze

Najczęstszym czynnikiem skłaniającym do migracji nie są koszty — jest to audyt zgodności. Wykonawcy rządowi napotykają ograniczenia wynikające z przepisów ITAR i dowiadują się, że przesyłanie danych technicznych podlegających kontroli do Google Cloud jest zabronione. Organizacje opieki zdrowotnej tworzące procesy przetwarzania dokumentów stwierdzają, że ich inspektor ds. bezpieczeństwa HIPAA wymaga przeglądu umowy o współpracy biznesowej (Business Associate Agreement) każdego podmiotu przetwarzającego dane, a ocena zakresu infrastruktury chmurowej Google przekracza ich tolerancję ryzyka. Działy prawne zajmujące się przetwarzaniem poufnych dokumentów klientów uznają, że kwestie związane z tajemnicą adwokacką przeważają nad wygodą przetwarzania w chmurze. Wykonawcy z sektóra obronnego muszą spełniać wymagania CMMC, które traktują wszelkie dane opuszczające granice organizacji jako naruszenie. We wszystkich tych scenariuszach jakość techniczna modeli ML firmy Google nie ma znaczenia — to sama architektura stanowi czynnik dyskwalifikujący. Model lokalny IronOCR eliminuje całą kategorię zgodności z przepisami dotyczącymi przetwarzania danych przez podmioty zewnętrzne, ponieważ w przetwarzaniu nie bierze udziału żadna strona trzecia.

Przepływy pracy z plikami PDF stają się niemożliwe do zarządzania na dużą skalę

Zespoły, które zaczynają korzystać zGoogle Cloud Visiondo OCR obrazów, często odkrywają złożoność plików PDF, gdy muszą rozszerzyć zakres swoich działań. Obsługa 200 plików PDF dziennie za pomocą asynchronicznego potoku GCS jest wykonalna, ale uciążliwa. Obsługa 10 000 plików PDF dziennie wymaga wzmocnienia całego procesu: logiki ponownych prób w przypadku niepowodzeń przesyłania do GCS, kolejek nieodebranych wiadomości dla operacji, które nigdy nie zostały zakończone, zadań czyszczenia osieroconych obiektów GCS w przypadku awarii aplikacji w trakcie procesu oraz monitorowania zarówno kosztów Vision API, jak i kosztów przechowywania w GCS. Zespoły, które osiągają tę skalę, konsekwentnie uznają migrację do IronOCR za prostą — cały asynchroniczny potok GCS sprowadza się do bezpośredniego wczytania pliku lokalnego, po którym następuje pojedyncze wywołanie odczytu, a tryby awarii ograniczają się wyłącznie do wyjątków wejścia/wyjścia plików lokalnych, zamiast obejmować przekroczenia limitów czasu sieci, błędy uwierzytelniania, błędy limitu GCS i wyjątki parsowania JSON.

Przewidywalność budżetu jest ważniejsza niż elastyczność w przeliczeniu na pojedynczy obraz

Projekty na wczesnym etapie często wybierają Google Cloud Vision, ponieważ bezpłatny pakiet pokrywa początkowe koszty rozwoju, a model rozliczeniowy oparty na liczbie obrazów sprowadza się do zera, gdy nic nie jest przetwarzane. Gdy produkt osiąga stałą wielkość produkcji — zazwyczaj powyżej 50 000 dokumentów miesięcznie — zespół finansowy zauważa powtarzającą się pozycję w zestawieniu. W przeciwieństwie do subskrypcji SaaS, które rosną wraz z rozwojem firmy, Licencja wieczysta IronOCR przekształca OCR ze zmiennego kosztu operacyjnego w stały wydatek kapitałowy. Dla zespołu 10 deweloperów przetwarzających dokumenty w regulowanym przemyśle, licencja Professional za $2,999 jednorazowo zazwyczaj uzasadnia się w pierwszym kwartale wolumenu produkcji w porównaniu do bieżących kosztów za obraz w chmurze.

Przetwarzanie wsadowe osiąga limity częstotliwości

Procesy wymagające przetwarzania dużej ilości dokumentów — ujawnianie informacji prawnych, digitalizacja dokumentów finansowych, przetwarzanie roszczeń ubezpieczeniowych — rutynowo wymagają przetwarzania tysięcy dokumentów na godzinę. Domyślny limit 1800 żądań na minutę wGoogle Cloud Visionoznacza, że wysyłanie 3000 dokumentów w krótkim czasie uruchamia ograniczenie szybkości i wymaga albo złożenia wniosku o zwiększenie limitu przez konsolę GCP (co wiąże się z oczekiwaniem na zatwierdzenie przez Google), albo wdrożenia algorytmu wykładniczego cofania z jitterem. Pojedyncze przekroczenie limitu powoduje zatrzymanie całego procesu przetwarzania i obowiązkowe 60-sekundowe oczekiwanie przed ponowną próbą. Lokalne przetwarzanie w IronOCR jest ograniczone jedynie dostępnymi rdzeniami procesora, a przetwarzanie równoległe wykorzystuje je wszystkie bez konieczności uzyskania zewnętrznej zgody.

Wymagane są wdrożenia typu air-gapped

Niektóre środowiska z założenia nie mają połączenia z internetem: tajne sieci wojskowe, przemysłowe systemy sterowania, bezpieczne centra danych do rozliczeń finansowych.Google Cloud Visionnie może funkcjonować w tych środowiskach na żadnym poziomie kreatywności architektonicznej — API wymaga połączenia internetowego z punktami końcowymi Google. WdrożenieIronOCRw Dockerze działa bez połączenia z internetem. Klucz licencyjny jest weryfikowany przy pierwszym użyciu i zapisywany w pamięci podręcznej; Dalsze korzystanie nie wymaga dostępu do sieci.

Typowe kwestie związane z migracją

Usunięcie zależności od GCS

Najważniejszą zmianą strukturalną podczas migracji jest całkowite wyeliminowanie potoku GCS. Przed usunięciem pakietów Google należy udokumentować każdy zasób GCS utworzony na potrzeby wejścia i wyjścia OCR, a następnie je wyczyścić, aby uniknąć bieżących opłat za przechowywanie. Zmienna środowiskowa GOOGLE_APPLICATION_CREDENTIALS i plik klucza JSON powinny być usunięte ze wszystkich konfiguracji wdrożeniowych, sekretów CI/CD i maszyn deweloperskich. Konto usługi IAM w konsoli GCP można wyłączyć lub usunąć po upewnieniu się, że żadne inne usługi nie są od niego zależne.

Po usunięciu Google.Cloud.Vision.V1 i Google.Cloud.Storage.V1, kod przetwarzania PDF, który wcześniej obejmował ponad 50 linii asynchronicznej orkiestracji, redukuje się do OcrInput z LoadPdf i pojedynczym wywołaniem Read. Zmiana zasad obsługi błędów: znikają wyjątki sieciowe, wyjątki autoryzacji i wyjątki ograniczeń szybkości. Pozostałe wyjątki to wyjątki we/wy plików (plik nie znaleziony, plik zablokowany) i OcrException dla niepowodzeń przetwarzania. Przewodnik po wprowadzaniu obrazów IronOCR oraz przewodnik po wprowadzaniu plików PDF obejmują pełny interfejs API wprowadzania danych, w tym strumienie, tablice bajtów i ładowanie adresów URL.

Łączenie symboli Protobuf w celu uzyskania bezpośredniego dostępu do tekstu

Każda lokalizacja w Twojej bazie kodu, gdzie napisałeś .SelectMany(w => w.Symbols).Select(s => s.Text), aby wyodrębnić tekst akapitu lub słowa z hierarchii Protobuf, staje się bezpośrednim dostępem do właściwości. paragraph.Text, line.Text i word.Text istnieją jako typowe właściwości łańcuchowe na obiektach wynikowych IronOCR. Przejrzyj cały kod służący do pozyskiwania danych strukturalnych i usuń pośrednią logikę agregacji. Przewodnik jak czytać wyniki mapuje każdą właściwość dostępną na OcrResult, OcrResult.Page, OcrResult.Paragraph, OcrResult.Line i OcrResult.Word.

Przejście z trybu asynchronicznego do synchronicznego w przepływach pracy z plikami PDF

Przetwarzanie plików PDF wGoogle Cloud Visionodbywa się wyłącznie w trybie asynchronicznym, ponieważ operacja ta wymaga komunikacji z GCS. Metoda ReadIronOCR jest synchroniczna. Jeśli warstwa przetwarzania PDF w Twojej aplikacji jest zbudowana wokół sygnatur async Task<string> i łańcuchów wywołań opartych na await, wzorzec migracji to Task.Run wrapper:

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

Pozwala to zachować interfejs asynchroniczny dla wywołujących podczas wykonywania operacji OCR w puli wątków. Dla scenariuszy o wysokiej przepustowości, wbudowane asynchroniczne wsparcie OCRIronOCR obsługuje ten wzorzec natywnie bez wrappera Task.Run.

Przetwarzanie wstępne obrazów obsługiwanych przez system uczenia maszynowego Google

Modele oparte na uczeniu maszynowym wGoogle Cloud Visionradzą sobie z niektórymi problemami związanymi z jakością obrazu — niskim kontrastem, niewielkim przekrzywieniem, umiarkowanym szumem — bez konieczności wyraźnej konfiguracji przetwarzania wstępnego. Silniki oparte na Tesseract, w tym IronOCR, korzystają z jawnego przetwarzania wstępnego w przypadku danych wejściowych o obniżonej jakości. Jeśli Twoja baza dokumentów zawiera niskiej jakości skany, dodaj input.Deskew(), input.DeNoise() i input.EnhanceResolution(300) do potoku wejściowego. Automatyczne przetwarzanie wstępne IronOCR stosuje te filtry inteligentnie przy wykrywaniu problemów z jakością obrazu, ale dla znanych problemowych źródeł skanowania, eksplicitne zastosowanie filtru daje deterministyczne wyniki. Przewodnik po korekcji jakości obrazu obejmuje pełny interfejs API filtrów, a przewodnik po korekcji kolorów obrazu dotyczy kontrastu i binarizacji skanów o nierównomiernym oświetleniu.

Dodatkowe możliwości IronOCR

Oprócz funkcji omówionych w powyższych porównaniach, IronOCR oferuje możliwości, które nie mają odpowiednika w OCR Google Cloud Vision:

  • Eksport hOCR: Zapisz wyniki jako pliki hOCR z result.SaveAsHocrFile() dla narzędzi downstream, które konsumują format hOCR.
  • Śledzenie postępu zadań wsadowych: długotrwałe obciążenia wsadowe mogą zgłaszać ukończenie poszczególnych dokumentów za pośrednictwem interfejsu API śledzenia postępu bez konieczności odpytywania kolejki lub analizowania danych wyjściowych dziennika.
  • Specjalistyczne typy dokumentów:IronOCR zawiera wstępnie dostosowane konfiguracje dla paszportów, tablic rejestracyjnych, czeków MICR i dokumentów odręcznych — typów dokumentów, które wymagają specjalnego dostosowania silnika wykraczającego poza ogólne OCR.
  • Wyodrębnianie tabel z dokumentów: Ustrukturyzowane dane tabelaryczne ze skanowanych dokumentów można wyodrębnić do formatu wiersz-kolumna bez konieczności przetwarzania surowego strumienia tekstowego.
  • Korekcja kolorów obrazu: Normalizacja kontrastu, regulacja progu binarizacji oraz konwersja do skali szarości są dostępne jako wyraźne etapy przetwarzania wstępnego dla skanów o nierównomiernym oświetleniu lub wyblakłym tuszu.

Zgodność z platformą .NET i gotowość na przyszłość

IronOCR jest przeznaczony dla platform .NET 8 i .NET 9 z aktywnym wsparciem technicznym oraz obsługuje platformy .NET Framework 4.6.2 do 4.8 oraz .NET Standard 2.0 dla starszych kodów źródłowych. Przewodniki wdrożeniowe obejmują systemy Windows, Linux, macOS, Docker, Azure i AWS Lambda — ten sam pakiet NuGet można wdrożyć na wszystkich tych platformach bez konieczności konfiguracji specyficznej dla danej platformy. Google Cloud Vision, jako API REST/gRPC, nie ma własnej zależności od wersji .NET, ale biblioteka kliencka Google.Cloud.Vision.V1 jest skierowana na .NET Standard 2.0 i nowsze, a jej drzewo zależności (gRPC, Protobuf) dodaje powierzchnię zarządzania pakietami NuGet, która rośnie z każdą główną wersją tych bibliotek.

Wnioski

Google Cloud Vision to technicznie zdolna usługa OCR z prawdziwymi zaletami: jej modele z wsparciem ML działają dobrze na tekście CJK, pismu odręcznym i obrazach scen naturalnych, a hierarchiczne wyjście Protobuf funkcji DOCUMENT_TEXT_DETECTION zapewnia szczegółowe dane na poziomie symboli dla przypadków użycia, które tego potrzebują. Te mocne strony mają znaczenie w odpowiednim kontekście, ale ograniczenia architektoniczne — obowiązkowa transmisja w chmurze, zarządzanie poświadczeniami za pomocą plików kluczy JSON, przetwarzanie plików PDF zależne od GCS, rozliczanie według liczby obrazów, limity 1800 żądań na minutę oraz brak autoryzacjiFedRAMP— nie są parametrami konfiguracyjnymi, które można po prostu wyłączyć. Są to podstawowe właściwości interfejsu API w chmurze.

Model lokalny IronOCR odwraca niemal wszystkie te ograniczenia. Dokumenty nigdy nie opuszczają serwera przetwarzającego. Klucz licencyjny zastępuje plik klucza JSON i konfigurację konta usługi IAM. Przetwarzanie plików PDF to trzyetapowa operacja synchroniczna. Nie ma limitów szybkości, nie ma puli GCS do przydzielania, nie ma asynchronicznych pętli odpytywania ani deserializacji Protobuf. Obiekt OcrResult ujawnia ustrukturyzowane dane jako typowe właściwości .NET, a nie jako hierarchię Protobuf wymagającą konkatenacji symboli do odczytania tekstu akapitu.

Decyzja sprowadza się do jednego pytania dotyczącego architektury. Jeśli Twoje dokumenty mogą trafić do infrastruktury Google bez problemów związanych z zgodnością, przepisami lub umowami, a ich ilość jest na tyle mała, że koszt na obraz jest akceptowalny, dokładność uczenia maszynowegoGoogle Cloud Visioni zarządzana infrastruktura to realne zalety. Jeśli dokumenty muszą pozostać na miejscu — ze względu na HIPAA, ITAR, CMMC, wymagania wykonawców rządowych, wdrożenie w izolacji sieciowej lub polityki suwerenności danych — odpowiedź na to pytanie jest już znana przed oceną jakiejkolwiek innej funkcji. Licencja wieczysta IronOCR przekształca również OCR z kosztu zmiennego, który rośnie wraz z ilością dokumentów, w stałą pozycję w budżecie, co znacznie upraszcza planowanie budżetu na skalę produkcyjną.

Dla zespołów rozważających migrację centrum dokumentacji i samouczków IronOCR zapewnia pełny opis całego interfejsu API, w tym przetwarzania wstępnego, danych ustrukturyzowanych oraz specjalistycznych funkcji dokumentów, które całkowicie wykraczają poza zakres OCR Google Cloud Vision.

Zwróć uwagęAWS Textract, Azure Computer Vision,Google Cloud Visioni Tesseract są zarejestrowanymi znakami towarowymi odpowiednich właścicieli. Ta strona nie jest powiązana z, zatwierdzona przez, ani sponsorowana przez Amazon Web Services, Google, ani Microsoft. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Często Zadawane Pytania

Czym jest Google Cloud Vision API?

Google Cloud Vision API to rozwiązanie OCR wykorzystywane przez programistów i przedsiębiorstwa do wyodrębniania tekstu z obrazów i dokumentów. Jest to jedna z kilku opcji OCR ocenianych obok IronOCR for .NET pod kątem tworzenia aplikacji .NET.

Jak IronOCR wypada w porównaniu z Google Cloud Vision API dla programistów .NET?

IronOCR to natywna dla NuGet biblioteka OCR dla platformy .NET, wykorzystująca IronTesseract jako główny silnik. W porównaniu z Google Cloud Vision API oferuje prostsze wdrożenie (bez instalatorów SDK), stałą cenę oraz przejrzysty interfejs API w języku C# bez interoperacyjności COM i zależności od chmury.

Czy IronOCR jest łatwiejszy w konfiguracji niż Google Cloud Vision API?

IronOCR instaluje się za pomocą jednego pakietu NuGet. Nie ma żadnych instalatorów SDK, plików licencyjnych do skopiowania, komponentów COM do zarejestrowania ani oddzielnych plików binarnych środowiska uruchomieniowego, którymi trzeba by zarządzać. Cały silnik OCR jest zawarty w pakiecie.

Jakie różnice w dokładności występują między Google Cloud Vision API a IronOCR?

IronOCR osiąga wysoką dokładność rozpoznawania standardowych dokumentów biznesowych, faktur, paragonów i zeskanowanych formularzy. W przypadku dokumentów o bardzo niskiej jakości lub rzadkich skryptów dokładność zależy od jakości źródła. IronOCR zawiera filtry wstępnego przetwarzania obrazu, które poprawiają rozpoznawanie danych wejściowych o niskiej jakości.

Czy IronOCR obsługuje wyodrębnianie tekstu z plików PDF?

Tak. IronOCR wyodrębnia tekst zarówno z natywnych plików PDF, jak i ze skanowanych obrazów PDF za pomocą jednego wywołania. Obsługuje również wielostronicowe pliki TIFF, obrazy i strumienie. W przypadku skanowanych plików PDF OCR jest stosowany strona po stronie, z obiektami wynikowymi dla każdej strony.

Jak wygląda licencjonowanie Google Cloud Vision API w porównaniu z IronOCR?

IronOCR korzysta z licencji wieczystej o stałej stawce, bez opłat za stronę lub skan. Organizacje przetwarzające duże ilości dokumentów płacą ten sam koszt licencji niezależnie od ilości. Szczegóły i ceny hurtowe znajdują się na stronie licencji IronOCR.

Jakie języki obsługuje IronOCR?

IronOCR obsługuje 127 języków za pośrednictwem oddzielnych pakietów językowych NuGet. Dodanie języka wymaga wykonania pojedynczego polecenia „dotnet add package IronOcr.Languages.{Language}”. Nie jest wymagane ręczne umieszczanie plików ani konfiguracja ścieżek.

Jak zainstalować IronOCR w projekcie .NET?

Instalacja przez NuGet: „Install-Package IronOcr” w konsoli menedżera pakietów lub „dotnet add package IronOcr” w CLI. Dodatkowe pakiety językowe instaluje się w ten sam sposób. Nie jest wymagany natywny instalator SDK.

Czy IronOCR nadaje się do wdrożeń w Dockerze i kontenerach, w przeciwieństwie do Google Cloud Vision?

Tak. IronOCR działa w kontenerach Docker za pośrednictwem pakietu NuGet. Klucz licencyjny jest ustawiany za pomocą zmiennej środowiskowej. Silnik OCR nie wymaga żadnych plików licencyjnych, ścieżek SDK ani montowania woluminów.

Czy mogę wypróbować IronOCR przed zakupem, w porównaniu z Google Cloud Vision?

Tak. Tryb próbny IronOCR przetwarza dokumenty i zwraca wyniki OCR z nakładką znaku wodnego na wyjściu. Przed zakupem licencji można sprawdzić dokładność na własnych dokumentach.

Czy IronOCR obsługuje odczytywanie kodów kreskowych oprócz wyodrębniania tekstu?

IronOCR koncentruje się na wyodrębnianiu tekstu i OCR. Do odczytu kodów kreskowych firma Iron Software udostępnia bibliotekę IronBarcode jako dodatek. Obie biblioteki są dostępne osobno lub w ramach pakietu Iron Suite.

Czy łatwo jest przejść z Google Cloud Vision API na IronOCR?

Migracja z Google Cloud Vision API do IronOCR zazwyczaj obejmuje zastąpienie sekwencji inicjalizacyjnych instancjonowaniem IronTesseract, usunięcie zarządzania cyklem życia COM oraz aktualizację wywołań API. Większość migracji znacznie zmniejsza złożoność kodu.

Kannaopat Udonpant
Inżynier oprogramowania
Zanim stał się inżynierem oprogramowania, Kannapat ukończył doktorat z zasobów środowiskowych na Uniwersytecie Hokkaido w Japonii. W czasie studiowania, Kannapat również został członkiem Laboratorium Robotyki Pojazdów, które jest częścią Wydziału Inżynierii Bioprodukcji. W 2022 roku wykorzystał swoje umiejętności w ...
Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie