C# Kullanarak Daha İyi OCR Sonuçları için Görüntü Kalitesini Artırma
.NET geliştiricilerini IronOCR'a tam bir geçiş sürecinden geçiren bu kılavuz, Sdcb.PaddleOCR paket ailesinden nasıl geçileceğini açıklar. Tam değiştirme yolunu kapsar: çok paketli PaddlePaddle yığınını kaldırma, model dosyası yönetimini ve GPU yapılandırmasını ortadan kaldırma ve OpenCV bağımlı sonuç çıkarma boru hattını tek bir NuGet yüklemesi ile değiştirme. Her bölüm, kendine yeterlidir — karşılaştırma makalesinin önceden okunması gerekmez.
PaddleOCR'den Neden Geçiş Yapmalısınız
Sdcb.PaddleOCR kaplaması, PaddlePaddle'ın Python derin öğrenme ekosistemi ile .NET arasında topluluk tarafından desteklenen bir köprüdür. İşini yapar, ancak o köprünün tüm yükünü taşır — model dosyaları, yerel sonuç çıkarma ikili dosyaları, görüntü yükleme için OpenCV ve isteğe bağlı CUDA altyapısı. Çoğu .NET OCR iş yükü için, bu proje için hiç gerek duyulmayan bir altyapıdır.
Tek Karakter Okunmadan Önce Üç Model Dizini. PaddleOCR'un sonuç çıkarma boru hattı, üç sinir ağı zincirler: bir tespit modeli, bir yön sınıflandırma modeli ve bir tanıma modeli. Her ağ, diskte var olması gereken .pdmodel ve .pdiparams dosyalarının ayrı bir dizinidir, böylece new PaddleOcrAll(models) çalışan bir motor haline gelir. Bu dosyalar, Baidu'nun Çin'deki bj.bcebos.com depolamasına bağlanan bir asenkron indirme çağrısı yoluyla veya elle bakılan bir models/ dizin ağacı yoluyla gelir, modelin sürüm kontrolü geliştiricinin sorumluluğundadır. Sdcb.PaddleOCR güncelleme yaptığında, önceki sürümden indirilen modelleri tekrar indirmeniz gerekebilir. IronOCR, model dosyaları, model dizinleri ve sürüm senkronizasyonu sorunu içermez. Motor, NuGet paketine dahil edilir.
OpenCV Zorunludur. Bir dosya yolundan PaddleOCR tahmini aşamasına OpenCvSharp'ı devre dışı bırakarak geçiş yapmak mümkün değildir. Format ne olursa olsun her resim, Cv2.ImRead(path) aracılığıyla bir Mat nesnesi haline gelmeden önce geçmelidir ve ocr.Run(mat) bunu kabul edebilir. Bu, iki ekstra NuGet paketini (OpenCvSharp4 ve OpenCvSharp4.runtime.win), dağıtım çıktısında platforma özgü yerel DLL'leri ve Dockerfile'da bir apt-get install libopencv-dev satırını ifade eder. IronOCR, dosya yollarını, akışları, bayt dizilerini ve System.Drawing.Bitmap doğrudan kabul eder. Mat aracı mevcut değildir.
GPU Yapılandırması Çok Günlük Bir Projedir. PaddleOCR'un ilan edilen GPU performans rakamları — resim başına 50-100ms, CPU üzerinde 300-500ms'ye karşı — gerçektir. Bunu başarmak belirli bir sürümde NVIDIA sürücüleri, CUDA Toolkit 11.8 (12.x değil), doğru PATH konumlarına yerleştirilmiş cuDNN 8.6+ ve ayrı bir GPU çalışma zamanı NuGet paketi gerektirir. Docker'da, temel görüntü nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 olmalı ve ana makine nvidia-container-toolkit kurulu olmalıdır. Varlıklı olmayan GPU altyapısına sahip ekipler, ortam başına CUDA yapılandırması için 2-8 saat harcar. IronOCR, CPU sonuç çıkarma için tasarlandı, standart donanımda görüntü başına 150-300ms sunar ve GPU ayarı gerektirmez.
Dağıtım Artifaktları 4-6 kat Daha Büyük. PaddleOCR dağıtım çıktısı, paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB), opencv_world*.dll dosyaları (~50MB toplam) ve model dizinlerini (~21MB) içerir. Bir Docker görüntüsü yaklaşık 1.5GB ulaşıyor. Bir IronOCR dağıtımı toplamda yaklaşık 80MB'dir; Docker görüntüsü yaklaşık 400MB ulaşıyor. Fark, CI/CD'de birleşir: NuGet paketlerini geri yükleyen her boru hattı çalıştırması, Baidu'dan modelleri indirmeniz veya ayrı bir önbellek katmanından çekmeniz gerekir.
Aranabilir bir PDF Çıkışı Yok. PaddleOCR, görüntülerden metin bölgelerini geri döndürür ve tanınan metni PDF'ye aranabilir bir katman olarak yerleştirme mekanizmasına sahip değildir. PaddleOCR çıktısından aranabilir bir PDF oluşturma, üçüncü taraf bir PDF kütüphanesi, sayfa bazında metin katmanı ekleme ve koordinat yeniden eşleme gerektirir. IronOCR, sadece bir satırla tamamen aranabilir bir PDF üretir: result.SaveAsSearchablePdf("output.pdf").
Temel Sorun
PaddleOCR, sonuç çıkarma başlamadan önce üç model dizini gerektirir:
// PaddleOCR: three model directories, all must exist and match the wrapper version
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"), // ~5MB
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"), // ~2MB
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer") // ~15MB
);
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("document.png"); // OpenCvSharp required for every image
PaddleOcrResult result = ocr.Run(mat);
// PaddleOCR: three model directories, all must exist and match the wrapper version
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"), // ~5MB
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"), // ~2MB
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer") // ~15MB
);
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("document.png"); // OpenCvSharp required for every image
PaddleOcrResult result = ocr.Run(mat);
Imports OpenCvSharp
Imports PaddleOCR
' PaddleOCR: three model directories, all must exist and match the wrapper version
Dim models As New FullOcrModel(
LocalDetectionModel.FromDirectory("models/ch_PP-OCRv4_det_infer"), ' ~5MB
LocalClassificationModel.FromDirectory("models/ch_ppocr_mobile_v2.0_cls_infer"), ' ~2MB
LocalRecognitionModel.FromDirectory("models/ch_PP-OCRv4_rec_infer") ' ~15MB
)
Using ocr As New PaddleOcrAll(models)
Using mat As Mat = Cv2.ImRead("document.png") ' OpenCvSharp required for every image
Dim result As PaddleOcrResult = ocr.Run(mat)
End Using
End Using
IronOCR'un model dosyaları, model dizinleri veya OpenCV bağımlılığı yoktur:
// IronOCR: one package, zero model management
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
// IronOCR: one package, zero model management
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("document.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
IronOCR vs PaddleOCR (.NET): Özellik Karşılaştırması
Aşağıdaki tablo, geçiş planlamasında en önemli olan boyutları kapsar.
| Özellik | PaddleOCR (Sdcb) | IronOCR |
|---|---|---|
| NuGet paketleri gerekli | 4-5 | 1 |
| Model dosyaları gerekli | Evet (3 dizin, ~21MB) | Hayır (pakette dahil) |
| Model indirme kaynağı | Baidu sunucuları (bj.bcebos.com) | NuGet geri yükleme (Iron Software) |
| OpenCV bağımlılığı | Gerekli (OpenCvSharp4) | None |
| Görüntü girişi | Via Mat mat = Cv2.ImRead() |
Doğrudan dosya yolu, akış, bayt dizisi |
| Yerel PDF girişi | Hayır | Evet (input.LoadPdf()) |
| Aranabilir PDF çıktısı | Hayır | Evet (result.SaveAsSearchablePdf()) |
| Çoklu-çerçeve TIFF girişi | Çerçeve başına manuel döngü | input.LoadImageFrames() |
| GPU desteği | Evet (CUDA 11.8 + cuDNN gerekli) | CPU'ya optimize edilmiş (GPU gerekmez) |
| Dahili ön işleme | Hayır (sinir ağı çarpıklık/gürültü ile başa çıkar) | Evet (Deskew, DeNoise, Kontrast, Binarize, Keskinleştir) |
| Desteklenen diller | 14 | 125+ |
| Dil yükleme yöntemi | Her dil modeli için DownloadAsync() |
dotnet add package IronOcr.Languages.* |
| Çoklu dil aynı anda | Hayır (ayrı dil başına model) | Evet (OcrLanguage.English + OcrLanguage.French) |
| Yapılandırılmış çıktı | result.Regions (mekansal, sıralanmamış) |
Sayfalar, Paragraflar, Satırlar, Kelimeler, Karakterler |
| Güven puanlama | Bölge başına kayan nokta (0-1) | Kelime başına yüzde (0-100) |
| Barkod okuma | Hayır | Evet (ocr.Configuration.ReadBarCodes = true) |
| hOCR içeri aktarma | Hayır | Evet |
| Dağıtım boyutu | 300-500MB | ~80MB |
| Docker görüntü boyutu | ~1.5GB (CUDA tabanlı) | ~400MB |
| Soğuk başlatma zamanı | 3-5 saniye (model yükleme) | 1 saniyeden az |
| Çapraz platform | Windows, Linux (kısmi) | Windows, Linux, macOS, Docker, Azure, AWS |
| .NET uyumluluğu | .NET 6+ (topluluk sarmalayıcısı) | .NET Framework 4.6.2+, .NET 5/6/7/8/9 |
| Ticari destek | Topluluk / GitHub sorunları | Evet (Iron Software, SLA ile birlikte) |
| Lisans | Apache 2.0 (ücretsiz) | Süresiz ($999 Lite / $1,499 Pro / $2,999 Enterprise) |
Hızlı Başlangıç: PaddleOCR (.NET) to IronOCR Geçişi
Adım 1: NuGet Paketlerini Değiştirin
PaddleOCR ile ilgili beş paketin hepsini kaldırın:
dotnet remove package Sdcb.PaddleOCR
dotnet remove package Sdcb.PaddleOCR.Models.Online
dotnet remove package Sdcb.PaddleInference.runtime.win64.mkl
dotnet remove package OpenCvSharp4
dotnet remove package OpenCvSharp4.runtime.win
dotnet remove package Sdcb.PaddleOCR
dotnet remove package Sdcb.PaddleOCR.Models.Online
dotnet remove package Sdcb.PaddleInference.runtime.win64.mkl
dotnet remove package OpenCvSharp4
dotnet remove package OpenCvSharp4.runtime.win
GPU çalışma zamanı yüklüyse, onu da kaldırın:
dotnet remove package Sdcb.PaddleInference.runtime.win64.cuda118
dotnet remove package Sdcb.PaddleInference.runtime.win64.cuda118
NuGet paketi sayfasından IronOCR yükleyin:
dotnet add package IronOcr
Adım 2: Ad Alanlarını Güncelleyin
PaddleOCR ve OpenCvSharp ad alanı içe aktarmalarının hepsini değiştirin:
// Before (PaddleOCR)
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
// After (IronOCR)
using IronOcr;
// Before (PaddleOCR)
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference;
using OpenCvSharp;
// After (IronOCR)
using IronOcr;
Imports IronOcr
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models
Imports Sdcb.PaddleOCR.Models.Online
Imports Sdcb.PaddleInference
Imports OpenCvSharp
Adım 3: Lisansa İzin Verin
Herhangi bir IronTesseract örneği oluşturulmadan önce, uygulama başlatıldığında lisans başlatma ekleyin:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Ücretsiz bir deneme anahtarı IronOCR lisanslama sayfasından mevcuttur. Deneme, filigranlı çıktı üretir ve satın almadan önce tam özellik testi yapılmasına izin verir.
Kod Göç Örnekleri
Yerel Model Yolu Yapılandırmasının Ortadan Kaldırılması
Çalışma zamanında Baidu sunucu bağlantılarını önlemek için PaddleOCR model dosyalarını önceden indiren projeler, üç ayrı dizin yolunu yapılandırmalıdır. Bu yapılandırma, sarmalayıcı sürümü değiştiğinde güncellenmelidir.
PaddleOCR Yaklaşımı:
// Local model configuration — developer owns the directory structure
// Each wrapper update may require re-downloading model files
string modelsRoot = Path.Combine(AppContext.BaseDirectory, "models");
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_det_infer")),
LocalClassificationModel.FromDirectory(
Path.Combine(modelsRoot, "ch_ppocr_mobile_v2.0_cls_infer")),
LocalRecognitionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_rec_infer"))
);
// Fails at runtime if any of the three directories is missing or stale
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("document.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
// Local model configuration — developer owns the directory structure
// Each wrapper update may require re-downloading model files
string modelsRoot = Path.Combine(AppContext.BaseDirectory, "models");
FullOcrModel models = new FullOcrModel(
LocalDetectionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_det_infer")),
LocalClassificationModel.FromDirectory(
Path.Combine(modelsRoot, "ch_ppocr_mobile_v2.0_cls_infer")),
LocalRecognitionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_rec_infer"))
);
// Fails at runtime if any of the three directories is missing or stale
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("document.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine(result.Text);
Imports System
Imports System.IO
' Local model configuration — developer owns the directory structure
' Each wrapper update may require re-downloading model files
Dim modelsRoot As String = Path.Combine(AppContext.BaseDirectory, "models")
Dim models As New FullOcrModel(
LocalDetectionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_det_infer")),
LocalClassificationModel.FromDirectory(
Path.Combine(modelsRoot, "ch_ppocr_mobile_v2.0_cls_infer")),
LocalRecognitionModel.FromDirectory(
Path.Combine(modelsRoot, "ch_PP-OCRv4_rec_infer"))
)
' Fails at runtime if any of the three directories is missing or stale
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead("document.png")
Dim result As PaddleOcrResult = ocr.Run(mat)
Console.WriteLine(result.Text)
End Using
End Using
IronOCR Yaklaşımı:
//Hayırmodel directories, no path configuration, no version matching
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
//Hayırmodel directories, no path configuration, no version matching
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("document.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
models/ dizin ağacı, üç FromDirectory() çağrısı ve sürüm senkronizasyon kaygısı tamamen ortadan kalkar.IronOCR motoru, geri yükleme sırasında NuGet paketinin içinde yer alır ve çalışma zamanı yol çözümlemeleri gerektirmez. Lisans anahtarını appsettings.json yerine koymayı da içeren başlatma seçenekleri için IronTesseract kurulum kılavuzu'na bakın.
İki Aşamalı Tespit ve Tanıma Boru Hattı Konsolidasyonu
PaddleOCR'un döndürme ve yönlendirme altyapısı, PaddleOcrAll üzerindeki özellikler aracılığıyla yapılandırılır. Bu davranış IronOCR'da OcrInput ön işleme yöntemlerini kullanarak çoğaltılır, bu yöntemler aynı belge sorunlarını daha basit bir çağrı yüzeyi ile ele alır.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Separate async initialization step — blocks startup for 3-5 seconds on cold run
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true, // Enables 0/90/180/270 degree rotation detection
Enable180Classification = true // Additional pass for upside-down text
};
// OpenCV Mat required — no direct file path support
using Mat mat = Cv2.ImRead("rotated-scan.png");
if (mat.Empty())
{
throw new FileNotFoundException("Image could not be loaded by OpenCvSharp");
}
// Three neural network passes: detection → classification → recognition
PaddleOcrResult result = ocr.Run(mat);
// Regions arrive in spatial order, not reading order
// Manual sort required for top-to-bottom, left-to-right output
var orderedRegions = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in orderedRegions)
{
Console.WriteLine($"{region.Text} (confidence: {region.Score:P1})");
}
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Separate async initialization step — blocks startup for 3-5 seconds on cold run
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models)
{
AllowRotateDetection = true, // Enables 0/90/180/270 degree rotation detection
Enable180Classification = true // Additional pass for upside-down text
};
// OpenCV Mat required — no direct file path support
using Mat mat = Cv2.ImRead("rotated-scan.png");
if (mat.Empty())
{
throw new FileNotFoundException("Image could not be loaded by OpenCvSharp");
}
// Three neural network passes: detection → classification → recognition
PaddleOcrResult result = ocr.Run(mat);
// Regions arrive in spatial order, not reading order
// Manual sort required for top-to-bottom, left-to-right output
var orderedRegions = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X);
foreach (var region in orderedRegions)
{
Console.WriteLine($"{region.Text} (confidence: {region.Score:P1})");
}
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
' Separate async initialization step — blocks startup for 3-5 seconds on cold run
Dim models As FullOcrModel = Await OnlineFullModels.EnglishV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models) With {
.AllowRotateDetection = True, ' Enables 0/90/180/270 degree rotation detection
.Enable180Classification = True ' Additional pass for upside-down text
}
' OpenCV Mat required — no direct file path support
Using mat As Mat = Cv2.ImRead("rotated-scan.png")
If mat.Empty() Then
Throw New FileNotFoundException("Image could not be loaded by OpenCvSharp")
End If
' Three neural network passes: detection → classification → recognition
Dim result As PaddleOcrResult = ocr.Run(mat)
' Regions arrive in spatial order, not reading order
' Manual sort required for top-to-bottom, left-to-right output
Dim orderedRegions = result.Regions _
.OrderBy(Function(r) r.Rect.Center.Y) _
.ThenBy(Function(r) r.Rect.Center.X)
For Each region In orderedRegions
Console.WriteLine($"{region.Text} (confidence: {region.Score:P1})")
Next
End Using
End Using
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("rotated-scan.png");
input.Deskew(); // Corrects rotation and skew automatically
var result = ocr.Read(input);
// Output is already in reading order — no sort needed
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
Console.WriteLine($"{line.Text} (confidence: {line.Confidence}%)");
}
}
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("rotated-scan.png");
input.Deskew(); // Corrects rotation and skew automatically
var result = ocr.Read(input);
// Output is already in reading order — no sort needed
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
Console.WriteLine($"{line.Text} (confidence: {line.Confidence}%)");
}
}
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("rotated-scan.png")
input.Deskew() ' Corrects rotation and skew automatically
Dim result = ocr.Read(input)
' Output is already in reading order — no sort needed
For Each page In result.Pages
For Each line In page.Lines
Console.WriteLine($"{line.Text} (confidence: {line.Confidence}%)")
Next
Next
End Using
IronOCR'un Deskew() yöntemi, döndürme tespitini ön işleme hattının bir parçası olarak ele alır. Sonucun Lines koleksiyonu, Tesseract düzen motoru tarafından okuma sırasına göre teslim edilir ve manuel sıralama modelini ortadan kaldırır. görüntü yönü düzeltme rehberi, dönme ve eğilme seçeneklerinin tam yelpazesini belgeler.
GPU ve CPU Cihaz Seçiminin Kaldırılması
GPU tahmini çalıştıran PaddleOCR uygulamaları, en büyük geçiş yüzeyine sahiptir: GPU çalışma zamanı NuGet paketi, CUDA/cuDNN ortam ön gereksinimleri ve PaddleDevice.Gpu() yapılandırma çağrısı. Bunların hepsi geçiş sırasında kaldırılır.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference; // GPU configuration namespace
using OpenCvSharp;
// Prerequisites must exist on every deployment environment:
// - NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// - CUDA Toolkit 11.8 (not 12.x — version must match exactly)
// - cuDNN 8.6.0+ placed in CUDA bin directory
// - dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB initial memory pool
// Throws native load exception if CUDA_PATH not set or cuDNN DLL missing
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("scanned-batch.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine($"Text regions: {result.Regions.Length}");
Console.WriteLine(result.Text);
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using Sdcb.PaddleInference; // GPU configuration namespace
using OpenCvSharp;
// Prerequisites must exist on every deployment environment:
// - NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
// - CUDA Toolkit 11.8 (not 12.x — version must match exactly)
// - cuDNN 8.6.0+ placed in CUDA bin directory
// - dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
FullOcrModel models = await OnlineFullModels.ChineseV4.DownloadAsync();
// GPU device 0, 1000MB initial memory pool
// Throws native load exception if CUDA_PATH not set or cuDNN DLL missing
using PaddleOcrAll ocr = new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))
{
AllowRotateDetection = true,
Enable180Classification = true
};
using Mat mat = Cv2.ImRead("scanned-batch.png");
PaddleOcrResult result = ocr.Run(mat);
Console.WriteLine($"Text regions: {result.Regions.Length}");
Console.WriteLine(result.Text);
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports Sdcb.PaddleInference ' GPU configuration namespace
Imports OpenCvSharp
' Prerequisites must exist on every deployment environment:
' - NVIDIA Driver 452.39+ (Windows) / 450.80.02+ (Linux)
' - CUDA Toolkit 11.8 (not 12.x — version must match exactly)
' - cuDNN 8.6.0+ placed in CUDA bin directory
' - dotnet add package Sdcb.PaddleInference.runtime.win64.cuda118
Dim models As FullOcrModel = Await OnlineFullModels.ChineseV4.DownloadAsync()
' GPU device 0, 1000MB initial memory pool
' Throws native load exception if CUDA_PATH not set or cuDNN DLL missing
Using ocr As New PaddleOcrAll(models, PaddleDevice.Gpu(deviceId:=0)) With {
.AllowRotateDetection = True,
.Enable180Classification = True
}
Using mat As Mat = Cv2.ImRead("scanned-batch.png")
Dim result As PaddleOcrResult = ocr.Run(mat)
Console.WriteLine($"Text regions: {result.Regions.Length}")
Console.WriteLine(result.Text)
End Using
End Using
IronOCR Yaklaşımı:
IronOCR yaklaşımı yukarıdaki örnekle aynıdır; IronTesseract bu senaryoyu aynı API çağrısı ile ele alır. Herhangi bir GPU paketi, CUDA ön koşulu ve cihaz seçimi gerekmez. new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))'yi new IronTesseract() ile değiştirin ve GPU ile ilgili tüm yapılandırmaları kaldırın.
IronOCR, CPU üzerinde görüntü başına 150-300ms sunar — PaddleOCR'a göre CPU üzerinde daha hızlı (300-500ms) ve herhangi bir GPU altyapısı olmadan çoğu web API'si ve belge boru hattı iş yükleri için yeterlidir. Yüksek geçiş senaryoları için, hız optimizasyonu rehberi iletişim seçeneklerini kapsar, iş parçacığı yönetimi ve sayfa bölümlendirme modu ayarlamalarını.
Yapılandırılmış Belge Verisi Çıkarımı
PaddleOCR, PaddleOcrResultRegion nesnelerinin düz bir dizisini döndürür, bunlar okuma akışına göre değil mekansal olarak sıralanmıştır. Paragraf seviyesi veya satır seviyesi yapı çıkarımı, sınır kutusu yakınlığına dayalı manuel gruplama mantığı gerektirir. IronOCR, okuma sırası garantili bir hiyerarşik sonuç ağacı sağlar.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Collections.Generic;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("invoice.png");
PaddleOcrResult result = ocr.Run(mat);
//Hayırparagraph or line grouping — must implement manually
// Group regions into lines by proximity on the Y axis
var lineGroups = new Dictionary<int, List<PaddleOcrResultRegion>>();
foreach (var region in result.Regions)
{
// Round Y center to nearest 15 pixels to approximate line grouping
int lineKey = (int)(region.Rect.Center.Y / 15) * 15;
if (!lineGroups.ContainsKey(lineKey))
lineGroups[lineKey] = new List<PaddleOcrResultRegion>();
lineGroups[lineKey].Add(region);
}
// Sort lines top to bottom, then regions left to right within each line
foreach (var line in lineGroups.OrderBy(kv => kv.Key))
{
var lineText = string.Join(" ", line.Value
.OrderBy(r => r.Rect.Center.X)
.Select(r => r.Text));
Console.WriteLine(lineText);
}
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Collections.Generic;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("invoice.png");
PaddleOcrResult result = ocr.Run(mat);
//Hayırparagraph or line grouping — must implement manually
// Group regions into lines by proximity on the Y axis
var lineGroups = new Dictionary<int, List<PaddleOcrResultRegion>>();
foreach (var region in result.Regions)
{
// Round Y center to nearest 15 pixels to approximate line grouping
int lineKey = (int)(region.Rect.Center.Y / 15) * 15;
if (!lineGroups.ContainsKey(lineKey))
lineGroups[lineKey] = new List<PaddleOcrResultRegion>();
lineGroups[lineKey].Add(region);
}
// Sort lines top to bottom, then regions left to right within each line
foreach (var line in lineGroups.OrderBy(kv => kv.Key))
{
var lineText = string.Join(" ", line.Value
.OrderBy(r => r.Rect.Center.X)
.Select(r => r.Text));
Console.WriteLine(lineText);
}
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
Imports System.Collections.Generic
Dim models As FullOcrModel = Await OnlineFullModels.EnglishV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Using mat As Mat = Cv2.ImRead("invoice.png")
Dim result As PaddleOcrResult = ocr.Run(mat)
' Group regions into lines by proximity on the Y axis
Dim lineGroups As New Dictionary(Of Integer, List(Of PaddleOcrResultRegion))()
For Each region In result.Regions
' Round Y center to nearest 15 pixels to approximate line grouping
Dim lineKey As Integer = CInt(region.Rect.Center.Y / 15) * 15
If Not lineGroups.ContainsKey(lineKey) Then
lineGroups(lineKey) = New List(Of PaddleOcrResultRegion)()
End If
lineGroups(lineKey).Add(region)
Next
' Sort lines top to bottom, then regions left to right within each line
For Each line In lineGroups.OrderBy(Function(kv) kv.Key)
Dim lineText As String = String.Join(" ", line.Value _
.OrderBy(Function(r) r.Rect.Center.X) _
.Select(Function(r) r.Text))
Console.WriteLine(lineText)
Next
End Using
End Using
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");
var result = ocr.Read(input);
// Hierarchical structure: Pages → Paragraphs → Lines → Words → Characters
// All delivered in reading order by the layout engine
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber} — {page.Words.Count} words");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y}):");
Console.WriteLine($" {paragraph.Text}");
}
}
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");
var result = ocr.Read(input);
// Hierarchical structure: Pages → Paragraphs → Lines → Words → Characters
// All delivered in reading order by the layout engine
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber} — {page.Words.Count} words");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y}):");
Console.WriteLine($" {paragraph.Text}");
}
}
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("invoice.png")
Dim result = ocr.Read(input)
' Hierarchical structure: Pages → Paragraphs → Lines → Words → Characters
' All delivered in reading order by the layout engine
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber} — {page.Words.Count} words")
For Each paragraph In page.Paragraphs
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y}):")
Console.WriteLine($" {paragraph.Text}")
Next
Next
End Using
Manuel satır gruplama yaklaşıklığı — Y koordinatlarını piksel kova büyüklüğüne yuvarlama — Tesseract yerleşim motorunun yerleşik paragraf bölümlendirmesi ile değiştirilir. Bağıntı kutusu koordinatları, paragraph.X, paragraph.Y, paragraph.Width ve paragraph.Height aracılığıyla hiyerarşinin her seviyesinde mevcuttur. yapılandırılmış sonuç rehberi ve görüntüden yazı okuma eğitimi, tam sonuç ağacı kapsamını içerir.
Aranabilir PDF Oluşturma
PaddleOCR, herhangi bir PDF çıktısı üretmez. PaddleOCR sonuçlarından aranabilir bir PDF oluşturmak, ayrı bir PDF kütüphanesi, region.Rect'den PDF sayfa birimlerine manuel koordinat eşlemesi ve bir görünmez metin katmanı enjeksiyonu gerektirir. IronOCR, OCR sonucundan doğrudan aranabilir bir PDF üretir.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Requires additional package: PdfSharp, iTextSharp, or similar
// Manual coordinate remapping from OpenCV pixel space to PDF point space
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("scanned-page.png");
PaddleOcrResult paddleResult = ocr.Run(mat);
//Hayırbuilt-in searchable PDF output — must build with external library
// region.Rect coordinates are in pixel space, PDF uses points (1 point = 1/72 inch)
// DPI conversion required for coordinate mapping
float dpiScale = 72.0f / 96.0f; // Assuming 96 DPI source image
// ... hundreds of lines of PDF construction code using external library ...
// This is permanent maintenance, not a one-time cost
Console.WriteLine("Searchable PDF output requires external PDF library and coordinate mapping.");
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
// Requires additional package: PdfSharp, iTextSharp, or similar
// Manual coordinate remapping from OpenCV pixel space to PDF point space
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead("scanned-page.png");
PaddleOcrResult paddleResult = ocr.Run(mat);
//Hayırbuilt-in searchable PDF output — must build with external library
// region.Rect coordinates are in pixel space, PDF uses points (1 point = 1/72 inch)
// DPI conversion required for coordinate mapping
float dpiScale = 72.0f / 96.0f; // Assuming 96 DPI source image
// ... hundreds of lines of PDF construction code using external library ...
// This is permanent maintenance, not a one-time cost
Console.WriteLine("Searchable PDF output requires external PDF library and coordinate mapping.");
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
' Requires additional package: PdfSharp, iTextSharp, or similar
' Manual coordinate remapping from OpenCV pixel space to PDF point space
Dim models As FullOcrModel = Await OnlineFullModels.EnglishV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Using mat As Mat = Cv2.ImRead("scanned-page.png")
Dim paddleResult As PaddleOcrResult = ocr.Run(mat)
' Hayırbuilt-in searchable PDF output — must build with external library
' region.Rect coordinates are in pixel space, PDF uses points (1 point = 1/72 inch)
' DPI conversion required for coordinate mapping
Dim dpiScale As Single = 72.0F / 96.0F ' Assuming 96 DPI source image
' ... hundreds of lines of PDF construction code using external library ...
' This is permanent maintenance, not a one-time cost
Console.WriteLine("Searchable PDF output requires external PDF library and coordinate mapping.")
End Using
End Using
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-page.png");
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Searchable PDF in one line — no external PDF library, no coordinate mapping
result.SaveAsSearchablePdf("searchable-output.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-page.png");
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
// Searchable PDF in one line — no external PDF library, no coordinate mapping
result.SaveAsSearchablePdf("searchable-output.pdf");
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("scanned-page.png")
input.Deskew()
input.DeNoise()
Dim result = ocr.Read(input)
' Searchable PDF in one line — no external PDF library, no coordinate mapping
result.SaveAsSearchablePdf("searchable-output.pdf")
Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%")
End Using
Koordinat eşleme sorunu — OpenCV piksel koordinatlarını doğru DPI'de PDF nokta alanına dönüştürme — IronOCR'da mevcut değildir. aranabilir PDF rehberi, çok sayfalı çıktı, şifre korumalı PDF'ler ve çıktı kalitesi ayarlarını kapsar. Taralı arşivleri dijitalleştiren veya fakstan aranabilir PDF boru hattı oluşturan ekipler için bu tek yöntem çağrısı, aksi halde önemli bir entegrasyon projesi olacak durumu değiştirir.
Çok Kareli TIFF Yığın İşleme
Çok sayfalı TIFF dosyaları, belge tarama iş akışlarında sıkça görülür. PaddleOCR, doğrudan TIFF çok çerçeve desteğine sahip değildir — her çerçeve ayrı bir Mat olarak yüklenmelidir ve önceden bir dış resim kütüphanesi kullanılarak ayrı ayrı çıkarılmalıdır.IronOCR çoklu çerçeve TIFF'leri yerel olarak yönetir.
PaddleOCR Yaklaşımı:
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Drawing; // For multi-frame TIFF extraction
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var fullText = new StringBuilder();
// Must use System.Drawing to extract individual TIFF frames
// OpenCvSharp cannot enumerate TIFF frames directly
using var tiff = Image.FromFile("multipage-scan.tiff");
FrameDimension dimension = new FrameDimension(tiff.FrameDimensionsList[0]);
int frameCount = tiff.GetFrameCount(dimension);
for (int i = 0; i < frameCount; i++)
{
tiff.SelectActiveFrame(dimension, i);
// Save frame to temp file — OpenCvSharp needs a file path
string tempPath = Path.GetTempFileName() + ".png";
tiff.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
fullText.AppendLine($"=== Frame {i + 1} ===");
fullText.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
Console.WriteLine(fullText.ToString());
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models.Online;
using OpenCvSharp;
using System.Drawing; // For multi-frame TIFF extraction
using System.Drawing.Imaging;
using System.Text;
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
var fullText = new StringBuilder();
// Must use System.Drawing to extract individual TIFF frames
// OpenCvSharp cannot enumerate TIFF frames directly
using var tiff = Image.FromFile("multipage-scan.tiff");
FrameDimension dimension = new FrameDimension(tiff.FrameDimensionsList[0]);
int frameCount = tiff.GetFrameCount(dimension);
for (int i = 0; i < frameCount; i++)
{
tiff.SelectActiveFrame(dimension, i);
// Save frame to temp file — OpenCvSharp needs a file path
string tempPath = Path.GetTempFileName() + ".png";
tiff.Save(tempPath, ImageFormat.Png);
try
{
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
fullText.AppendLine($"=== Frame {i + 1} ===");
fullText.AppendLine(result.Text);
}
finally
{
File.Delete(tempPath); // Must clean up temp files
}
}
Console.WriteLine(fullText.ToString());
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models.Online
Imports OpenCvSharp
Imports System.Drawing ' For multi-frame TIFF extraction
Imports System.Drawing.Imaging
Imports System.Text
Dim models As FullOcrModel = Await OnlineFullModels.EnglishV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Dim fullText As New StringBuilder()
' Must use System.Drawing to extract individual TIFF frames
' OpenCvSharp cannot enumerate TIFF frames directly
Using tiff As Image = Image.FromFile("multipage-scan.tiff")
Dim dimension As New FrameDimension(tiff.FrameDimensionsList(0))
Dim frameCount As Integer = tiff.GetFrameCount(dimension)
For i As Integer = 0 To frameCount - 1
tiff.SelectActiveFrame(dimension, i)
' Save frame to temp file — OpenCvSharp needs a file path
Dim tempPath As String = Path.GetTempFileName() & ".png"
tiff.Save(tempPath, ImageFormat.Png)
Try
Using mat As Mat = Cv2.ImRead(tempPath)
Dim result As PaddleOcrResult = ocr.Run(mat)
fullText.AppendLine($"=== Frame {i + 1} ===")
fullText.AppendLine(result.Text)
End Using
Finally
File.Delete(tempPath) ' Must clean up temp files
End Try
Next
End Using
Console.WriteLine(fullText.ToString())
End Using
IronOCR Yaklaşımı:
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImageFrames("multipage-scan.tiff"); // All frames in one call
var result = ocr.Read(input);
foreach (var page in result.Pages)
{
Console.WriteLine($"=== Frame {page.PageNumber} ===");
Console.WriteLine(page.Text);
}
// Optionally save the entire multi-frame result as searchable PDF
result.SaveAsSearchablePdf("multipage-searchable.pdf");
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImageFrames("multipage-scan.tiff"); // All frames in one call
var result = ocr.Read(input);
foreach (var page in result.Pages)
{
Console.WriteLine($"=== Frame {page.PageNumber} ===");
Console.WriteLine(page.Text);
}
// Optionally save the entire multi-frame result as searchable PDF
result.SaveAsSearchablePdf("multipage-searchable.pdf");
Imports IronOcr
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImageFrames("multipage-scan.tiff") ' All frames in one call
Dim result = ocr.Read(input)
For Each page In result.Pages
Console.WriteLine($"=== Frame {page.PageNumber} ===")
Console.WriteLine(page.Text)
Next
' Optionally save the entire multi-frame result as searchable PDF
result.SaveAsSearchablePdf("multipage-searchable.pdf")
End Using
Çerçeve çıkarımı yinelemesi, System.Drawing bağımlılığı, geçici dosya oluşturma ve temizleme mantığı tamamen kaldırılır. IronOCR, tüm çerçeveleri tek bir LoadImageFrames() çağrısında yükler ve her çerçeveyi sonuçta bir Page olarak ortaya çıkarır. TIFF ve GIF giriş rehberi, çoklu çerçeve yükleme seçenekleri, seçici çerçeve aralıkları ve büyük TIFF arşivleri için bellek değerlendirmelerini kapsar.
PaddleOCR (.NET) API'den IronOCR Eşleme Referansı
| PaddleOCR (Sdcb) | IronOCR | Notlar |
|---|---|---|
Sdcb.PaddleOCR |
IronOcr |
Namespace |
Sdcb.PaddleOCR.Models.Online |
Yok | Model edinimi alan adı gerekmiyor |
Sdcb.PaddleInference |
Yok | Sonuç çıkarma arka uç alan adı gerekmiyor |
FullOcrModel |
Yok | Eşdeğeri yok — modeller pakete dahil |
OnlineFullModels.ChineseV4.DownloadAsync() |
dotnet add package IronOcr.Languages.ChineseSimplified |
Model edinimi NuGet ile değiştirildi |
LocalDetectionModel.FromDirectory(path) |
Yok | Model yolu yönetimi yok |
LocalClassificationModel.FromDirectory(path) |
Yok | Model yolu yönetimi yok |
LocalRecognitionModel.FromDirectory(path) |
Yok | Model yolu yönetimi yok |
new PaddleOcrAll(models) |
new IronTesseract() |
Motor örnekleme |
new PaddleOcrAll(models, PaddleDevice.Gpu(0)) |
Yok | GPU cihaz seçimi tamamen kaldırıldı |
PaddleDevice.Cpu() |
Yok | Tek mod CPU'dur; seçim gerekmez |
ocr.AllowRotateDetection = true |
input.Deskew() |
Dönme düzeltmesi |
ocr.Enable180Classification = true |
Otomatik | Ters tespit dahili olarak sağlanmış |
Cv2.ImRead(path) |
input.LoadImage(path) |
Görüntü yükleme — OpenCV gerekli değil |
ocr.Run(mat) |
ocr.Read(input) |
OCR'yi yürüt |
result.Text |
result.Text |
Tam belge metin dizgisi |
result.Regions |
result.Pages[0].Lines veya .Words |
Yapılı metin bölgeleri |
region.Text |
word.Text / line.Text |
Bir bölgenin metin içeriği |
region.Score (float 0-1) |
word.Confidence (int 0-100) |
Güven değeri — kapsam farklıdır |
region.Rect.Center.X |
word.X |
Yatay pozisyon |
region.Rect.Center.Y |
word.Y |
Dikey pozisyon |
region.Rect.Size.Width |
word.Width |
Sınır kutusu genişliği |
region.Rect.Size.Height |
word.Height |
Sınır kutusu yüksekliği |
| Yok | input.LoadPdf(path) |
Doğal PDF girişi (PaddleOCR eşdeğeri yoktur) |
| Yok | input.LoadImageFrames(path) |
Çoklu çerçeve TIFF (PaddleOCR eşdeğeri yoktur) |
| Yok | result.SaveAsSearchablePdf(path) |
Aranabilir PDF çıktısı (PaddleOCR eşdeğeri yoktur) |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: Güven Ölçeği Uyuşmazlığı
PaddleOCR: Bölge güveni 0,0 ile 1,0 arasında bir float'dir. Düşük kaliteli tespitleri filtrelemek için yaygın bir eşik region.Score >= 0.8'dir.
Çözüm:IronOCR güveni, 0'dan 100'e kadar bir int yüzdesidir. PaddleOCR eşik değeri 100 ile çarpılmalı:
// PaddleOCR: filter at 0.8
var highConfidence = result.Regions.Where(r => r.Score >= 0.8);
//IronOCR equivalent: filter at 80
var highConfidence = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence >= 80);
// PaddleOCR: filter at 0.8
var highConfidence = result.Regions.Where(r => r.Score >= 0.8);
//IronOCR equivalent: filter at 80
var highConfidence = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence >= 80);
' PaddleOCR: filter at 0.8
Dim highConfidence = result.Regions.Where(Function(r) r.Score >= 0.8)
' IronOCR equivalent: filter at 80
Dim highConfidence = result.Pages _
.SelectMany(Function(p) p.Words) _
.Where(Function(w) w.Confidence >= 80)
Belge seviyesinde güven, hızlı kalite kontrolü için result.Confidence olarak mevcuttur. güven skorları rehberi, kelime başı ve belge seviyesinde eşikler hakkında bilgi verir.
Sorun 2: Okuma Sırası Varsayımları
PaddleOCR: result.Regions tespit sırasına göre sıralanır, okuma sırasına göre değil. result.Text üst-ten-alt ve sol-dan-sağa beklendiğinde manuel sıralama modeline bağlı olarak PaddleOCR örnekleri boyunca kullanılan kodda sıralama düzenine istinaden manuel olarak sıralama modeline güvenir.
Çözüm: IronOCR'un result.Text zaten okuma sırasındadır. Elle sıralamayı kaldırın. Satır satır bir çıkış oluşturmak için sıralamanın kullanıldığı durumlarda, doğrudan result.Pages[0].Lines'yi kullanın:
// PaddleOCR: manual sort required for reading order
var lines = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X)
.Select(r => r.Text);
// IronOCR: reading order is the default
var lines = result.Pages[0].Lines.Select(l => l.Text);
// PaddleOCR: manual sort required for reading order
var lines = result.Regions
.OrderBy(r => r.Rect.Center.Y)
.ThenBy(r => r.Rect.Center.X)
.Select(r => r.Text);
// IronOCR: reading order is the default
var lines = result.Pages[0].Lines.Select(l => l.Text);
Imports System.Linq
' PaddleOCR: manual sort required for reading order
Dim lines = result.Regions _
.OrderBy(Function(r) r.Rect.Center.Y) _
.ThenBy(Function(r) r.Rect.Center.X) _
.Select(Function(r) r.Text)
' IronOCR: reading order is the default
Dim lines = result.Pages(0).Lines.Select(Function(l) l.Text)
Sorun 3: OpenCV Mat Dönüştürme Kodu
PaddleOCR: Bazı kod tabanları, Cv2.ImRead() çağrısı yapmadan önce bir geçici dosyaya yazarak veya bayt dizilerinden resimleri yükleyen yardımcı yöntemler içerir. Bu kalıplar, Cv2.ImRead() sadece dosya yollarını kabul ettiği için mevcuttur.
Çözüm: IronOCR'un OcrInput doğrudan akışları ve bayt dizilerini kabul eder. Geçici dosya aracı dosyasını silin:
// PaddleOCR: stream → temp file → Mat → OCR
string tempPath = Path.GetTempFileName() + ".png";
using (var fs = File.Create(tempPath))
await imageStream.CopyToAsync(fs);
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
File.Delete(tempPath);
// IronOCR: stream → OCR (no temp file)
using var input = new OcrInput();
input.LoadImage(imageStream);
var result = ocr.Read(input);
// PaddleOCR: stream → temp file → Mat → OCR
string tempPath = Path.GetTempFileName() + ".png";
using (var fs = File.Create(tempPath))
await imageStream.CopyToAsync(fs);
using Mat mat = Cv2.ImRead(tempPath);
PaddleOcrResult result = ocr.Run(mat);
File.Delete(tempPath);
// IronOCR: stream → OCR (no temp file)
using var input = new OcrInput();
input.LoadImage(imageStream);
var result = ocr.Read(input);
Imports System.IO
Imports OpenCvSharp
Imports IronOcr
' PaddleOCR: stream → temp file → Mat → OCR
Dim tempPath As String = Path.GetTempFileName() & ".png"
Using fs = File.Create(tempPath)
Await imageStream.CopyToAsync(fs)
End Using
Using mat As Mat = Cv2.ImRead(tempPath)
Dim result As PaddleOcrResult = ocr.Run(mat)
End Using
File.Delete(tempPath)
' IronOCR: stream → OCR (no temp file)
Using input As New OcrInput()
input.LoadImage(imageStream)
Dim result = ocr.Read(input)
End Using
akış giriş rehberi, HTTP yanıtları, veritabanı blobları ve bellek akışlarından akış yüklemeyi kapsar.
Sorun 4: Async Başlatma Modeli Kaldırma
PaddleOCR: Motor başlatması asenkron çünkü model indirme ağ I/O işlemi içerir. Bu, çağrı zinciri boyunca asenkron yapılar gerektirir, bu da yapıcılar veya asenkron olmayan olay işleyicileri gibi eşzamanlı bağlamlarda sorun olabilir.
Çözüm:IronOCR başlatması eşzamanlıdır. new IronTesseract() I/O gerçekleştirmez. Herhangi bir model indirme işleminin yalnızca asenkron operasyon olduğu herhangi bir yöntemden await ve async değiştiricisini çıkarın:
// PaddleOCR: async forced by model download
public async Task<string> ExtractTextAsync(string imagePath)
{
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead(imagePath);
return ocr.Run(mat).Text;
}
// IronOCR: synchronous — no async required unless the caller needs it
public string ExtractText(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
// PaddleOCR: async forced by model download
public async Task<string> ExtractTextAsync(string imagePath)
{
FullOcrModel models = await OnlineFullModels.EnglishV4.DownloadAsync();
using PaddleOcrAll ocr = new PaddleOcrAll(models);
using Mat mat = Cv2.ImRead(imagePath);
return ocr.Run(mat).Text;
}
// IronOCR: synchronous — no async required unless the caller needs it
public string ExtractText(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
Imports System.Threading.Tasks
' PaddleOCR: async forced by model download
Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
Dim models As FullOcrModel = Await OnlineFullModels.EnglishV4.DownloadAsync()
Using ocr As New PaddleOcrAll(models)
Using mat As Mat = Cv2.ImRead(imagePath)
Return ocr.Run(mat).Text
End Using
End Using
End Function
' IronOCR: synchronous — no async required unless the caller needs it
Public Function ExtractText(imagePath As String) As String
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage(imagePath)
Return ocr.Read(input).Text
End Using
End Function
IronOCR ek olarak, asenkron bağlamda gerçekten gerektiğinde, engelleme yapmaksızın çalışma sağlamak için ocr.ReadAsync(input) yoluyla yerel asenkron destek sunar.
Sorun 5: Docker Build Adım Temizleme
PaddleOCR: Dockerfile, apt-get install libopencv-dev, bir COPY models/ /app/models/ talimatı ve genellikle bir model önceden indirme RUN adımı içerir. Temel görüntü genellikle GPU dağıtımları için NVIDIA CUDA görüntüsüdür.
Çözüm: Tüm PaddleOCR'a özgü Dockerfile talimatlarını kaldırın.IronOCR Docker görüntüsü, özel bir temel görünüme ya da model kopyalama adımına ihtiyaç duymaz:
# PaddleOCR Dockerfile (remove all of this)
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y libopencv-dev libgdiplus
COPY models/ /app/models/
COPY . /app
# IronOCR Dockerfile (clean)
FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]
Sonuç olarak ortaya çıkan görüntü yaklaşık 1,5GB'dan yaklaşık 400MB'ye düşer. Docker dağıtım rehberi, Linux kütüphane gereksinimleri ve çoklu mimari derlemeleri kapsar.
Sorun 6: CI/CD Model Önbelleği Geçersiz Kılma
PaddleOCR: NuGet geri yükleme adımını önbelleğe alan CI/CD hatları, model dosyası önbelleklerini ayrı ayrı yönetmelidir. Yaygın bir desen, çalıştırmalar arasında bir models/ klasörünün önbelleğe alınmasıdır. Wrapper sürümü güncellendiğinde, önbellek anahtarı değişir ve modeller Baidu sunucularından yeniden indirilmeli, bu, hattan 30-60 saniye ekler.
Çözüm: IronOCR, model önbellek dizinine sahip değildir. Gerekli olan tek önbellek, standart NuGet paket önbelleğidir. Ayrı önbellek adımı yok, sarmalayıcı güncellemelerinde önbelleği geçersiz kılma yok, CI sırasında üçüncü taraf sunuculardan indirme yok:
# Remove from CI/CD pipeline:
# - name: Cache PaddleOCR models
# uses: actions/cache@v3
# with:
# path: models/
# key: paddleocr-models-${{ env.PADDLEOCR_VERSION }}
# IronOCR only needs standard NuGet caching:
- name: Cache NuGet packages
uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: nuget-${{ hashFiles('**/*.csproj') }}
# Remove from CI/CD pipeline:
# - name: Cache PaddleOCR models
# uses: actions/cache@v3
# with:
# path: models/
# key: paddleocr-models-${{ env.PADDLEOCR_VERSION }}
# IronOCR only needs standard NuGet caching:
- name: Cache NuGet packages
uses: actions/cache@v3
with:
path: ~/.nuget/packages
key: nuget-${{ hashFiles('**/*.csproj') }}
PaddleOCR (.NET) Geçiş Kontrol Listesi
Öncesi-Geçiş
Herhangi bir değişiklik yapmadan önce tüm PaddleOCR kullanımlarını tanımlamak için kod tabanını kontrol et:
# Find all PaddleOCR namespace imports
grep -rn "using Sdcb.PaddleOCR" --include="*.cs" .
# Find all OpenCvSharp imports (added as PaddleOCR dependency)
grep -rn "using OpenCvSharp" --include="*.cs" .
# Find all Mat usage patterns
grep -rn "Cv2\.ImRead\|new Mat\|Mat mat" --include="*.cs" .
# Find all async model download calls
grep -rn "DownloadAsync\|OnlineFullModels\|LocalDetectionModel" --include="*.cs" .
# Find all GPU device configuration
grep -rn "PaddleDevice\|EnableUseGpu\|cuda" --include="*.cs" .
# Find all result region access patterns
grep -rn "result\.Regions\|region\.Score\|region\.Rect" --include="*.cs" .
# Locate model directory references in configuration files
grep -rn "PP-OCRv4\|cls_infer\|det_infer\|rec_infer" --include="*.cs" --include="*.json" --include="*.yaml" .
# Find all PaddleOCR namespace imports
grep -rn "using Sdcb.PaddleOCR" --include="*.cs" .
# Find all OpenCvSharp imports (added as PaddleOCR dependency)
grep -rn "using OpenCvSharp" --include="*.cs" .
# Find all Mat usage patterns
grep -rn "Cv2\.ImRead\|new Mat\|Mat mat" --include="*.cs" .
# Find all async model download calls
grep -rn "DownloadAsync\|OnlineFullModels\|LocalDetectionModel" --include="*.cs" .
# Find all GPU device configuration
grep -rn "PaddleDevice\|EnableUseGpu\|cuda" --include="*.cs" .
# Find all result region access patterns
grep -rn "result\.Regions\|region\.Score\|region\.Rect" --include="*.cs" .
# Locate model directory references in configuration files
grep -rn "PP-OCRv4\|cls_infer\|det_infer\|rec_infer" --include="*.cs" --include="*.json" --include="*.yaml" .
Model dizinlerinin envanterini çıkarın ve toplam boyutu not edin. Kullanılan dil modellerinin hangileri olduğunu belirleyin (Çince, İngilizce, Japonca, vb.) hangi IronOcr.Languages.* paketlerini eklemeniz gerektiğini belirlemek için. GPU yapılandırmasının mevcut olup olmadığını not edin — bu dosyalar temizlenecek alanın en geniş kısmına sahiptir.
Kod Geçişi
Sdcb.PaddleOCR,Sdcb.PaddleOCR.Models.Online,Sdcb.PaddleInference.runtime.*,OpenCvSharp4veOpenCvSharp4.runtime.*'yi.csprojdosyasından kaldırınIronOcrdosyasına.csprojekleyin- Daha önce PaddleOCR modeli olarak indirilen her dil için
IronOcr.Languages.*paketlerini ekleyin - Tüm
using Sdcb.PaddleOCR*veusing OpenCvSharpyönergeleriniusing IronOcrile değiştirin - Uygulama başlatıldığında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin FullOcrModel models = await OnlineFullModels.*.DownloadAsync()'yı hiçbir şeyle değiştirmeyin — satırı tamamen kaldırınnew PaddleOcrAll(models)'yınew IronTesseract()ile değiştirinnew PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0))'yınew IronTesseract()ile değiştirinMat mat = Cv2.ImRead(path)'yıvar input = new OcrInput();ile değiştirin input.LoadImage(path);'ocr.Run(mat)'yıocr.Read(input)ile değiştirinresult.Regionserişiminiresult.Pages[0].Linesveyaresult.Pages[0].Wordsile değiştirinregion.Score >= threshold'yıword.Confidence >= threshold * 100ile değiştirinregion.Rect.Center.X / .Center.Y'yıword.X / word.Yile değiştirin- Elle sıralama mantığını kaldırın —IronOCR sonuçları zaten okuma sırasındadır
models/dizinini ve tüm model dosyalarını depodan ve dağıtım betiklerinden kaldırın
Geçiş Sonrası
dotnet build'ninSdcb.*,OpenCvSharpveyaPaddleInference'ye sıfır referansla başarılı olduğunu doğrulayın, derleme çıktısındadır- PaddleOCR çıktısının doğruluğunu doğrulamak için kullanılan aynı temsilci doküman seti üzerinde OCR çalıştırın ve metin doğruluğunu karşılaştırın
- Güven değerlerinin tüm filtre noktalarında 0-100 olarak (0-1 değil) okunduğunu onaylayın
- Elle sıralama olmaksızın okuma sırasının doğru olduğunu doğrulayın – özellikle çok kolonlu ve fatura düzenlerini kontrol edin
- CUDA temel görüntüsü veya
apt-get install libopencv-devolmadan Docker görüntüsü oluşturma işleminin tamamlandığını test edin - Docker imaj boyutunun 500MB'nin altında olduğunu onaylayın
- CI/CD hattını baştan sona çalıştırın ve yapı sırasında dış indirmelerin olmadığını doğrulayın
- İzole edilmiş dağıtımda test yapın: uygulamanın outbound ağ bağlantıları olmadan belgeleri başlatıp işlediğini doğrulayın
- Çok çerçeveli TIFF girişleri için, tüm çerçevelerin işlendiğini ve çerçeve sayısının kaynak dosyayla eşleştiğini doğrulayın
- Herhangi bir PDF girdisi için,
input.LoadPdf()'nin önceki PdfiumViewer tabanlı dönüşümle aynı sayfa sayısını ve metin içeriğini ürettiğini doğrulayın
IronOCR'a Geçişin Ana Faydaları
Dağıtım Artifaktları Yüzde 80 Daha Küçük. PaddleOCR dağıtım alanı — paddle_inference.dll, OpenCV DLL'leri ve üç model dizini — her dağıtım hedefi için300-500MBekler. Geçişten sonra,IronOCR dağıtımı yaklaşık 80MB'dir. Docker imajları ~1,5GB'dan ~400MB'ye düşer. Konteyner başlangıcı daha hızlıdır, depolama maliyetleri daha düşüktür ve daha önce 500MB olan artefaktlara transfer edilen dağıtım hatları şimdi 80MB transfer eder.
Soğuk Başlama Süresi Saniyelerden Milisaniyelere Düşer. PaddleOCR, ilk çıkarımda üç sinir ağı model dosyasını diskte yükler, bu, ilk çağrı dönmeden önce 3-5 saniyelik bir duraklamaya ekler. Sunucusuz işlevlerde, otomatik ölçeklendirme senaryolarında veya talep üzerine yeni örneklerin döndüğü her bağlamda, bu soğuk başlama tekrarlanarak ücretlendirilir. IronOCR'un motoru paketlenmiştir ve bir saniyenin altında başlatılır. temel OCR örneği, başlatma modelini gösterir.
Dil Kapsamı 14'ten 125'e Altyapı Çalışması Olmadan Genişler. PaddleOCR 14 dili destekler. IronOCR'un PaddleOCR'un sınırının ötesinde desteklediği 111 dilden herhangi birini eklemek, dil başına tek bir NuGet paketi eklemesidir — model indirimi yok, dizin yönetimi yok, sürüm senkronizasyonu yok. Belgelerin kapsamı yeni pazarlara genişleyen ekipler, Lehçe, Vietnamece, Yunanca veya İbranice OCR desteği eklemek için bir yeniden yazma veya yeni bir altyapı projesiyle karşılaşmazlar. Tam dil kataloğu, mevcut125+paket gösterir.
Aranabilir PDF Çıktısı Tek Bir Satır Gerektirir. PaddleOCR metin bölgeleri döndürür. Bu bölgeleri aranabilir bir PDF katmanına dönüştürmek, ayrı bir PDF kütüphanesi, pikselden noktaya koordinat dönüşümü ve kalıcı bir bakım haline gelen görünmez metin enjeksiyonu kodu gerektirir. Geçişten sonra, result.SaveAsSearchablePdf("output.pdf") tüm bu alt sistemi değiştirir. Taralı belge arşiv iş akışları, faksdan-PDF hatları ve belge yönetim entegrasyonları doğrudan fayda sağlar. aranabilir PDF nasıl yapılır ve PDF veri çıkarım blog yazısı, tam çıktı seçeneklerini kapsar.
Herhangi Bir Aşamada Dış Ağ Bağlantısı Yok. PaddleOCR, model indirmeleri için Baidu'nun bj.bcebos.com depolamasına bağlanır. Çıkış bağlantılarının kısıtlandığı ortamlar — hükümet ağları, izole sistemler, finansal hizmet altyapısı — bu bağlantı ya bir güvenlik duvarı istisnası ya da CI/CD karmaşıklığı ekleyen bir ön indirme işlemine ihtiyaç duyar.IronOCR çalışırken hiçbir dış bağlantı yapmaz. Modeller, NuGet'ten dotnet restore'nin bir parçası olarak geri yüklenir ve dağıtım çıktısında bulunur. AWS dağıtım rehberi ve Azure dağıtım rehberi, ağ kısıtlamalarının bulunduğu ortamlar için bulut özgü yapılandırmayı kapsar.
Tüm OCR Yığını İçin Tek Ticari Destek Teması. PaddleOCR sorunları, Sdcb.PaddleOCR kaplaması (topluluk GitHub), PaddlePaddle çerçevesi (Baidu), OpenCvSharp (topluluk) ve CUDA/cuDNN (NVIDIA) içerir. Her katman, yanıt süresi garantisi olmayan farklı bir destek kanalıyla sahiptir. Iron Software'den tek bir ürün olan IronOCR, ticari e-posta desteği ve öncelik yanıt katmanları ile gelir. IronOCR dokümantasyon merkezi, tüm API dokümantasyonunu, nasıl yapılır rehberlerini ve sorun giderme kaynaklarını tek bir yerde toplar.
Sıkça Sorulan Sorular
PaddleOCR'dan IronOCR'ye neden geçmeliyim?
Yaygın geçiş nedenleri arasında COM ara bağlamının karmaşıklığını ortadan kaldırmak, dosya tabanlı lisans yönetimini değiştirmek, sayfa başına fatura düzenlemekten kaçınmak, Docker/kapsayıcı dağıtımını etkinleştirmek ve standart .NET araçlarıyla entegre olan bir NuGet doğal iş akışı benimsemek yer almaktadır.
PaddleOCR'dan IronOCR'ye geçişteki ana kod değişiklikleri nelerdir?
PaddleOCR başlangıç dizilerini IronTesseract örneği ile değiştirin, COM yaşam döngüsü yönetimini (açık Create/Load/Close desenleri) kaldırın ve sonuç özellik adlarını güncelleyin. Sonuç, önemli ölçüde daha az boilerplate satırıdır.
Geçişi başlatmak için IronOCR'u nasıl kurarım?
Paket Yöneticisi Konsolunda 'Install-Package IronOcr' veya CLI'da 'dotnet add package IronOcr' çalıştırın. Dil paketleri ayrı paketlerdir: Örneğin, Fransızca için 'dotnet add package IronOcr.Languages.French'.
IronOCR, PaddleOCR'in standart iş belgeleri için OCR doğruluğunu karşılıyor mu?
IronOCR, faturalar, sözleşmeler, makbuzlar ve yazılı formlar dahil olmak üzere standart işletme içerikleri için yüksek doğruluğa ulaşır. Görüntü ön işleme filtreleri (dengelemeyi düzeltme, gürültü kaldırma, kontrast artırma) bozulmuş girdiler üzerindeki tanımayı daha da iyileştirir.
IronOCR, PaddleOCR'in ayrı kurduğu dil verilerini nasıl yönetiyor?
IronOCR'daki dil verileri, NuGet paketleri olarak dağıtılır. 'dotnet add package IronOcr.Languages.German' komutuyla Almanca desteği yüklenir. Herhangi bir manuel dosya yerleştirme veya dizin yolu gerekmez.
PaddleOCR'dan IronOCR'ye geçiş, dağıtım altyapısında değişiklik gerektiriyor mu?
IronOCR, PaddleOCR'dan daha az altyapı değişikliği gerektirir. SDK ikili yolları, lisans dosyası yerleşimleri veya lisans sunucu yapılandırmaları yoktur. NuGet paketi, tam OCR motorunu içerir ve lisans anahtarı uygulama kodunda belirlenmiş bir dizgedir.
Geçişten sonra IronOCR lisanslamasını nasıl yapılandırırım?
Uygulama başlangıç kodunda IronOcr.License.LicenseKey = "SİZİN-ANAHTARINIZ" atayın. Docker veya Kubernetes'te, anahtarı bir ortam değişkeni olarak saklayın ve başlangıçta okuyun. Trafiği kabul etmeden önce doğrulamak için License.IsValidLicense kullanın.
IronOCR, PDF'leri PaddleOCR gibi işleyebilir mi?
Evet. IronOCR hem yerel hem de taranmış PDF'leri okur. Bir PDF yolu veya OcrPdfInput olan girdiye ocr.Read(input) çağrısı yapmak için IronTesseract örneği çağırın ve OcrResult sayfalarını yineleyin. Ayrı bir PDF işleme hattı gerekmez.
IronOCR, yüksek hacim işleme sırasında iş parçacığı nasıl ele alır?
IronTesseract, iş parçacığı başına örnek olacak şekilde güvenlidir. Paralel.ForEach veya Görev havuzunda her iş parçacığı için bir örnek oluşturun, OCR'u eşzamanlı olarak çalıştırın ve her örneği iş tamamlandığında bırakın. Küresel durum veya kilitleme gerekmez.
IronOCR metin çıktıktan sonra hangi çıktıları destekler?
IronOCR, metin, kelime koordinatları, güven skorları ve sayfa yapısını içeren yapılandırılmış sonuçlar döndürür. Dışa aktarma seçenekleri düz metin, aranabilir PDF ve aşağı akış işlemesi için yapılandırılmış sonuç nesneleri içerir.
IronOCR'ın fiyatlandırması, ölçeklendirme iş yükleri için PaddleOCR'dan daha öngörülebilir mi?
IronOCR, sayfa başına veya hacim ücretlendirmesi olmadan düz oranlı sürekli lisanslama kullanır. 10.000 veya 10 milyon sayfa işleseniz de lisans maliyeti sabit kalır. Hacim ve ekip lisanslama seçenekleri IronOCR fiyatlandırma sayfasındadır.
PaddleOCR'dan IronOCR'ye geçtikten sonra mevcut testlerime ne olacak?
Çıkarılmış metin içeriğini doğrulayan testler, geçişten sonra çalışmaya devam etmelidir. API çağrı şablonlarını veya COM nesne yaşam döngüsünü doğrulayan testler, IronOCR'un daha basit başlatma ve sonuç modelini yansıtacak şekilde güncellenmelidir.

