Saltar al pie de página
USANDO IRONOCR

Cómo realizar OCR en un PDF en C#: Extraer texto de documentos escaneados con .NET

Los documentos PDF escaneados suponen un reto constante para los desarrolladores de .NET: el texto existe únicamente como imágenes, lo que hace imposible buscarlo, copiarlo o procesarlo mediante programación. El reconocimiento óptico de caracteres (OCR) resuelve esto al convertir imágenes escaneadas en datos editables y buscables, transformando documentos en papel, imágenes capturadas con una cámara o cualquier archivo PDF basado en imágenes en texto legible por máquina. Ya sea que el objetivo sea digitalizar archivos en papel, automatizar la extracción de datos o crear flujos de procesamiento de documentos, la capacidad de realizar OCR en archivos PDF en C# es una función fundamental.

IronOCR es una biblioteca OCR for .NET basada en el motor Tesseract 5 con mejoras adicionales de precisión. Permite a los desarrolladores extraer texto de cualquier documento PDF —escaneado o de otro tipo— con unas pocas líneas de código. Este artículo repasa los flujos de trabajo principales: OCR básico de PDF, procesamiento selectivo por páginas, extracción por regiones y preprocesamiento de imágenes para escaneos complejos.

¿Cómo realizar OCR en un PDF en C#?

La forma más rápida de extraer texto de archivos PDF en .NET comienza con la instalación de IronOCR a través de NuGet. Abra una terminal en el directorio de su proyecto y ejecute:

dotnet add package IronOcr

Una vez instalado el paquete, el siguiente programa de nivel superior lee un PDF escaneado e imprime el texto extraído:

using IronOcr;

// Initialize the OCR engine
var ocr = new IronTesseract();

// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");

// Run recognition
OcrResult result = ocr.Read(input);

// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
using IronOcr;

// Initialize the OCR engine
var ocr = new IronTesseract();

// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");

// Run recognition
OcrResult result = ocr.Read(input);

// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr

' Initialize the OCR engine
Dim ocr As New IronTesseract()

' Load the PDF and perform OCR
Using input As New OcrInput()
    input.LoadPdf("scanned-report.pdf")

    ' Run recognition
    Dim result As OcrResult = ocr.Read(input)

    ' Access the extracted text
    Dim text As String = result.Text
    Console.WriteLine(text)
End Using
$vbLabelText   $csharpLabel

La clase IronTesseract envuelve Tesseract 5 con optimizaciones nativas de .NET para objetivos tanto de .NET Core como de .NET Framework. El objeto OcrInput gestiona la carga de PDF y el renderizado interno de páginas. Cuando se llama a Read, el proceso OCR analiza cada página y devuelve un OcrResult que contiene el texto extraído completo, además de datos estructurados sobre párrafos, líneas, palabras y sus coordenadas de píxeles.

El resultado se puede escribir en un archivo de texto, pasar a la lógica de procesamiento posterior, almacenar en una base de datos o introducir en un proceso de indexación de documentos. Para obtener más información sobre el motor subyacente, consulte la documentación de Tesseract OCR y la referencia de la API de IronOCR.

Entrada

Cómo hacer OCR a un PDF: Extraer texto de documentos escaneados con C# .NET OCR PDF: Imagen 1 - Ejemplo de entrada PDF

Resultado

Cómo hacer OCR a un PDF: Extraer texto de documentos escaneados con C# .NET OCR PDF: Imagen 2 - Salida de consola

¿Cómo se leen páginas específicas de un PDF?

Procesar todas las páginas de un documento extenso supone una pérdida de tiempo y memoria cuando solo algunas páginas contienen contenido relevante. IronOCR te permite seleccionar páginas específicas pasando índices de página basados en cero a LoadPdf:

using IronOcr;
using System.Collections.Generic;

var ocr = new IronTesseract();

// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };

using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using System.Collections.Generic;

var ocr = new IronTesseract();

// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };

using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System.Collections.Generic

Dim ocr As New IronTesseract()

' Specify pages to process (zero-based: 0 = first page)
Dim targetPages As New List(Of Integer) From {0, 2, 4}

Using input As New OcrInput()
    input.LoadPdf("lengthy-document.pdf", pageIndices:=targetPages)

    Dim result As OcrResult = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

La carga selectiva de páginas reduce tanto el tiempo de procesamiento como el consumo de memoria, lo cual es importante cuando se trabaja con archivos de varios cientos de páginas en los que solo unas pocas contienen los datos necesarios. La convención de indexación desde cero se ajusta a las colecciones estándar de .NET Standard: el índice de página 0 es la primera página del documento.

En el caso de documentos en los que no se conozcan de antemano las páginas relevantes, considere la posibilidad de realizar primero un procesamiento rápido de todo el documento con un DPI reducido para identificar los números de página y, a continuación, volver a ejecutarlo con la configuración completa solo en esas páginas.

Aprende más sobre el control a nivel de página en la documentación de selección de página de IronOCR.

¿Cómo se extraen datos de una región específica de una página?

El procesamiento de facturas, la digitalización de formularios y el análisis de documentos estructurados suelen requerir la extracción de texto de un área definida, en lugar de escanear una página completa. IronOCR admite OCR orientado a regiones a través del parámetro ContentAreas, que acepta un array de objetos Rectangle que especifican qué porciones de cada página analizar:

using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
    new Rectangle(130, 290, 250, 50)   // Invoice number field
};

using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
    new Rectangle(130, 290, 250, 50)   // Invoice number field
};

using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing

Dim ocr As New IronTesseract()

' Define the scan region: X, Y, Width, Height (all in pixels from top-left)
Dim invoiceFields As Rectangle() = {
    New Rectangle(130, 290, 250, 50)   ' Invoice number field
}

Using input As New OcrInput()
    input.LoadPdf("invoice.pdf", contentAreas:=invoiceFields)

    Dim result As OcrResult = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

El constructor Rectangle toma cuatro parámetros enteros: la coordenada X, la coordenada Y, el ancho y la altura, todos medidos en píxeles desde la esquina superior izquierda de la página renderizada. Centrarse en una zona pequeña en lugar de en una página completa reduce tanto el tiempo de OCR como la probabilidad de que el motor capte ruido circundante o campos de texto no relacionados.

Para flujos de trabajo de procesamiento de facturas por lotes, combina la extracción por regiones con la iteración sobre result.Pages para obtener datos estructurados de la misma posición de campo en cientos de documentos. Cada resultado de página muestra el texto reconocido para su área de contenido de forma independiente.

El ejemplo de áreas de contenido de IronOCR proporciona opciones de configuración adicionales para escenarios de múltiples regiones.

Entrada

Cómo hacer OCR a un PDF: Extraer texto de documentos escaneados con C# .NET OCR PDF: Imagen 3 - Ejemplo de factura

Resultado

Cómo hacer OCR a un PDF: Extraer texto de documentos escaneados con C# .NET OCR PDF: Imagen 4 - Datos extraídos

¿Cómo se mejora la precisión del OCR en documentos escaneados?

Los documentos escaneados del mundo real suelen presentar problemas de calidad: páginas torcidas, baja resolución o ruido digital introducido por el hardware o el software de escaneo. IronOCR incluye un conjunto de filtros de preprocesamiento de imágenes que corrigen estos problemas antes de que se ejecute el motor de reconocimiento:

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);

// Apply image correction filters
input.Deskew();    // Automatically straighten rotated pages
input.DeNoise();   // Remove scanning artifacts and speckles

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);

// Apply image correction filters
input.Deskew();    // Automatically straighten rotated pages
input.DeNoise();   // Remove scanning artifacts and speckles

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Dim ocr = New IronTesseract()

Using input = New OcrInput()
    ' Load PDF at higher DPI for improved text recognition on small fonts
    input.LoadPdf("poor-quality-scan.pdf", dpi:=300)

    ' Apply image correction filters
    input.Deskew()    ' Automatically straighten rotated pages
    input.DeNoise()   ' Remove scanning artifacts and speckles

    Dim result As OcrResult = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

El parámetro dpi controla la resolución en la que se renderizan las páginas PDF antes de ejecutar el reconocimiento. Los valores más altos (de 200 a 300 ppp) mejoran la precisión en documentos con texto pequeño o denso, a costa de un consumo ligeramente mayor de memoria durante el procesamiento. El método Deskew detecta y corrige automáticamente la rotación de la página. DeNoise elimina manchas y artefactos que pueden confundir el paso de reconocimiento de caracteres.

Para documentos que requieran una corrección de imágenes más agresiva, IronOCR también ofrece mejora del contraste, binarización (conversión de páginas a blanco y negro) y ajustes de escala. La combinación secuencial de varios filtros permite recuperar texto utilizable de escaneos que, de otro modo, producirían resultados ilegibles. Revise la referencia de filtros de imagen de IronOCR para la lista completa de operaciones de preprocesamiento disponibles.

¿Cómo gestionáis los documentos protegidos con contraseña y los de múltiples formatos?

IronOCR no se limita a los archivos PDF estándar. La biblioteca gestiona una amplia gama de escenarios de entrada que aparecen con frecuencia en los flujos de trabajo de procesamiento de documentos.

Los archivos PDF protegidos con contraseña son compatibles pasando las credenciales durante la construcción de la entrada:

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadPdf("protected.pdf", password:="secret123")

    Dim result As OcrResult = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

Formatos de imagen — PNG, JPEG, TIFF, BMP, GIF y TIFF de varias páginas — se cargan con los métodos correspondientes LoadImage o LoadImageFrames. Se aplican los mismos filtros de preprocesamiento y opciones de segmentación por región, independientemente del formato de entrada.

Los documentos multilingües se gestionan a través del sistema de paquetes de idiomas de IronOCR. La biblioteca viene por defecto con inglés y admite más de 125 paquetes de idiomas adicionales que cubren latín, cirílico, CJK, árabe y otros scripts. Carga idiomas adicionales antes de llamar a Read:

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.German
$vbLabelText   $csharpLabel

Para documentos que mezclan varios idiomas en la misma página, el modo MultiLanguage está disponible. Esto resulta especialmente valioso para el procesamiento de facturas en entornos internacionales, donde los encabezados, las partidas y las direcciones pueden aparecer en diferentes idiomas.

La implementación funciona en entornos Windows, Linux, macOS y en la nube, incluidos Azure y contenedores Docker.

¿Cómo se crean archivos PDF con capacidad de búsqueda a partir de documentos escaneados?

Más allá de extraer texto en cadenas, IronOCR puede generar archivos PDF con capacidad de búsqueda: un PDF en el que la imagen escaneada original se conserva como capa visual, mientras que se incrusta una capa de texto invisible para operaciones de búsqueda y copia. Este es el formato estándar generado por escáneres de documentos profesionales.

La característica PDF buscable de IronOCR acepta un OcrResult y escribe un nuevo archivo PDF:

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");

OcrResult result = ocr.Read(input);

// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");

OcrResult result = ocr.Read(input);

// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadPdf("scanned-archive.pdf")

    Dim result As OcrResult = ocr.Read(input)

    ' Save as a searchable PDF
    result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
$vbLabelText   $csharpLabel

El archivo de salida se puede abrir en cualquier lector de PDF. Las operaciones de selección, búsqueda y copia de texto funcionan en la capa de texto incrustada, al tiempo que se conserva el aspecto original del escaneo. Este formato suele ser necesario para archivos de cumplimiento normativo, repositorios de documentos legales y sistemas de gestión de contenidos Enterprise.

Para formatos de salida adicionales, el objeto OcrResult también expone puntuaciones de confianza por página, cajas delimitadoras a nivel de palabra y datos estructurados de párrafos, todos útiles para tareas de clasificación o indexación posteriores.

¿Cómo se leen los BarCodes y los códigos QR junto con el texto?

Los procesos de procesamiento de documentos a menudo necesitan extraer tanto texto legible para humanos como códigos legibles para máquinas del mismo documento. IronOCR puede detectar y descodificar BarCodes y códigos QR durante la misma pasada de OCR, sin necesidad de una biblioteca independiente.

Habilita la lectura de códigos de barras en la instancia IronTesseract antes del procesamiento:

using IronOcr;

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");

OcrResult result = ocr.Read(input);

// Access recognized text
Console.WriteLine(result.Text);

// Access barcode data
foreach (var barcode in result.Barcodes)
{
    Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
using IronOcr;

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");

OcrResult result = ocr.Read(input);

// Access recognized text
Console.WriteLine(result.Text);

// Access barcode data
foreach (var barcode in result.Barcodes)
{
    Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronOcr

Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True

Using input As New OcrInput()
    input.LoadPdf("shipment-labels.pdf")

    Dim result As OcrResult = ocr.Read(input)

    ' Access recognized text
    Console.WriteLine(result.Text)

    ' Access barcode data
    For Each barcode In result.Barcodes
        Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}")
    Next
End Using
$vbLabelText   $csharpLabel

Esto resulta especialmente útil para el procesamiento de etiquetas de envío, la gestión de inventario y cualquier flujo de trabajo en el que aparezcan BarCodes y texto impreso juntos en documentos escaneados. La guía de lectura de códigos de barras de IronOCR cubre formatos compatibles, incluyendo Code 128, códigos QR, Data Matrix y PDF417.

¿Cuál es la diferencia entre los tipos de entrada de IronOCR?

IronOCR ofrece dos métodos principales para cargar archivos PDF, cada uno adecuado para diferentes escenarios:

Comparación de métodos de entrada de PDF de IronOCR
Acercarse Clase Best para Notas
Información general OcrInput.LoadPdf() La mayoría de los casos de uso Admite todos los filtros de preprocesamiento, selección de páginas y áreas de contenido
Específico para PDF OcrPdfInput Escenarios sencillos Envoltura de conveniencia; menos opciones de configuración
Archivos de imagen OcrInput.LoadImage() PNG, JPEG, TIFF, BMP Mismo preprocesamiento y selección de región que en el caso de los archivos PDF
TIFF multipágina OcrInput.LoadImageFrames() Archivos de fax, salida de escáner Procesa cada fotograma como una página independiente

Para la mayoría de escenarios de producción, OcrInput.LoadPdf() es el enfoque recomendado porque expone toda la API de preprocesamiento y configuración. OcrPdfInput funciona bien para prototipos rápidos o situaciones donde las configuraciones predeterminadas son suficientes.

¿Cuales son tus próximos pasos?

Los ejemplos de código anteriores cubren los flujos de trabajo básicos de IronOCR para el OCR de PDF en C#. A continuación, se incluye una breve lista de verificación para dar el siguiente paso:

  • Install the package: dotnet add package IronOcr or search for IronOCR on NuGet
  • Ejecute el ejemplo básico: confirme la extracción de texto de un PDF de muestra antes de desarrollar la lógica completa del proceso.
  • Aplicar preprocesamiento: Si se trabaja con documentos escaneados, añade llamadas Deskew y DeNoise y prueba con muestras representativas
  • Explora características adicionales: salidas PDF buscables, lectura de códigos de barras, soporte multi-idioma, y salida de datos estructurados
  • Revisar la guía de implementación: los artículos sobre implementación en Azure, Docker y Linux abordan la configuración específica de cada entorno
  • Prueba la versión de prueba gratuita: Inicia una prueba gratuita para probar todas las funciones antes de adquirir una licencia
  • Obtener una licencia: Las opciones de licencia de IronOCR abarcan desde desarrolladores individuales hasta implementaciones Enterprise, con redistribución libre de regalías

Si tiene preguntas sobre casos de uso específicos, la biblioteca IronOCR ofrece artículos paso a paso que abarcan docenas de escenarios. La superficie completa de la API está documentada en la referencia de la API de IronOCR.

Preguntas Frecuentes

¿Cuál es el código mínimo necesario para realizar OCR en un PDF en C#?

Usando IronOCR, el código mínimo es: crear una instancia de IronTesseract, crear un OcrInput, llamar a input.LoadPdf con la ruta del archivo y, finalmente, llamar a ocr.Read(input). La propiedad result.Text devuelve la cadena extraída.

¿Cómo instalar IronOCR en un proyecto .NET ?

Ejecute 'dotnet add package IronOCR' en la terminal o busque IronOCR en el Administrador de paquetes NuGet dentro de Visual Studio.

¿Puede IronOCR procesar sólo páginas específicas de un PDF?

Sí. Pasar una lista Índices de página basados ​​en cero en el parámetro pageIndices de LoadPdf. Solo se renderizan y procesan las páginas especificadas, lo que reduce el tiempo y el uso de memoria.

¿Cómo extraer texto de una región específica de un PDF escaneado?

Pase una matriz de objetos Rectángulo al parámetro contentAreas de LoadPdf. Cada rectángulo especifica la posición X, la posición Y, el ancho y la altura en píxeles desde la esquina superior izquierda de la página.

¿Qué filtros de preprocesamiento proporciona IronOCR para los documentos escaneados?

IronOCR ofrece corrección de la rotación de página, eliminación de ruido (eliminación de artefactos de escaneo), mejora del contraste, binarización y ajuste de escala. Estas funciones se pueden combinar para mejorar la precisión en escaneos de baja calidad.

¿ IronOCR admite archivos PDF protegidos con contraseña?

Sí. Pase la cadena de contraseña al parámetro de contraseña de LoadPdf. La biblioteca descifra el documento antes de procesar las páginas para el OCR.

¿Puede IronOCR crear una salida PDF con capacidad de búsqueda?

Sí. Después de llamar a ocr.Read(input), llame a result.SaveAsSearchablePdf con la ruta del archivo de salida. El PDF resultante conserva el escaneo original como capa visual con una capa de texto invisible incrustada para las operaciones de búsqueda y copia.

¿Qué idiomas admite IronOCR?

IronOCR admite más de 125 paquetes de idiomas, incluyendo latín, cirílico, CJK, árabe y otros alfabetos. Configure la propiedad Language en la instancia de IronTesseract antes de ejecutar Read.

¿Puede IronOCR leer códigos de barras y códigos QR de documentos PDF?

Sí. Configure ocr.Configuration.ReadBarCodes como verdadero antes de llamar a Read. La colección OcrResult.Barcodes contiene los valores decodificados y los tipos de formato de todos los códigos detectados.

¿ IronOCR funciona en Linux y en contenedores Docker?

Sí. IronOCR admite la implementación en Windows, Linux, macOS y entornos en la nube, incluyendo contenedores de Azure y Docker. La documentación de IronSoftware incluye guías de configuración específicas para cada entorno.

Kannaopat Udonpant
Ingeniero de Software
Antes de convertirse en Ingeniero de Software, Kannapat completó un doctorado en Recursos Ambientales de la Universidad de Hokkaido en Japón. Mientras perseguía su grado, Kannapat también se convirtió en miembro del Laboratorio de Robótica de Vehículos, que es parte del Departamento de Ingeniería ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame