IRONSOFTWAREHOME
VÍDEOS

Como melhorar a qualidade da imagem para obter melhores resultados de OCR usando C#

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 de agosto de 2026

Este guia orienta os desenvolvedores .NET através de uma migração completa da família de pacotes Sdcb.PaddleOCR para IronOCR. Abrange todo o processo de substituição: remoção do conjunto de vários pacotes PaddlePaddle, eliminação do gerenciamento de arquivos de modelo e da configuração de GPU, e substituição do pipeline de inferência dependente do OpenCV por uma única instalação do NuGet . Cada seção é independente — não é necessário ler o artigo comparativo previamente.

Por que migrar do PaddleOCR?

O wrapper Sdcb.PaddleOCR é uma ponte mantida pela comunidade entre o ecossistema de aprendizado profundo Python da PaddlePaddle e .NET. Ele cumpre a função, mas carrega consigo todo o peso dessa ponte — arquivos de modelo, binários de inferência nativos, OpenCV para carregamento de imagens e infraestrutura CUDA opcional. Para a maioria das cargas de trabalho de OCR em .NET , essa é uma infraestrutura que o projeto nunca precisou.

Três diretórios de modelos antes da leitura de um único caractere. O pipeline de inferência do PaddleOCR encadeia três redes neurais: um modelo de detecção, um modelo de classificação de direção e um modelo de reconhecimento. Cada rede é um diretório separado de arquivos .pdmodel e .pdiparams que devem existir no disco antes de new PaddleOcrAll(models) compilar para um motor funcional. Se esses arquivos chegarem via download assíncrono — que se conecta ao armazenamento bj.bcebos.com da Baidu na China — ou via uma árvore de diretório models/ mantida manualmente, o desenvolvedor é permanentemente responsável pela versão do modelo. Quando Sdcb.PaddleOCR atualiza, os modelos pré-baixados da versão anterior podem exigir novo download. O IronOCR não possui arquivos de modelo, diretórios de modelo ou problemas de sincronização de versão. O mecanismo está incluído no pacote NuGet .

OpenCV Não É Opcional. Não há caminho de um caminho de arquivo para inferência PaddleOCR que ignore o OpenCvSharp. Toda imagem, independentemente do formato, deve passar por Cv2.ImRead(path) para se tornar um objeto Mat antes que ocr.Run(mat) possa aceitá-la. Isso significa dois pacotes NuGet extras (OpenCvSharp4 e OpenCvSharp4.runtime.win), DLLs nativas específicas da plataforma na saída de implantação e uma linha apt-get install libopencv-dev no Dockerfile.IronOCR aceita caminhos de arquivos, streams, arrays de bytes e System.Drawing.Bitmap diretamente. O intermediário Mat não existe.

A configuração da GPU é um projeto que leva vários dias. Os números de desempenho da GPU anunciados pelo PaddleOCR — 50-100 ms por imagem contra 300-500 ms na CPU — são reais. Para isso, são necessários drivers NVIDIA em uma versão específica, CUDA Toolkit 11.8 (não 12.x), cuDNN 8.6+ instalado nos locais corretos do PATH e um pacote NuGet de tempo de execução da GPU separado. Não Docker, a imagem base deve ser nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 e o host deve ter nvidia-container-toolkit instalado. Equipes sem infraestrutura de GPU existente gastam de 2 a 8 horas na configuração do CUDA por ambiente. O IronOCR foi projetado para inferência por CPU, oferece um tempo de processamento de 150 a 300 ms por imagem em hardware padrão e não requer nenhuma configuração de GPU.

Artefatos de Implantação São 4-6x Maiores. A saída de implantação do PaddleOCR inclui paddle_inference.dll (~200MB), paddle2onnx.dll (~5MB), arquivos opencv_world*.dll (combinados ~50MB) e os diretórios de modelo (~21MB). Uma imagem Docker tem aproximadamente 1,5 GB. Uma instalação do IronOCR tem um tamanho total aproximado de 80 MB; A imagem Docker tem aproximadamente 400 MB. A diferença reside no CI/CD: cada execução de pipeline que restaura pacotes NuGet deve baixar modelos do Baidu ou obtê-los de uma camada de cache mantida separadamente.

Sem saída em PDF pesquisável. O PaddleOCR retorna regiões de texto de imagens e não possui mecanismo para incorporar o texto reconhecido de volta em um PDF como uma camada pesquisável. Criar um PDF pesquisável a partir da saída do PaddleOCR requer uma biblioteca PDF de terceiros, injeção de camadas de texto página por página e remapeamento de coordenadas.IronOCR produz um PDF totalmente pesquisável com uma linha: result.SaveAsSearchablePdf("output.pdf").

O problema fundamental

O PaddleOCR requer a configuração de três diretórios de modelos antes que a inferência possa começar:

// 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);
C#

O IronOCR não possui arquivos de modelo, diretórios de modelo ou dependência do OpenCV:

// 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);
C#

IronOCR vs PaddleOCR (.NET): Comparação de Recursos

A tabela abaixo abrange as dimensões mais importantes durante o planejamento da migração.

RecursoPaddleOCR (Sdcb)IronOCR
Pacotes NuGet necessários4-51
Arquivos de modelo necessáriosSim (3 diretórios, ~21 MB)Não (incluído no pacote)
Fonte para download do modeloServidores Baidu (bj.bcebos.com)Restauração do NuGet (Iron Software)
Dependência do OpenCVRequerido (OpenCvSharp4)None
Entrada de imagemVia Mat mat = Cv2.ImRead()Caminho direto do arquivo, fluxo, matriz de bytes
Entrada nativa de PDFNãoSim (input.LoadPdf())
Saída em PDF pesquisávelNãoSim (result.SaveAsSearchablePdf())
Entrada TIFF multiframeLoop manual por quadroinput.LoadImageFrames()
suporte a GPUSim (CUDA 11.8 + cuDNN necessários)Otimizado para CPU (não requer GPU)
Pré-processamento integradoNão (a rede neural lida com distorção/ruído)Sim (Corrigir distorção, Reduzir ruído, Contraste, Binarizar, Nitidez)
Idiomas suportados14125+
Método de instalação do idiomaDownloadAsync() por modelo de linguagemdotnet add package IronOcr.Languages.*
Simultaneidade multilíngueNão (modelo separado por idioma)Sim (OcrLanguage.English + OcrLanguage.French)
Saída estruturadaresult.Regions (espacial, não ordenado)Páginas, Parágrafos, Linhas, Palavras, Caracteres
Pontuação de confiançaFlutuação por região (0-1)Percentagem por palavra (0-100)
Leitura de código de barrasNãoSim (ocr.Configuration.ReadBarCodes = true)
Exportação hOCRNãoSim
Tamanho da implantação300-500 MB~80MB
tamanho da imagem Docker~1,5 GB (com CUDA base)~400MB
Tempo de partida a frio3-5 segundos (carregamento do modelo)Menos de 1 segundo
MultiplataformaWindows, Linux (parcial)Windows, Linux, macOS, Docker, Azure, AWS
Compatibilidade com .NET.NET 6+ (wrapper da comunidade).NET Framework 4.6.2+, .NET 5/6/7/8/9
Suporte comercialComunidade / Problemas do GitHubSim (Iron Software, com SLA)
LicençaApache 2.0 (gratuito)Perpetual ($999 Lite / $1,499 Pro / $2,999 Enterprise)

Guia de Início Rápido: Migração do PaddleOCR (.NET) para o IronOCR

Passo 1: Substituir pacotes NuGet

Remova todos os cinco pacotes relacionados ao PaddleOCR:

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
SHELL

Se o ambiente de execução da GPU estiver instalado, remova-o também:

dotnet remove package Sdcb.PaddleInference.runtime.win64.cuda118
SHELL

Instale o IronOCR a partir da página de pacotes NuGet :

dotnet add package IronOcr

Etapa 2: Atualizar Namespaces

Substitua todas as importações de namespace do PaddleOCR e do OpenCvSharp:

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

// After (IronOCR)
using IronOcr;
C#

Etapa 3: Inicializar a licença

Adicione a inicialização da licença uma vez ao iniciar o aplicativo, antes de qualquer instância IronTesseract ser criada:

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

Uma chave de avaliação gratuita está disponível na página de licenciamento do IronOCR . A versão de avaliação gera imagens com marca d'água e permite testar todos os recursos antes da compra.

Exemplos de migração de código

Eliminação da configuração do caminho do modelo local

Projetos que fazem o download prévio de arquivos de modelo do PaddleOCR para evitar conexões com o servidor Baidu em tempo de execução devem configurar três caminhos de diretório separados. Essa configuração deve ser atualizada sempre que a versão do wrapper for alterada.

Abordagem PaddleOCR:

// 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);
C#

Abordagem IronOCR:

// Não model 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);
C#

A árvore de diretórios models/, as três chamadas FromDirectory() e a preocupação de sincronização de versão desaparecem. O mecanismo IronOCR está incluído no pacote NuGet durante a restauração e não requer resolução de caminho em tempo de execução. Veja o guia de configuração do IronTesseract para opções de inicialização, incluindo o posicionamento da chave de licença em appsettings.json.

Consolidação de pipeline de detecção e reconhecimento em dois estágios

O pipeline de rotação e orientação do PaddleOCR é configurado através de propriedades em PaddleOcrAll. Replicar esse comportamento no IronOCR usa os métodos de pré-processamento OcrInput, que lidam com os mesmos problemas de documento com uma superfície de chamada mais simples.

Abordagem PaddleOCR:

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})");
}
C#

Abordagem IronOCR:

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}%)");
    }
}
C#

O método Deskew()IronOCR lida com a detecção de rotação como parte do pipeline de pré-processamento. A coleção Lines do resultado é entregue em ordem de leitura pelo motor de layout Tesseract, eliminando o padrão de ordenação manual. O guia de correção de orientação de imagem documenta toda a gama de opções de rotação e correção de inclinação.

Remoção da seleção de dispositivos de GPU e CPU

Aplicações PaddleOCR que executam inferência em GPU têm a maior superfície de migração: o pacote NuGet de runtime da GPU, os pré-requisitos de ambiente CUDA/cuDNN e a chamada de configuração PaddleDevice.Gpu(). Tudo isso é removido durante a migração.

Abordagem PaddleOCR:

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);
C#

Abordagem IronOCR:

A abordagem IronOCR é idêntica ao exemplo acima — IronTesseract lida com esse cenário com a mesma chamada de API. Não são necessários pacotes de GPU, pré-requisitos CUDA ou seleção de dispositivo. Substitua new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0)) por new IronTesseract() e remova toda a configuração relacionada à GPU.

O IronOCR oferece um tempo de processamento de 150 a 300 ms por imagem na CPU — mais rápido que o PaddleOCR na CPU (300 a 500 ms) e suficiente para a maioria das cargas de trabalho de APIs web e pipelines de documentos, sem a necessidade de infraestrutura de GPU. Para cenários de alto desempenho, o guia de otimização de velocidade abrange opções de configuração, incluindo gerenciamento de threads e ajuste do modo de segmentação de páginas.

Extração de dados de documentos estruturados

O PaddleOCR retorna um array plano de objetos PaddleOcrResultRegion ordenados espacialmente, não por fluxo de leitura. A extração da estrutura em nível de parágrafo ou de linha requer lógica de agrupamento manual baseada na proximidade da caixa delimitadora. O IronOCR fornece uma árvore de resultados hierárquica com ordem de leitura garantida.

Abordagem PaddleOCR:

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);

// Não paragraph 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);
}
C#

Abordagem IronOCR:

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}");
    }
}
C#

A aproximação manual de agrupamento de linhas — arredondamento das coordenadas Y para o tamanho de um bucket de pixels — é substituída pela segmentação de parágrafos integrada ao mecanismo de layout do Tesseract. As coordenadas da caixa delimitadora estão disponíveis em todos os níveis da hierarquia através de paragraph.X, paragraph.Y, paragraph.Width, e paragraph.Height. Consulte o guia de resultados estruturados e o tutorial de leitura de texto em imagens para obter uma cobertura completa da árvore de resultados.

Geração de PDF pesquisável

O PaddleOCR não gera nenhum arquivo PDF como saída. Gerar um PDF pesquisável a partir dos resultados do PaddleOCR requer uma biblioteca PDF separada, mapeamento manual de coordenadas de region.Rect para unidades de página PDF e injeção de uma camada de texto invisível. O IronOCR gera um PDF pesquisável diretamente a partir do resultado do OCR.

Abordagem PaddleOCR:

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);

// Não built-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.");
C#

Abordagem IronOCR:

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}%");
C#

O problema de mapeamento de coordenadas — converter coordenadas de pixel do OpenCV para o espaço de pontos do PDF na DPI correta — não existe no IronOCR. O guia de PDF pesquisável aborda a saída de várias páginas, PDFs protegidos por senha e configurações de qualidade de saída. Para equipes que digitalizam arquivos digitalizados ou criam fluxos de trabalho de fax para PDF pesquisável, essa chamada de método única substitui o que, de outra forma, seria um projeto de integração substancial.

Processamento em lote de TIFF com múltiplos quadros

Arquivos TIFF com várias páginas aparecem com frequência em fluxos de trabalho de digitalização de documentos. O PaddleOCR não tem suporte direto para TIFF de múltiplos quadros — cada quadro deve ser extraído individualmente usando uma biblioteca de imagem externa e carregado como um Mat separado. O IronOCR processa arquivos TIFF com múltiplos quadros nativamente.

Abordagem PaddleOCR:

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());
C#

Abordagem IronOCR:

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");
C#

O loop de extração de quadros, a dependência System.Drawing, a criação de arquivo temporário e a lógica de limpeza são todas removidas.IronOCR carrega todos os quadros em uma única chamada LoadImageFrames() e expõe cada quadro como um Page no resultado. O guia de entrada TIFF e GIF aborda opções de carregamento de vários quadros, intervalos de quadros selecionáveis ​​e considerações de memória para grandes arquivos TIFF.

Referência de mapeamento da API PaddleOCR (.NET) para IronOCR

PaddleOCR (Sdcb)IronOCRNotas
Sdcb.PaddleOCRIronOcrEspaço de nomes
Sdcb.PaddleOCR.Models.OnlineN / DNão é necessário nenhum namespace para aquisição de modelo.
Sdcb.PaddleInferenceN / DNão é necessário nenhum namespace de backend de inferência.
FullOcrModelN / DNão há equivalente — os modelos são agrupados.
OnlineFullModels.ChineseV4.DownloadAsync()dotnet add package IronOcr.Languages.ChineseSimplifiedA aquisição de modelos foi substituída pelo NuGet.
LocalDetectionModel.FromDirectory(path)N / DSem gerenciamento de caminho de modelo
LocalClassificationModel.FromDirectory(path)N / DSem gerenciamento de caminho de modelo
LocalRecognitionModel.FromDirectory(path)N / DSem gerenciamento de caminho de modelo
new PaddleOcrAll(models)new IronTesseract()Instanciação do motor
new PaddleOcrAll(models, PaddleDevice.Gpu(0))N / DA seleção de dispositivo GPU foi completamente removida.
PaddleDevice.Cpu()N / DO único modo é CPU; Nenhuma seleção necessária
ocr.AllowRotateDetection = trueinput.Deskew()Correção de rotação
ocr.Enable180Classification = trueAutomáticoA detecção de posição invertida já está integrada.
Cv2.ImRead(path)input.LoadImage(path)Carregamento de imagens — sem necessidade de OpenCV
ocr.Run(mat)ocr.Read(input)Executar OCR
result.Textresult.TextTexto completo do documento
result.Regionsresult.Pages[0].Lines ou .WordsRegiões de texto estruturado
region.Textword.Text / line.TextConteúdo textual de uma região
region.Score (float 0-1)word.Confidence (int 0-100)Valor de confiança — a escala difere
region.Rect.Center.Xword.XPosição horizontal
region.Rect.Center.Yword.YPosição vertical
region.Rect.Size.Widthword.WidthLargura da caixa delimitadora
region.Rect.Size.Heightword.HeightAltura da caixa delimitadora
N / Dinput.LoadPdf(path)Entrada de PDF nativa (sem equivalente ao PaddleOCR)
N / Dinput.LoadImageFrames(path)TIFF com múltiplos quadros (sem equivalente no PaddleOCR)
N / Dresult.SaveAsSearchablePdf(path)Saída em PDF pesquisável (sem equivalente ao PaddleOCR)

Problemas e soluções comuns em migrações

Problema 1: Incompatibilidade na Escala de Confiança

PaddleOCR: A confiança da região é um float de 0.0 a 1.0. Um limiar comum é region.Score >= 0.8 para filtrar detecções de baixa qualidade.

Solução: A confiança do IronOCR é um percentual int de 0 a 100. Multiplique o limiar do PaddleOCR por 100:

// 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);
C#

A confiança em nível de documento está disponível como result.Confidence para rápida seleção de qualidade. O guia de pontuação de confiança abrange limites por palavra e por documento.

Questão 2: Pressupostos sobre a ordem de leitura

PaddleOCR: result.Regions é ordenado pela sequência de detecção, não pela ordem de leitura. Qualquer código que consuma result.Text esperando saída de cima para baixo, da esquerda para a direita, depende do padrão de ordenação manual usado em todos os exemplos do PaddleOCR.

Solução: O result.Text do IronOCR já está em ordem de leitura. Remova a classificação manual. Para casos em que a ordenação foi usada para construir uma saída linha por linha, use result.Pages[0].Lines diretamente:

// 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);
C#

Problema 3: Código de conversão de matriz OpenCV

PaddleOCR: Algumas bases de código contêm métodos auxiliares que carregam imagens de streams ou arrays de bytes escrevendo primeiro em um arquivo temporário e depois chamando Cv2.ImRead(). Esses padrões existem porque Cv2.ImRead() só aceita caminhos de arquivos.

Solução: O OcrInput do IronOCR aceita streams e arrays de bytes diretamente. Exclua o arquivo temporário intermediário:

// 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);
C#

O guia de entrada de fluxo abrange o carregamento de fluxos a partir de respostas HTTP, blobs de banco de dados e fluxos de memória.

Problema 4: Remoção do padrão de inicialização assíncrona

PaddleOCR: A inicialização do mecanismo é assíncrona porque o download do modelo envolve entrada/saída de rede. Isso força a execução assíncrona em toda a cadeia de chamadas, o que pode ser problemático em contextos síncronos, como construtores ou manipuladores de eventos não assíncronos.

Solução: A inicialização do IronOCR é síncrona. new IronTesseract() não executa I/O. Remova o await e o modificador async de qualquer método cuja única operação assíncrona foi o download do modelo:

// 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;
}
C#

IronOCR também fornece suporte assíncrono nativo via ocr.ReadAsync(input) quando a execução não bloqueante é genuinamente necessária em um contexto assíncrono.

Problema 5: Limpeza da etapa de compilação do Docker

PaddleOCR: O Dockerfile contém apt-get install libopencv-dev, uma instrução COPY models/ /app/models/, e frequentemente um passo RUN de pré-download do modelo. A imagem base é frequentemente a imagem NVIDIA CUDA para implantações em GPU.

Solução: Remova todas as instruções do Dockerfile específicas do PaddleOCR. A imagem Docker do IronOCR não requer nenhuma imagem base especial nem etapa de cópia de modelo:

# 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"]
Text

A imagem resultante diminui de aproximadamente 1,5 GB para aproximadamente 400 MB. O guia de implantação do Docker aborda os requisitos de biblioteca do Linux e as compilações para múltiplas arquiteturas.

Problema 6: Invalidação do cache do modelo CI/CD

PaddleOCR: Pipelines de CI/CD que armazenam em cache a etapa de restauração do NuGet devem gerenciar separadamente o cache de arquivos de modelo. Um padrão comum é armazenar em cache uma pasta models/ entre execuções. Quando a versão do wrapper é atualizada, a chave do cache muda e os modelos precisam ser baixados novamente dos servidores do Baidu, adicionando de 30 a 60 segundos ao processo.

Solução: O IronOCR não possui um diretório de cache de modelos. O único cache necessário é o cache padrão de pacotes NuGet . Sem etapa de cache separada, sem invalidação de cache em atualizações de wrapper, sem download de servidores de terceiros durante a CI:

# 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')}}
Text

Lista de verificação para migração do PaddleOCR (.NET)

Pré-migração

Antes de fazer qualquer alteração, audite o código-fonte para identificar todos os usos do PaddleOCR:

# 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" .
SHELL

Inventariar os diretórios de modelos e observar o tamanho total. Identificar quais modelos de linguagem estão em uso (Chinês, Inglês, Japonês, etc.) para determinar quais pacotes IronOcr.Languages.* adicionar. Verifique se há configuração de GPU presente — esses arquivos têm a maior área a ser limpa.

Migração de código

  1. Remova Sdcb.PaddleOCR, Sdcb.PaddleOCR.Models.Online, Sdcb.PaddleInference.runtime.*, OpenCvSharp4, e OpenCvSharp4.runtime.* do arquivo .csproj
  2. Adicione IronOcr ao arquivo .csproj
  3. Adicione pacotes IronOcr.Languages.* para cada idioma não-inglês anteriormente baixado como um modelo PaddleOCR
  4. Substitua todas as diretivas using Sdcb.PaddleOCR* e using OpenCvSharp por using IronOcr
  5. Adicione IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; ao início do aplicativo
  6. Substitua FullOcrModel models = await OnlineFullModels.*.DownloadAsync() por nada — remova a linha completamente
  7. Substitua new PaddleOcrAll(models) por new IronTesseract()
  8. Substitua new PaddleOcrAll(models, PaddleDevice.Gpu(deviceId: 0)) por new IronTesseract()
  9. Substitua Mat mat = Cv2.ImRead(path) por var input = new OcrInput(); input.LoadImage(caminho);
  10. Substitua ocr.Run(mat) por ocr.Read(input)
  11. Substitua o acesso result.Regions por result.Pages[0].Lines ou result.Pages[0].Words
  12. Substitua region.Score >= threshold por word.Confidence >= threshold * 100
  13. Substitua region.Rect.Center.X / .Center.Y por word.X / word.Y
  14. Remover a lógica de classificação manual — a saída do IronOCR já está em ordem de leitura.
  15. Remova o diretório models/ e todos os arquivos de modelo do repositório e dos scripts de implantação

Pós-migração

  • Verifique se dotnet build é bem sucedido sem referências a Sdcb.*, OpenCvSharp, ou PaddleInference na saída de compilação
  • Execute o OCR no mesmo conjunto de documentos representativos usado para validar a saída do PaddleOCR e compare a precisão do texto.
  • Confirme se os valores de confiança estão sendo lidos como números inteiros de 0 a 100 (e não como números de ponto flutuante de 0 a 1) em todos os pontos de filtro.
  • Verifique se a ordem de leitura está correta sem classificação manual — verifique especificamente os layouts de várias colunas e de faturas.
  • Teste se a construção da imagem Docker completa sem a imagem base CUDA ou apt-get install libopencv-dev
  • Confirme se o tamanho da imagem Docker é inferior a 500 MB
  • Execute o pipeline de CI/CD de ponta a ponta e verifique se não ocorrem downloads externos durante a compilação.
  • Teste de implantação isolada da internet: verifique se o aplicativo inicia e processa documentos sem conexões de rede de saída.
  • Para entradas TIFF com múltiplos quadros, verifique se todos os quadros foram processados ​​e se a contagem de quadros corresponde ao arquivo de origem.
  • Para qualquer entrada PDF, verifique se input.LoadPdf() produz a mesma contagem de páginas e conteúdo de texto que a conversão anterior baseada em PdfiumViewer

Principais benefícios da migração para o IronOCR

Artefatos de Implantação Diminuem em 80 Porcento. O impacto de implantação do PaddleOCR — paddle_inference.dll, OpenCV DLLs e três diretórios de modelo — adiciona 300-500 MB a cada alvo de implantação. Após a migração, a instalação do IronOCR tem aproximadamente 80 MB. As imagens do Docker diminuíram de aproximadamente 1,5 GB para cerca de 400 MB. A inicialização de contêineres é mais rápida, os custos de armazenamento são menores e os pipelines de implantação que antes transferiam 500 MB de artefatos agora transferem 80 MB.

O tempo de inicialização a frio cai de segundos para milissegundos. O PaddleOCR carrega três arquivos de modelo de rede neural do disco na primeira inferência, adicionando uma pausa de 3 a 5 segundos antes do retorno da primeira chamada. Em funções sem servidor, cenários de escalonamento automático ou qualquer contexto em que novas instâncias sejam criadas sob demanda, essa inicialização a frio é cobrada repetidamente. O mecanismo do IronOCR é integrado e inicializa em menos de um segundo. O exemplo básico de OCR demonstra o padrão de inicialização.

A cobertura de idiomas expande de 14 para 125 sem necessidade de alterações na infraestrutura. O PaddleOCR agora oferece suporte a 14 idiomas. Adicionar qualquer um dos 111 idiomas suportados IronOCR, além do limite do PaddleOCR, requer apenas a adição de um pacote NuGet por idioma — sem necessidade de baixar modelos, gerenciar diretórios ou sincronizar versões. Equipes cujo volume de documentos se expande para novos mercados não precisam reescrever o documento nem desenvolver uma nova infraestrutura para adicionar suporte a OCR em polonês, vietnamita, grego ou hebraico. O catálogo completo de idiomas mostra todos os mais de 125 pacotes disponíveis.

A saída em PDF pesquisável requer apenas uma linha. O PaddleOCR retorna regiões de texto. Converter essas regiões em uma camada PDF pesquisável requer uma biblioteca PDF separada, conversão de coordenadas de pixel para ponto e código invisível de injeção de texto que se torna uma manutenção permanente. Após a migração, result.SaveAsSearchablePdf("output.pdf") substitui todo esse subsistema. Fluxos de trabalho de arquivamento de documentos digitalizados, conversões de fax para PDF e integrações de gerenciamento de documentos são diretamente beneficiados. O guia passo a passo para PDFs pesquisáveis ​​e a postagem no blog sobre extração de dados de PDFs abordam todas as opções de saída.

Nenhuma Conexão de Rede Externa em Qualquer Etapa. O PaddleOCR conecta-se ao armazenamento bj.bcebos.com da Baidu para downloads de modelo. Em ambientes onde as conexões de saída são restritas — redes governamentais, sistemas isolados da internet, infraestrutura de serviços financeiros — essa conexão requer uma exceção no firewall ou um fluxo de trabalho de pré-download que aumenta a complexidade da CI/CD. O IronOCR não faz conexões externas em tempo de execução. Os modelos são restaurados como parte do dotnet restore do NuGet e estão presentes na saída de implantação. O guia de implantação da AWS e o guia de implantação do Azure abordam a configuração específica da nuvem para ambientes com restrições de rede.

Um Contato de Suporte Comercial para Toda a Pilha OCR. As questões do PaddleOCR abrangem o wrapper Sdcb.PaddleOCR (GitHub da comunidade), o framework PaddlePaddle (Baidu), o OpenCvSharp (comunidade), e o CUDA/cuDNN (NVIDIA). Cada nível de suporte possui um canal diferente, sem garantia de tempo de resposta. O IronOCR é um produto único da Iron Software com suporte comercial por e-mail e níveis de resposta prioritária. O centro de documentação do IronOCR reúne toda a documentação da API, guias práticos e recursos de resolução de problemas em um só lugar.

Observe: PDFium, PaddleOCR, PDFSharp, Tesseract, e iText são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado, ou patrocinado por Baidu, Chromium Project, Google, PaddlePaddle, empira Software GmbH, ou iText Group. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.