IRONSOFTWAREHOME
VIDEOLAR

C#'da Çok Çerçeveli GIF'leri ve TIFF'leri Okuma

Curtis Chau
Curtis Chau
Updated: 1 Ağustos 2026

Bu kılavuz, .NET geliştiricilerini PaddleSharp OCR'den (Sdcb.PaddleOCR) IronOCR'ye tam bir geçişte yönlendirir. Çıkarım oturum yönetiminin yerini almayı, OpenCV ön işleme bağımlılığını ortadan kaldırmayı, CPU, GPU, ve OpenVINO için arka uç seçim mantığını kaldırmayı ve tablo tanıma iş akışlarını taşımayı kapsar. Her bölüm, genel OCR karşılaştırmalarında görünmeyen PaddleSharp'a özgü desenlerden alınan öncesi ve sonrası kod örnekleri sağlar.

Neden PaddleSharp OCR'dan Geçiş Yapmalı

PaddleSharp, uygulama katmanında bir derin öğrenme çıkarım hattı sunar. Bu mimari, PaddlePaddle model performansına erişim sağlar ancak uygulamanızın, aksi takdirde altyapının ilgileneceği konuları yönetmesini gerektirir. Aşağıdaki sorun noktaları, çoğu .NET ekibini alternatif aramaya yönlendiren etkenlerdir.

Çıkarım Arka Plan Yapılandırması Uygulama Kodudur. PaddleSharp'ta CPU, GPU ve OpenVINO arka plan seçenekleri arasında seçim yapmak, PaddleConfig nesnelerinin oluşturulmasını ve yapılandırılmasını, dağıtım hedefi için doğru yerel çalışma zamanı NuGet paketini seçmeyi ve çalıştırma zamanında mevcut donanıma göre başlangıç kodunuzu koşullu olarak dallandırmayı gerektirir. Bu mantık kütüphanede değil, uygulamanızda yer alır ve hedef ortam değiştiğinde bozulur.

OpenCV, Görüntü Girdisi İçin Gereken Bir Bağımlılıktır. PaddleSharp bir dosya yolu veya akışı doğrudan kabul edemez. Her görüntü, OCR motoruna ulaşmadan önce OpenCV'nin Cv2.ImRead() içinden geçer. Bu, bağımlılık grafiğinize OpenCvSharp4 ve platforma özgü OpenCvSharp4.runtime.* paketini zorunlu kılar. Diğerini güncellemeden bir platform çalışma zamanını güncellemek, ortamlar arasında çoğaltması zor çalışma zamanı başarısızlıklarına neden olur.

Çıkarım Oturumu Ömrü Açık Tasarım Gerektirir. PaddleOcrAll, oluşturma zamanında diskten üç model ikili dosyası yükler. Maliyeti — yüzlerce milisaniye olarak ölçülebilir — nesnenin talep başına oluşturulamayacağı anlamına gelir. Takımlar bir yaşam döngüsü stratejisi tasarlamalıdır: singleton, havuzlu veya kapsamlı. ASP.NET Core içinde, bu tipik olarak dikkatli iplik güvenliği analizi ile kayıtlı bir hizmet anlamına gelir, çünkü PaddleOcrAll temel yerel durumu paylaşır.

Table Tanıma Ayrı Model İndirmeleri Gerektirir. PaddleSharp'ta yapılandırılmamış belge çıkarımı, standart üç aşamalı tespit/sınıflandırma/tanıma hattına ek olarak özel bir tablo tanıma modeline ihtiyaç duyar. Bu model indirilmesi, sürümü yapılması ve yapılandırılması gereken dördüncü dosyadır. Birleşik bir API yüzeyi yoktur — tablo tanıma, kendi sonuç türüne sahip ayrı bir kod yolunu kullanır.

Aranabilir PDF Çıktısı Yoktur. PaddleSharp metin dizeleri üretir. Aranabilir PDF dosyalarını yazamaz. Taralı belgeleri metin aranabilir PDF'ler olarak arşivlemesi gereken ekipler, ayrı bir PDF kütüphanesi entegre etmeli, o ek bağımlılığı yönetmeli ve bir dönüştürme katmanı yazmalıdır. Çıktı biçimi boşluğu tamamdır: hOCR yok, yapılandırılmış aranabilir PDF yok, metin katmanı bindirme yok.

Yukarı Akış Bağımlılık Zinciri .NET Topluluğuna Ait Değildir. PaddleSharp, Baidu'nun PaddlePaddle çıkarım çerçevesini sarmallar. PaddleOCR sürümleri arasında model formatı değişiklikleri geçmişte .NET bağlayıcı katmanını bozdu. Çoğu sorun takibi, belgeler ve sürüm tartışmaları Çince'de yapılmaktadır. .NET ekibi için Mandarin konuşmacıları olmayan yukarı akış projelerini izleyen ekipler için, kırıcı değişiklikler uyarı olmadan gelir.

Temel Sorun

PaddleSharp'ta bir arka ucu seçmek ve başlatmaya başlamak, OCR mantığında değil, altyapıda yer alması gereken yapılandırma kodu gerektirir:

// PaddleSharp: Backend selection sprawls into application startup
// Simplified — see Sdcb.PaddleInference documentation for full API
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;

// CPU-only deployment
var config = PaddleConfig.FromModelDir("models/det");
config.SetCpuMathLibraryNumThreads(4);

// GPU deployment — different package, different init path
// var config = PaddleConfig.FromModelDir("models/det");
// config.EnableGpu(500, 0);  // memoryMB, deviceId

// OpenVINO deployment — third conditional branch
// config.EnableMkldnn();

// Application code now owns the hardware topology decision
C#
// IronOCR:Hayırbackend selection.Hayırconfig objects. Zero hardware decisions.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var result = new IronTesseract().Read("document.jpg");
Console.WriteLine(result.Text);
// Runs on CPU, Linux, Docker, or ARM without a code change
C#

IronOCR vs PaddleSharp OCR: Özellik Karşılaştırması

İşte geçiş sırasında en önemli olan boyutlar boyunca doğrudan bir yetenek karşılaştırması:

ÖzellikPaddleSharp OCRIronOCR
NuGet paketleri gerekli3–4 minimum1
Görüntü giriş yöntemiOpenCV Cv2.ImRead()Doğrudan yol, akış veya byte dizisi
PDF girişi (yerel)HayırEvet
Şifre korumalı PDFHayırEvet
Çok sayfalı TIFFOpenCV aracılığıylaYerel
Aranabilir PDF çıktısıHayırEvet (result.SaveAsSearchablePdf())
hOCR içeri aktarmaHayırEvet
Arka uç seçimi (CPU/GPU/OpenVINO)Manuel PaddleConfigOtomatik
Ön işleme hattıManuel OpenCV işlemleriYerleşik (Deskew, DeNoise, Contrast, vb.)
Çıkarım oturumu yaşam süresi yönetimiManuel (pahalı yapılandırma)Hafif IronTesseract
Tablo tanıma modeliAyrı indirme ve kod yoluinput.LoadImage() + yapılandırılmış sonuç
Desteklenen diller~10–20125+
Dil kurulumuModel dosyası indirmeNuGet paketi
Çoklu dil aynı andaSınırlıEvet (OcrLanguage.French + OcrLanguage.German)
Bölge bazlı OCRDahili yokCropRectangle
OCR sırasında barkod okumaHayırEvet (ocr.Configuration.ReadBarCodes = true)
Güven skoruBölge başınaKelime başı, satır başı, sayfa başı
Yapılandırılmış çıktı hiyerarşisiDüz bölgeler listesiSayfalar → Paragraflar → Satırlar → Kelimeler → Karakterler
Çapraz platform dağıtımıKarmaşık (platform çalışma zamanı paketleri)Tek NuGet, tüm platformlar
Docker dağıtımıBirden çok katman, çalışma zamanı paketleriTek katman
Ticari destekGitHub sorunları (öncelikle Çince)E-posta desteği
Lisans modeliApache 2.0Süresiz ($999 Lite, $1,499 Pro, $2,999 Enterprise)

Hızlı Başlangıç: PaddleSharp OCR'dan IronOCR Geçişi

Adım 1: NuGet Paketini Değiştirin

PaddleSharp ve onun OpenCV bağımlılığını kaldırın:

dotnet remove package Sdcb.PaddleOCR
dotnet remove package Sdcb.PaddleInference
dotnet remove package OpenCvSharp4
dotnet remove package OpenCvSharp4.runtime.win
SHELL

NuGet kullanarak IronOCR'u yükleyin:

dotnet add package IronOcr

Adım 2: Ad Alanlarını Güncelleyin

PaddleSharp ad alanlarını tek IronOCR ad alanı ile değiştirin:

// Before (PaddleSharp)
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleInference;
using OpenCvSharp;

// After (IronOCR)
using IronOcr;
C#

Adım 3: Lisansa İzin Verin

Uygulama başlangıcında bir kez lisans başlatımı ekleyin — Program.cs, Startup.cs veya kompozisyon kökünüzde:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

Kod Göç Örnekleri

Çıkarım Oturum Süresi Değiştirme

PaddleSharp'ın PaddleOcrAll'ı, üç model ikili dosyasını oluşturma sırasında eşzamanlı olarak yüklemesi nedeniyle inşa edilmesi pahalıdır. Üretim uygulamaları, onu uzun ömürlü bir nesne olarak ele almalıdır, bu da belirli bir bağımlılık enjeksiyon modeli oluşturur. Atma zinciri de dikkat gerektirir çünkü altta yatan yerel kaynaklar doğru sırayla serbest bırakılmalıdır.

PaddleSharp OCR Yaklaşımı:

// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;
using Microsoft.Extensions.DependencyInjection;

// Expensive: loads 3 model files from disk on construction (~300–800ms)
public class PaddleOcrEngine : IDisposable
{
    private readonly PaddleOcrAll _ocr;
    private bool _disposed;

    public PaddleOcrEngine()
    {
        var detModel = LocalFullModels.ChineseV3.DetectionModel;
        var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
        var recModel = LocalFullModels.ChineseV3.RecognitionModel;

        // Must be singleton — cannot afford per-request construction
        _ocr = new PaddleOcrAll(detModel, clsModel, recModel);
    }

    public string Read(string imagePath)
    {
        using var mat = Cv2.ImRead(imagePath); // OpenCV required even for a file path
        var result = _ocr.Run(mat);
        return string.Join(" ", result.Regions.Select(r => r.Text));
    }

    public void Dispose()
    {
        if (!_disposed)
        {
            _ocr?.Dispose();
            _disposed = true;
        }
    }
}

// Startup.cs — forced singleton because of construction cost
services.AddSingleton<PaddleOcrEngine>();
C#

IronOCR Yaklaşımı:

using IronOcr;
using Microsoft.Extensions.DependencyInjection;

// IronTesseract has lightweight initialization — no model loading on construction
public class OcrEngine
{
    public string Read(string imagePath)
    {
        return new IronTesseract().Read(imagePath).Text;
    }
}

// Flexible registration — singleton, scoped, or transient all work
services.AddTransient<OcrEngine>();

// Or skip the wrapper entirely and inject IronTesseract directly
services.AddTransient<IronTesseract>();
C#

Zorunlu tekil durumdan esnek yaşam süresine geçiş önemlidir. PaddleSharp'un yapı maliyeti hizmet yaşam süresi kararınızı kilitler; IronOCR, uygulamanızın iş parçacığı ve istek izolasyonu gereksinimlerine dayalı olarak seçmenize izin verir. IronTesseract kurulum rehberi, yapılandırma seçeneklerini kapsar, örnek düzeyinde uygulanır.

OpenCV Ön İşleme Hattı Göçü

Düşük kaliteli taramalar yapan PaddleSharp ekipleri genellikle OCR motorunu çağırmadan önce bir OpenCV ön işleme hattı oluşturur. Bu hat, OpenCV'nin API yüzeyinin — herhangi bir OCR ön işleme görevinden gereksizce daha büyük — bilgisine ihtiyaç duyar. Yaygın işlemler — eğim düzeltme, gürültü giderme, kontrast uzatma — birden fazla Mat işlemi ve yerel bellek sızıntılarını önlemek için using bloklarıyla dikkatli bellek yönetimi gerektirir.

PaddleSharp OCR Yaklaşımı:

// Simplified — see OpenCvSharp documentation for full API
using OpenCvSharp;
using Sdcb.PaddleOCR;

public string ReadWithPreprocessing(string imagePath, PaddleOcrAll ocr)
{
    using var original = Cv2.ImRead(imagePath);

    // Step 1: Grayscale conversion
    using var gray = new Mat();
    Cv2.CvtColor(original, gray, ColorConversionCodes.BGR2GRAY);

    // Step 2: Denoise (Gaussian blur to reduce noise)
    using var denoised = new Mat();
    Cv2.GaussianBlur(gray, denoised, new Size(3, 3), 0);

    // Step 3: Adaptive threshold for binarization
    using var binary = new Mat();
    Cv2.AdaptiveThreshold(denoised, binary, 255,
        AdaptiveThresholdTypes.GaussianC, ThresholdTypes.Binary, 11, 2);

    // Step 4: Deskew — requires custom rotation detection logic (not shown)
    // Several dozen lines of custom Mat operations

    var result = ocr.Run(binary);
    return string.Join(" ", result.Regions.Select(r => r.Text));
    // Each Mat must be disposed; missing a using block leaks native memory
}
C#

IronOCR Yaklaşımı:

using IronOcr;

public string ReadWithPreprocessing(string imagePath)
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);

    // Named operations replace OpenCV knowledge requirements
    input.Deskew();
    input.DeNoise();
    input.Contrast();
    input.Binarize();

    var result = new IronTesseract().Read(input);
    return result.Text;
    // OcrInput implements IDisposable; using block handles cleanup
}
C#

Hiçbir Mat atama yok. Uyumlu eşik parametrelerinin bilgisi yok. Özel kenar kenarı döndürme matematiği yok. Aynı ön işleme hattı, 30–50 satır OpenCV kodu gerektiren, dört yöntem çağrısı haline gelir. görüntü kalite düzeltme rehberi, her mevcut filtreyi belgelemektedir, öncesi ve sonrası örneklerle. Yoğun arka plan gürültüsüne sahip belgeler için, input.DeepCleanBackgroundNoise() herhangi bir ek parametre olmadan DeNoise()'dan daha ileri gider.

Ön işleme gereksinimleri standart olmayan ekipler için, filtre sihirbazı, kodu taahhüt etmeden önce belirli belge türleriniz üzerinde filtre kombinasyonlarını değerlendirmek için etkileşimli bir araç sağlar.

Arka Uç Seçimi Kaldırma

PaddleSharp, çıkarım arka ucunu bir uygulama düzeyi kaygısı olarak sunar. Yalnızca CPU bulut VM'sinde çalışması gereken bir dağıtım, bir GPU iş istasyonu veya bir Intel OpenVINO uyumlu kenar aygıtını hedefleyen beklentilerden farklı başlatma kodu kullanır. Bu şartlı mantık genellikle uygulama başlangıç kodu, ortam değişkeni kontrolü veya özellik bayraklarında sona erer — metin okuma ile hiçbir ilgisi olmayan altyapı çalışması.

PaddleSharp OCR Yaklaşımı:

// Simplified — see Sdcb.PaddleInference documentation for full API
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;

public PaddleOcrAll CreateOcrEngine(string backendMode)
{
    // Each backend requires a different NuGet runtime package installed
    switch (backendMode)
    {
        case "gpu":
            // Requires: Sdcb.PaddleInference.runtime.win64.cuda
            // Requires: CUDA toolkit + cuDNN installed on host
            var gpuConfig = PaddleConfig.FromModelDir("models/");
            gpuConfig.EnableGpu(500, deviceId: 0); // Simplified
            break;

        case "openvino":
            // Requires: Sdcb.PaddleInference.runtime.win64.mkl
            var oviConfig = PaddleConfig.FromModelDir("models/");
            oviConfig.EnableMkldnn(); // Simplified
            break;

        default:
            // CPU-only — still requires platform-specific runtime package
            var cpuConfig = PaddleConfig.FromModelDir("models/");
            cpuConfig.SetCpuMathLibraryNumThreads(Environment.ProcessorCount);
            break;
    }

    // Backend-specific config passed to model constructors — Simplified
    var detModel = LocalFullModels.ChineseV3.DetectionModel;
    var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
    var recModel = LocalFullModels.ChineseV3.RecognitionModel;
    return new PaddleOcrAll(detModel, clsModel, recModel);
}
C#

IronOCR Yaklaşımı:

using IronOcr;

//Hayırbackend selection.Hayırswitch statement.Hayırenvironment variable check.
// The same code runs on CPU-only VMs, GPU workstations, and ARM devices.
public IronTesseract CreateOcrEngine()
{
    return new IronTesseract();
}

// Parallel processing across CPU cores — no GPU configuration required
public IEnumerable<string> ReadBatch(IEnumerable<string> imagePaths)
{
    var results = new System.Collections.Concurrent.ConcurrentBag<string>();
    Parallel.ForEach(imagePaths, path =>
    {
        var result = new IronTesseract().Read(path);
        results.Add(result.Text);
    });
    return results;
}
C#

Buradaki Parallel.ForEach deseni baştan iplik güvenlidir. Her IronTesseract örneği, paylaşılan yerel durum olmadan bağımsızdır. PaddleSharp dağıtımı arka uç şartlılarını yönetirken zaman harcayan ekipler için, bu basitleştirme aynı zamanda dağıtım güvenilirliğini de artırır — aynı yapı eseri, donanım algılama kodu olmadan her yerde çalışır. hız optimizasyon rehberi, verimlilik duyarlı senaryolar için yapılandırma seçeneklerini kapsar.

Tablo Tanıma Göçü

PaddleSharp'ta tablo çıkartımı, standart tanıma, sınıflandırma, tanıma setinin ötesinde dördüncü bir model dosyası olan özel bir tablo tanıma modeline ihtiyaç duyar. Tablo modeli ayrı bir API çağrısı kullanır ve kendi sonuç yapısını döndürür. Fatura, form veya elektronik tablonun işleme hatları oluşturan ekipler, iki paralel başlatma yolu ve iki sonuç-parselleme stratejisini sürdürmelidir.

PaddleSharp OCR Yaklaşımı:

// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;

public class TableRecognitionService
{
    // Standard OCR engine — 3 models
    private readonly PaddleOcrAll _textOcr;

    // Table engine — 4th model, separate initialization
    // private readonly PaddleOcrTable _tableOcr; // Simplified

    public TableRecognitionService()
    {
        var detModel = LocalFullModels.ChineseV3.DetectionModel;
        var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
        var recModel = LocalFullModels.ChineseV3.RecognitionModel;
        _textOcr = new PaddleOcrAll(detModel, clsModel, recModel);

        // Table model: separate download, separate version tracking
        // var tableModel = LocalFullModels.TableEnV2.Model; // Simplified
        // _tableOcr = new PaddleOcrTable(tableModel); // Simplified
    }

    public void ProcessDocument(string imagePath)
    {
        using var image = Cv2.ImRead(imagePath);

        // Text extraction path
        var textResult = _textOcr.Run(image);
        var text = string.Join(" ", textResult.Regions.Select(r => r.Text));

        // Table extraction path — different API, different result structure
        // var tableResult = _tableOcr.Run(image); // Simplified
        // foreach (var cell in tableResult.Cells) { ... } // Simplified
    }
}
C#

IronOCR Yaklaşımı:

using IronOcr;

public class TableRecognitionService
{
    // One engine handles both text and table regions
    public void ProcessDocument(string imagePath)
    {
        var ocr = new IronTesseract();
        var result = ocr.Read(imagePath);

        // Structured hierarchy: pages → paragraphs → lines → words
        foreach (var page in result.Pages)
        {
            foreach (var paragraph in page.Paragraphs)
            {
                Console.WriteLine($"Block at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
            }
        }

        Console.WriteLine($"Full document text: {result.Text}");
    }
}
C#

Tablo yapısının kendisi satır ve sütun olarak çıkarılması gereken belgeler için; IronOCR, özel bir tablo çıkarım yeteneği sunar:

using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice-with-table.jpg");

var result = ocr.Read(input);

// Access structured page layout for table region extraction
foreach (var page in result.Pages)
{
    foreach (var line in page.Lines)
    {
        // Lines within a table region preserve spatial ordering
        Console.WriteLine($"Row text: {line.Text} | Y position: {line.Y}");
        foreach (var word in line.Words)
        {
            Console.WriteLine($"  Cell: '{word.Text}' at X={word.X}");
        }
    }
}
C#

Bir model indirme ortadan kaldırıldı. Bir başlatma yolu ortadan kaldırıldı. IronOCR'deki yapılandırılmış sonuç hiyerarşisi — kelime düzeyindeki X/Y koordinatlarıyla — ayrı bir tanıma modeline gerek kalmadan tablo satırlarını ve sütunlarını yeniden oluşturmaya yönelik gereken pozisyonel verileri sağlar. tablo okuma rehberi ve sonuç okuma rehberi, tam yapılandırılmış çıktı API'sini kapsar.

Taratılmış Belgelerden Aranabilir PDF Çıktısı

PaddleSharp metin dizeleri üretir ve başka bir şey yok. Taranmış PDF'leri metin aranabilir yapmak için bir belge arşivi oluşturmak, ayrı bir PDF kütüphanesi entegre etmeyi, bir metin katmanı üzerine yazmayı ve iki kütüphaneyi uyum içinde yönetmeyi gerektirir. O kısıtlamayı kabul etmiş ekipler genellikle bu göç tetikleyicisidir — iki kütüphaneli entegrasyonun harcanan çabası, OCR sağlayıcılarını değiştirme çabalarını aşar.

PaddleSharp OCR Yaklaşımı:

// Simplified — PaddleSharp has no PDF output. Requires a separate PDF library.
// Example of what teams typically build:

// using Sdcb.PaddleOCR;
// using SomePdfLibrary; // Third dependency to produce searchable PDF

public void ArchiveScannedDocument(string imagePath, string outputPdfPath)
{
    // Step 1: OCR via PaddleSharp — produces text only
    // var text = _ocr.Run(Cv2.ImRead(imagePath));

    // Step 2: Build a PDF with text overlay using a separate PDF library
    // Requires: text positions mapped to PDF coordinate space
    // Requires: image embedded as background
    // Requires: invisible text layer positioned over image
    // ~50–100 lines of PDF construction code
    throw new NotImplementedException("Requires a separate PDF library");
}
C#

IronOCR Yaklaşımı:

using IronOcr;

public void ArchiveScannedDocument(string imagePath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    input.Deskew();   // Straighten scan before archiving
    input.DeNoise();  // Clean up scan artifacts

    var ocr = new IronTesseract();
    var result = ocr.Read(input);

    // One call: OCR + searchable PDF with text layer + image background
    result.SaveAsSearchablePdf(outputPdfPath);
}

// Multi-page document — same pattern
public void ArchiveMultiPageDocument(string[] imageFiles, string outputPdfPath)
{
    using var input = new OcrInput();
    foreach (var file in imageFiles)
        input.LoadImage(file);

    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
C#

PDF kütüphanesi yok. Koordinat haritalama yok. Metin katmanı konumlandırma yok. IronOCR'deki aranabilir PDF çıktı formatı, orijinal görüntü üzerine görünmez bir metin katmanı yerleştirir, taralı belgeye görsel olarak sadık olan ve tamamen metin aranabilir bir dosya üretir. aranabilir PDF nasıl yapılır, sayfa seçimi, kalite seçenekleri ve meta veri kontrolünü kapsar.

PaddleSharp OCR API'den IronOCR Haritalama Referansı

PaddleSharp OCRIronOCR
Sdcb.PaddleOCR (namespace)IronOcr (namespace)
Sdcb.PaddleInference (namespace)Gerek yok — otomatik yapılandırılmış
PaddleOcrAllIronTesseract
new PaddleOcrAll(det, cls, rec)new IronTesseract()
LocalFullModels.ChineseV3.DetectionModelEşdeğer yok — model seçimi yok
LocalFullModels.ChineseV3.ClassifierModelEşdeğer yok — model seçimi yok
LocalFullModels.ChineseV3.RecognitionModelEşdeğer yok — model seçimi yok
PaddleConfig.FromModelDir()Eşdeğer yok — yapılandırma nesnesi yok
config.EnableGpu(memMB, deviceId)Eşdeğer yok — arka uç otomatik
config.EnableMkldnn()Eşdeğer yok — arka uç otomatik
config.SetCpuMathLibraryNumThreads(n)Eşdeğer yok — içsel olarak yönetiliyor
Cv2.ImRead(path) (OpenCV yükleme)input.LoadImage(path)
ocr.Run(mat)ocr.Read(input) veya ocr.Read("file.jpg")
result.Regionsresult.Pages[0].Words veya result.Pages[0].Lines
region.Textword.Text, line.Text, paragraph.Text
region.Rect.Center.X/.Yword.X, word.Y
region.Score (confidence)word.Confidence, result.Confidence
Model düzeyinde dil değişimiocr.Language = OcrLanguage.French
Tablo modeli (ayrı indirme)Yerleşik yapılandırılmış sonuç hiyerarşisi
Cv2.CvtColor(..., GRAY)input.Binarize() veya input.Contrast()
Cv2.GaussianBlur(...)input.DeNoise()
Aranabilir PDF çıktısı yokresult.SaveAsSearchablePdf("output.pdf")

Yaygın Göç Sorunları ve Çözümleri

1. Sorun: OpenCV Bağımlılığı Yüklenemiyor

PaddleSharp OCR: OpenCvSharp4.runtime.win ve benzeri platforma özgü çalışma zamanı paketleri yönetilmeyen yerel DLL'ler kurar. Bu DLL'ler bazı barındırma senaryolarında - özellikle IIS uygulama havuzu geri dönüşümünde - doğru temizliği engelleyebilir ve yanlış platform çalışma zamanı paketi oluşturma zamanında başvurulursa derleme yükleme hatalarına neden olabilir. Bunları kaldırmak, hem NuGet paketini kaldırmayı hem de çıktı dizinindeki önbelleğe alınmış yerel ikili dosyaları temizlemeyi gerektirir.

Çözüm: OpenCvSharp4 ve OpenCvSharp4.runtime.* paketlerini kaldırdıktan sonra, yeniden derlemeden önce yapı çıktısı dizinini temizleyin:

dotnet remove package OpenCvSharp4
dotnet remove package OpenCvSharp4.runtime.win
dotnet clean
dotnet build
SHELL

IronOCR, yerel bağımlılıklarını dahili olarak paketler ve yönetilmeyen yaşam döngüsünü yönetir. Platforma özgü çalışma zamanı paketi seçimi gerekmez. IronTesseract kurulum rehberi, IronOCR'un otomatik olarak ele aldığı platform gereksinimlerini belgeliyor.

2. Sorun: Taşıma Sonrası Diskte Bırakılan Model Dosyaları

PaddleSharp OCR: PaddleSharp tarafından indirilen model dosyaları (algılama, sınıflandırma, tanıma ve herhangi bir tablo modeli), tipik olarak uygulamaya göre ilgili bir models/ dizininde veya yapılandırılmış bir yolda saklanır. Bu dosyalar, NuGet paketi kaldırıldığında kaldırılmaz. Bir Docker imajında gereksiz katman boyutu eklerler. Bir dağıtım hattında, eski yollardaki bayat model dosyaları, herhangi bir kalıntı başlatma kodu bunlara başvurursa başlatma hatalarına neden olabilir.

Çözüm: Taşımanın bir parçası olarak model dizinlerini açıkça kaldırın. Başlatma yapılandırmasını herhangi bir yol referansı için inceleyin:

# Locate model directory references in application code
grep -r "LocalFullModels\|ModelPath\|models/" --include="*.cs" .
grep -r "DetectionModel\|RecognitionModel\|ClassifierModel" --include="*.cs" .
SHELL

Model referansları kaldırıldıktan ve IronOCR başlatıldıktan sonra, model dizinini depodan ve Docker yapı bağlamından silin.

3. Sorun: Singleton Yaşam Süresi Varsayımı Taşıma Sonrası Bozuluyor

PaddleSharp OCR: PaddleOcrAll, oluşturma maliyeti talep başına oluşturulmayı pratik olmayan hale getirdiği için singleton olarak kaydedildi. IronOCR'u aynı tek başına kayıt altına alan taşıma kodu, gereksiz durum paylaşımını istekler arasında tanıtır. IronTesseract eşzamanlı olarak kullanıldığında iplik güvenliğe sahip olmasına rağmen, tek bir örneği paylaşmak gerekli değildir - her örnek bağımsızdır.

Çözüm: Singleton kaydının performans dışında bir amaca hizmet edip etmediğini değerlendirin. Çoğu ASP.NET Core uygulaması için geçici kayıt,IronOCR ile daha temiz bir seçenektir:

// PaddleSharp — forced singleton due to construction cost
services.AddSingleton<PaddleOcrAll>(sp =>
{
    var det = LocalFullModels.ChineseV3.DetectionModel;  // Simplified
    var cls = LocalFullModels.ChineseV3.ClassifierModel; // Simplified
    var rec = LocalFullModels.ChineseV3.RecognitionModel; // Simplified
    return new PaddleOcrAll(det, cls, rec);
});

//IronOCR— transient works; no expensive construction
services.AddTransient<IronTesseract>();
C#

Yüksek verimli toplu senaryolarda, explicit örnek yeniden kullanımı istediğinizde, tek başına veya havuzlanmış bir model yine de çalışır — ancak bu bir performans tercihidir, doğruluk gereksinimi değil.

4. Sorun: Sonuç Bölgesi Sıralaması Artık Gerekli Değil

PaddleSharp OCR: result.Regions, algılama sırası ızgarada sağlanan okuma sırasıyla eşleşmeyen algılanmış metin bölgelerini döndürür. Takımlar genellikle bölge metni birleştirmeden önce .Rect.Center.Y ve ardından .Rect.Center.X ile sıralama uygular - bu desen neredeyse her PaddleSharp metin çıkartma uygulamasında görünmektedir. Bu desenin harfi harfine IronOCR'a taşınması gereksiz kod üretir.

Çözüm: IronOCR, sonuçları varsayılan olarak okuma sırasına göre döndürür. Sıralamayı kaldırın:

// PaddleSharp — manual reading-order sort required
var text = string.Join("\n", result.Regions
    .OrderBy(r => r.Rect.Center.Y)
    .ThenBy(r => r.Rect.Center.X)
    .Select(r => r.Text));

//IronOCR— result.Text is already in reading order; no sort needed
var text = result.Text;

// For word-level access with position, use the structured hierarchy directly
foreach (var word in result.Pages[0].Words)
{
    Console.WriteLine($"{word.Text} at ({word.X},{word.Y})");
}
C#

5. Sorun: Arka Uç Koşullu Paketler Geri Yüklemeyi Bozuyor

PaddleSharp OCR: Bazı PaddleSharp kurulumları, hedef ortama bağlı olarak farklı Sdcb.PaddleInference.runtime.* paketlerine koşullu olarak referans verir (GPU için CUDA, OpenVINO için MKL, yalnızca CPU). Bu bazen .csproj koşulları veya dağıtım hedefi başına ayrı proje dosyaları olarak görünür. Ortaya çıkan derleme matrisi, yanlış paket seti geri yüklendiğinde CI boru hatlarını bozar.

Çözüm: PaddleSharp paketlerini kaldırdıktan sonra, platform veya OpenCV koşullu .csproj bloklarını başvuran PackageReference dosyasını denetleyin ve tamamen kaldırın:

grep -n "Sdcb\|OpenCvSharp\|PaddleInference" *.csproj
SHELL

IronOCR, platform koşulları olmadan tek bir IronOcr paket referansı kullanır. Aynı paket, Windows, Linux ve macOS'ta doğru bir şekilde geri yüklenir.

6. Sorun: Tablo Sonuç Yapısının Doğrudan Bir Eşdeğeri Yok

PaddleSharp OCR: PaddleOcrTable, her tanınan hücre için satır ve sütun indeksleri içeren hücre tabanlı bir yapı döndürür. Bu yapıyı tüketen kod genellikle (row, column) tarafından indekslenen iki boyutlu bir dizi oluşturur. IronOCR, aynı hücre-indeks yapıyı sağlamaz — bir hücre ızgarasını yeniden yapılandırmak için uzaysal gruplama gerektiren kelime ve satır koordinatları sağlar.

**Çözüm:**IronOCR kelime koordinatlarından tablo yapısını satırlar için Y-konumu gruplaması ve sütunlar için X-konumu sıralaması kullanarak yeniden yapılandırın. Tablo okuma nasıl yapılır, yaygın tablo formatları için uzaysal gruplama yaklaşımı sağlar. Saha pozisyonları bilinen yapılandırılmış faturalar için, bölge tabanlı OCR ile CropRectangle, tam sayfa tablo çıkartmasından daha temiz bir modeldir:

using IronOcr;

// Target specific table cells by region instead of full-page table detection
var totalAmountRegion = new CropRectangle(400, 600, 200, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("invoice.jpg", totalAmountRegion);

var result = new IronTesseract().Read(input);
Console.WriteLine($"Total: {result.Text}");
C#

PaddleSharp OCR Taşıma Kontrol Listesi

Öncesi-Geçiş

Paketleri çıkarmadan önce kod tabanındaki tüm PaddleSharp referanslarını denetleyin:

# Find all PaddleSharp and PaddleInference usages
grep -rn "Sdcb\.PaddleOCR\|Sdcb\.PaddleInference" --include="*.cs" .

# Find OpenCV usages that will need replacement
grep -rn "OpenCvSharp\|Cv2\.\|using var.*Mat\b" --include="*.cs" .

# Find model path references and configuration
grep -rn "LocalFullModels\|ModelDir\|DetectionModel\|RecognitionModel\|ClassifierModel" --include="*.cs" .

# Find backend selection logic
grep -rn "EnableGpu\|EnableMkldnn\|PaddleConfig\|SetCpuMath" --include="*.cs" .

# Find table recognition usages
grep -rn "PaddleOcrTable\|TableModel\|table.*ocr\|ocr.*table" --include="*.cs" .

# Find result region access patterns that need updating
grep -rn "\.Regions\b\|Rect\.Center\|region\.Text" --include="*.cs" .
SHELL

Diskteki model dosyalarının envanterini çıkarın ve yollarını not edin. Tüm dağıtım hedeflerini ve herhangi birinin GPU veya OpenVINO özel NuGet koşulları içerip içermediğini .csproj içinde envanterleyin. PaddleSharp oluşturma maliyeti nedeniyle tek başına kayıtlı herhangi bir hizmeti not edin.

Kod Geçişi

  1. Her proje dosyasından tüm Sdcb.PaddleOCR, Sdcb.PaddleInference, OpenCvSharp4 ve OpenCvSharp4.runtime.* NuGet paketlerini kaldırın.
  2. IronOcr NuGet paketini yükleyin.
  3. Gereken diller için dil NuGet paketlerini yükleyin (örneğin, IronOcr.Languages.ChineseSimplified).
  4. Uygulama başlangıcına IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; ekleyin.
  5. Tüm using Sdcb.PaddleOCR, using Sdcb.PaddleInference ve using OpenCvSharp ifadelerini using IronOcr ile değiştirin.
  6. PaddleOcrAll oluşturma ve model yüklemeyi new IronTesseract() ile değiştirin.
  7. Tüm PaddleConfig arka plan seçim bloklarını (CPU, GPU, OpenVINO koşulları) silin.
  8. Cv2.ImRead(path) çağrılarını input.LoadImage(path) ile, OcrInput kullanarak değiştirin.
  9. OpenCV ön işleme işlemlerini (CvtColor, GaussianBlur, Threshold vb.) OcrInput filtre yöntemleri (Deskew(), DeNoise(), Contrast(), Binarize()) ile değiştirin.
  10. ocr.Run(mat) çağrılarını ocr.Read(input) ile değiştirin.
  11. result.Regions sayımını result.Pages, result.Pages[n].Lines veya result.Pages[n].Words ile değiştirin.
  12. .OrderBy(r => r.Rect.Center.Y).ThenBy(r => r.Rect.Center.X) sıralama zincirlerini kaldırın — okuma sırası otomatik.
  13. Bölge tabanlı hedefleme veya koordinat tabanlı kelime gruplaması ile PaddleOcrTable başlatma ve sonuç ayrıştırmasını değiştirin.
  14. Aranabilir bir PDF arşivi gerektiğinde her yerde result.SaveAsSearchablePdf(path) ekleyin.
  15. Hizmet yaşam süresi kayıtlarını yeniden değerlendirin: PaddleSharp oluşturma maliyeti nedeniyle yönlendirilen tekil kayıtlar genellikle geçici veya kapsamlı hale gelebilir.
  16. Diskten model dosyalarını silin ve Docker yapı bağlamlarından model dizinlerini kaldırın.
  17. Platforma özgü Paddle veya OpenCV kurulum paketleri için herhangi bir .csproj koşullu PackageReference bloklarını kaldırın.

Geçiş Sonrası

  • Metin çıkarma çıktısının, boru hattındaki her belge türünden temsil edici 20-30 dokümanda PaddleSharp çıktısıyla eşleştiğini veya aştığını doğrulayın.
  • Uygulama başlangıç günlüklerinde OpenCvSharp ile ilgili monte yükleme istisnalarının olmadığını doğrulayın.
  • Windows, Linux, Docker'da her hedef platformda dağıtımı test edin ve aynı yapı eseri kullanarak — platforma özgü paket seçimi gerektiği konusunda emin olun.
  • Önceden manuel sonuç sıralaması gerektiren belgelerin result.Text ile doğru sıralı metin ürettiğini doğrulayın.
  • Adobe Acrobat Reader veya tercih ettiğiniz bir PDF görüntüleyicisinde aranabilir PDF çıktı dosyalarının metin aramaya uygun olduğunu doğrulayın.
  • Talep başına oluşturulan IronTesseract örneklerinin, talep başına PaddleOcrAll inşasına kıyasla bellek basıncı üretmediğini doğrulamak için uygulamayı yük altında çalıştırın.
  • Dil paketlerinin NuGet paketleri olarak yüklendiğini ve CI'de herhangi bir ek dosya yayım adımı olmaksızın doğru bir şekilde geri yüklendiğini doğrulayın.
  • Beklenen satır/sütun yapısına karşı her tablo ayıklama senaryosunu test edin ve bölgeye dayalı veya koordinat gruplama yaklaşımı uygulayın.
  • Başlangıç yolundan PaddleOcrAll singleton oluşturmayı ortadan kaldırdıktan sonra uygulama başlangıç süresinin azaldığını doğrulayın.

IronOCR'a Geçişin Ana Faydaları

Bir Paket, Dört Paketli Yığını Değiştirir. Geçişten sonra, OCR bağımlılık yükü tek bir IronOcr NuGet referansıdır. Dört paketli yığın - Sdcb.PaddleOCR, Sdcb.PaddleInference, OpenCvSharp4 ve platforma özgü bir çalışma zamanı - proje dosyasında bir giriş olur. Bağımlılık denetimleri, lisans taramaları ve güvenlik açığı izleme şimdi dört yerine bir yüzeyi kapsar.

Dağıtım Eserleri Tanıtımdan Ortamlara Kadar Tutarlıdır. Arka uç seçimi koşulları — CPU vs. GPU vs. OpenVINO — ortadan kalktı. Aynı yapı eseri geliştirici dizüstü bilgisayarına, CI runner'a, Linux konteynerine ve bulut VM'ye ortamdan bağımsız paket seçimi veya başlatım dalı olmadan dağıtılır. Docker görüntüleri küçülür çünkü COPY model dosyaları yoktur ve yüklemek için platform çalışma zamanı paketleri yoktur.

Belge Arşiv Hattı Artık İkinci Bir Kütüphane Gerektirmez. result.SaveAsSearchablePdf(), çoğu PaddleSharp takımının aranabilir arşivler üretmek için eklediği PDF kütüphane bağımlılığını ortadan kaldırır. OCR geçişi ve aranabilir PDF yazımı tek bir API çağrısıdır. Günde binlerce taranmış belge işleyen takımlar için, bu basitleştirme kütüphane versiyonu çakışmalarının tüm bir sınıfını ortadan kaldırır. aranabilir PDF'ler blog üretim ölçeğindeki dikkate almakla ilgili.

Hizmet Ömrü Kararları, Kütüphane Kısıtlamalarını Değil, Uygulama Gereksinimlerini Yansıtır. IronTesseract hafif bir yapıya sahiptir. PaddleSharp'un pahalı model yükleme nedeniyle yönlendirilen zorunlu tekil model artık gereksiz. Hizmetler, ASP.NET Core'da isteğe göre kapsamlı olabilir, eşzamanlı kullanıcılar arasında daha temiz bir izolasyon yaratır ve paylaşılan durum iş parçacığı endişelerini ortadan kaldırır. Dağıtım seçenekleri hakkında daha fazla bilgi için ASP.NET OCR kullanım durumu sayfasını izleyin.

Dil Genişletme Bir Araştırma Projesi Değildir, Bir Paket Kurulumudur. 125+ dil kataloğu, Avrupa, Asya, Orta Doğu ve özel scriptleri NuGet paketleri olarak kapsar. Çince olarak başlayan bir hat boyunca Fransızca, Almanca, Arapça veya Japonca eklemek dotnet add package IronOcr.Languages.French ve bir yapılandırma satırıdır. Model dosya kaynağı yoktur, yukarı akış kullanılabilirlik araştırması yoktur, manuel dosya konuşlandırması yoktur.

Ön İşleme OCR API'sinin Bir Parçasıdır. PaddleSharp ön işleme gerektiren OpenCV bilgisiyken - filtre çekirdeklerini anlama, Mat imhasını yönetme, uyarlanabilir eşik parametrelerini seçme - OCR çalışması için artık önkoşul değildir. OcrInput, mantıklı varsayılanlarla adlandırılmış işlemler sağlar. OpenCV uzmanı olmayan ancak OpenCV ön işleme kodunu koruyan takımlar bu kodu herhangi bir yerine geçmeden silebilir. ön işleme özellikleri sayfası her mevcut filtreyi ve her birini ne zaman uygulayacağınızı listeleyen belgeyi içerir.

Lütfen dikkate alın: Adobe Acrobat, PaddleOCR ve Tesseract ilgili sahiplerinin tescilli markalarıdır. Bu site, Adobe Inc., Baidu, Google veya PaddlePaddle ile bağlantılı değil, desteklenmiyor veya sponsor olunmuyor. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.
Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez