Cómo guardar resultados como un PDF buscable en C#

Guarde archivos PDF con capacidad de búsqueda en C# con IronOCR

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCR permite a los desarrolladores de C# convertir documentos e imágenes escaneados en archivos PDF con capacidad de búsqueda mediante tecnologíaOCR, admitiendo la salida como archivos, bytes o secuencias con sólo unas pocas líneas de código.

Un PDF con capacidad de búsqueda, a menudo referido como un PDF con OCR (Reconocimiento Óptico de Caracteres), es un tipo de documento PDF que contiene tanto imágenes escaneadas como texto legible por máquina. Estos PDFs se crean al realizar OCR en documentos de papel escaneados o imágenes, reconociendo el texto en las imágenes y convirtiéndolo en texto seleccionable y con capacidad de búsqueda.

SaveAsSearchablePdf también está disponible en los resultados de ReadPhoto, ReadScreenShot y ReadDocumentAdvanced, lo que permite la creación de PDF con capacidad de búsqueda a partir de fotos y flujos de trabajo avanzados de OCR de documentos. Esta capacidad resulta especialmente útil a la hora de digitalizar archivos en papel o de hacer que los archivos PDF heredados sean consultables para una mejor gestión de documentos.

Guía de inicio rápido: Exportar PDF con capacidad de búsqueda en una sola línea

Establezca RenderSearchablePdf = true, ejecute Read(...) en su entrada e invoque SaveAsSearchablePdf(...). Eso es todo lo que se necesita para generar un PDF totalmente buscable con IronOCR.

  1. Instala IronOCR con el Administrador de Paquetes NuGet

    PM > Install-Package IronOcr
  2. Copie y ejecute este fragmento de código.

    new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } } .Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf");
  3. Despliegue para probar en su entorno real

    Comienza a usar IronOCR en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer


¿Cómo puedo exportar los resultados del OCR a un PDF que permita búsquedas?

Para exportar el resultado como un PDF con capacidad de búsqueda utilizando IronOCR, establezca la propiedad Configuration.RenderSearchablePdf en true, obtenga el objeto de resultado de OCR mediante el método Read y llame a SaveAsSearchablePdf con la ruta del archivo de salida.

Entrada

Una sola página de una novela de Harry Potter, escaneada como archivo TIFF y cargada a través de OcrImageInput. La página contiene texto impreso denso, una entrada realista para probar la capa de texto de PDF con capacidad de búsqueda.

Página del libro de Harry Potter que muestra el capítulo ocho,

potter.tiff: Página de novela escaneada utilizada como entrada de OCR para generar un PDF con capacidad de búsqueda y una capa de texto invisible.

:path=/static-assets/ocr/content-code-examples/how-to/searchable-pdf-searchable-pdf.cs
using IronOcr;

// Create the OCR engine: defaults to English with balanced speed and accuracy
IronTesseract ocrTesseract = new IronTesseract();

// Required: without this flag the text overlay layer is not built, and SaveAsSearchablePdf produces a plain image PDF
ocrTesseract.Configuration.RenderSearchablePdf = true;

// Wrap the TIFF in OcrImageInput: handles DPI detection and page layout automatically
using var imageInput = new OcrImageInput("Potter.tiff");
// Run OCR; returns a result containing the recognized text and spatial layout data
OcrResult ocrResult = ocrTesseract.Read(imageInput);

// Write the output: the original scanned image is preserved with an invisible text layer on top
ocrResult.SaveAsSearchablePdf("searchablePdf.pdf");
Imports IronOcr

' Create the OCR engine: defaults to English with balanced speed and accuracy
Dim ocrTesseract As New IronTesseract()

' Required: without this flag the text overlay layer is not built, and SaveAsSearchablePdf produces a plain image PDF
ocrTesseract.Configuration.RenderSearchablePdf = True

' Wrap the TIFF in OcrImageInput: handles DPI detection and page layout automatically
Using imageInput As New OcrImageInput("Potter.tiff")
    ' Run OCR; returns a result containing the recognized text and spatial layout data
    Dim ocrResult As OcrResult = ocrTesseract.Read(imageInput)

    ' Write the output: the original scanned image is preserved with an invisible text layer on top
    ocrResult.SaveAsSearchablePdf("searchablePdf.pdf")
End Using
$vbLabelText   $csharpLabel

Resultado

searchablePdf.pdf: Salida en PDF con capacidad de búsqueda. Seleccione o busque cualquier palabra para verificar la capa de texto OCR.

El PDF resultante incorpora la imagen original de la página escaneada con una capa de texto invisible situada sobre cada palabra reconocida. Seleccione o busque cualquier palabra en el visor para confirmar que la capa de texto está presente.

IronOCR utiliza una fuente concreta para la superposición, lo que puede provocar ligeras discrepancias en el tamaño del texto renderizado en comparación con el original.

Al trabajar con archivos TIFF de varias páginas o documentos complejos, IronOCR procesa automáticamente todas las páginas y las incluye en el resultado. La biblioteca gestiona automáticamente el orden de las páginas y el posicionamiento del texto superpuesto, lo que garantiza una asignación precisa del texto a la imagen.

¿Cómo puedo crear archivos PDF con capacidad de búsqueda a partir de fotos o escaneos avanzados de documentos?

La exportación a PDF con capacidad de búsqueda también está disponible al utilizar ReadPhoto, ReadScreenShot o ReadDocumentAdvanced. Cada uno de estos métodos devuelve un tipo de resultado que admite SaveAsSearchablePdf.

Opcionalmente, puede pasar un ModelType al llamar a estos métodos. El valor predeterminado es Normal, mientras que Enhanced ofrece mayor precisión a costa de la velocidad.

Entrada

Una foto de un mural con texto pintado, cargada a través de LoadImage. La escena contiene múltiples palabras integradas en un entorno del mundo real, lo que la convierte en una prueba práctica para ReadPhoto con el modelo Enhanced.

Foto con texto utilizada como entrada para el OCR de ReadPhoto

photo.png: Foto de un mural de pared cargada a través de ReadPhoto con el modelo Enhanced para generar un PDF con capacidad de búsqueda.

using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("photo.png");

// ReadPhoto with Enhanced model
OcrPhotoResult photoResult = ocr.ReadPhoto(input, ModelType.Enhanced);
Console.WriteLine(photoResult.Text);

// Save as searchable PDF
byte[] pdfBytes = photoResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-photo.pdf", pdfBytes);
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("photo.png");

// ReadPhoto with Enhanced model
OcrPhotoResult photoResult = ocr.ReadPhoto(input, ModelType.Enhanced);
Console.WriteLine(photoResult.Text);

// Save as searchable PDF
byte[] pdfBytes = photoResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-photo.pdf", pdfBytes);
Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("photo.png")

    ' ReadPhoto with Enhanced model
    Dim photoResult As OcrPhotoResult = ocr.ReadPhoto(input, ModelType.Enhanced)
    Console.WriteLine(photoResult.Text)

    ' Save as searchable PDF
    Dim pdfBytes As Byte() = photoResult.SaveAsSearchablePdf()
    File.WriteAllBytes("searchable-photo.pdf", pdfBytes)
End Using
$vbLabelText   $csharpLabel

Resultado

searchable-photo.pdf: PDF con capacidad de búsqueda generado por ReadPhoto. La capa de texto admite la búsqueda de texto completo en cualquier visor de PDF.

El PDF con capacidad de búsqueda resultante contiene una capa de texto invisible sobre las palabras reconocidas. Al buscar "Milk" en el visor de PDF se obtienen 3 resultados, extraídos directamente del texto pintado en la foto original.

El mismo enfoque funciona con ReadDocumentAdvanced, que devuelve un OcrDocAdvancedResult:

Entrada

Una factura escaneada cargada a través de LoadImage. Contiene campos estructurados (nombre del proveedor, partidas y totales) que ReadDocumentAdvanced con el modelo Enhanced reconoce e incorpora como una capa de texto en la que se pueden realizar búsquedas.

Documento de factura utilizado como entrada para ReadDocumentAdvanced OCR

invoice.png: Factura escaneada cargada en OcrInput y pasada a ReadDocumentAdvanced con el modelo Enhanced.

using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");

// ReadDocumentAdvanced with Enhanced model
OcrDocAdvancedResult docResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced);
byte[] docPdfBytes = docResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-doc.pdf", docPdfBytes);
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");

// ReadDocumentAdvanced with Enhanced model
OcrDocAdvancedResult docResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced);
byte[] docPdfBytes = docResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-doc.pdf", docPdfBytes);
Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("invoice.png")

    ' ReadDocumentAdvanced with Enhanced model
    Dim docResult As OcrDocAdvancedResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced)
    Dim docPdfBytes As Byte() = docResult.SaveAsSearchablePdf()
    File.WriteAllBytes("searchable-doc.pdf", docPdfBytes)
End Using
$vbLabelText   $csharpLabel

Resultado

searchable-doc.pdf: PDF con capacidad de búsqueda generado por ReadDocumentAdvanced. Los campos de la factura se pueden seleccionar y buscar.

SaveAsSearchablePdf no es compatible con los resultados de ReadPassport o ReadLicensePlate y generará un ExtensionAdvancedScanException.

Trabajar con documentos de varias páginas

Al realizar operaciones de OCR de PDF en documentos de varias páginas, IronOCR procesa cada página de forma secuencial y mantiene la estructura original del documento.

Entrada

Un informe anual de 11 páginas de Hartwell Capital Management cargado a través de OcrPdfInput. Las páginas 1–10 (índices 0–9) se seleccionan utilizando el rango PageIndices y se procesan en una única llamada Read.

multi-page-scan.pdf: informe anual de Hartwell Capital Management de 11 páginas utilizado como entrada para la conversión a PDF de varias páginas con capacidad de búsqueda.

:path=/static-assets/ocr/content-code-examples/how-to/searchable-pdf-multi-page.cs
using IronOcr;

// Create the OCR engine. RenderSearchablePdf is false by default; no need to set it when using OcrPdfInput directly
var ocrTesseract = new IronTesseract();

// Load pages 1–10 (indices 0–9) only; PageIndices avoids loading and OCR-ing the full document unnecessarily
using var pdfInput = new OcrPdfInput("multi-page-scan.pdf", PageIndices: Enumerable.Range(0, 10));

// Run OCR across all selected pages in order
OcrResult result = ocrTesseract.Read(pdfInput);

// Write the searchable PDF; true = apply the input's image filters to the embedded page images in the output
result.SaveAsSearchablePdf("searchable-multi-page.pdf", true);
Imports IronOcr

' Create the OCR engine. RenderSearchablePdf is false by default; no need to set it when using OcrPdfInput directly
Dim ocrTesseract As New IronTesseract()

' Load pages 1–10 (indices 0–9) only; PageIndices avoids loading and OCR-ing the full document unnecessarily
Using pdfInput As New OcrPdfInput("multi-page-scan.pdf", PageIndices:=Enumerable.Range(0, 10))
    ' Run OCR across all selected pages in order
    Dim result As OcrResult = ocrTesseract.Read(pdfInput)

    ' Write the searchable PDF; true = apply the input's image filters to the embedded page images in the output
    result.SaveAsSearchablePdf("searchable-multi-page.pdf", True)
End Using
$vbLabelText   $csharpLabel

Resultado

searchable-multi-page.pdf: archivo PDF de 10 páginas con capacidad de búsqueda. Cada página tiene una capa de texto invisible para la búsqueda de texto completo.

El PDF resultante contiene 10 páginas (páginas 1-10 del informe original), cada una con una capa de texto invisible que permite seleccionar y buscar el contenido extraído en cualquier visor de PDF.

¿Cómo puedo aplicar filtros al crear archivos PDF con capacidad de búsqueda?

El segundo parámetro SaveAsSearchablePdf acepta un valor booleano que controla si se aplican filtros de imagen a la salida incrustada. El uso de filtros de optimización de imágenes puede mejorar significativamente la precisión del OCR, especialmente cuando se trata de escaneados de baja calidad.

El ejemplo siguiente aplica el filtro de escala de grises y pasa true como segundo argumento para incrustar la imagen filtrada en el PDF de salida con capacidad de búsqueda.

:path=/static-assets/ocr/content-code-examples/how-to/image-quality-correction-searchable-pdf.cs
using IronOcr;

// Create OCR engine: filters are applied at the OcrInput level, so no configuration changes are needed here
var ocr = new IronTesseract();
var ocrInput = new OcrInput();

// Load the scanned PDF as the OCR source
ocrInput.LoadPdf("invoice.pdf");

// Convert to grayscale: removes color noise that can reduce OCR accuracy on color-printed documents
ocrInput.ToGrayScale();
// Run OCR on the preprocessed input
OcrResult result = ocr.Read(ocrInput);

// Write the searchable PDF; true = embed the grayscale-filtered image rather than the original color scan
result.SaveAsSearchablePdf("outputGrayscale.pdf", true);
Imports IronOcr

' Create OCR engine: filters are applied at the OcrInput level, so no configuration changes are needed here
Dim ocr As New IronTesseract()
Dim ocrInput As New OcrInput()

' Load the scanned PDF as the OCR source
ocrInput.LoadPdf("invoice.pdf")

' Convert to grayscale: removes color noise that can reduce OCR accuracy on color-printed documents
ocrInput.ToGrayScale()
' Run OCR on the preprocessed input
Dim result As OcrResult = ocr.Read(ocrInput)

' Write the searchable PDF; True = embed the grayscale-filtered image rather than the original color scan
result.SaveAsSearchablePdf("outputGrayscale.pdf", True)
$vbLabelText   $csharpLabel

Para obtener resultados óptimos, considere la posibilidad de utilizar el Asistente para filtros para determinar automáticamente la mejor combinación de filtros para su tipo de documento específico. Esta herramienta analiza su entrada y sugiere los pasos de preprocesamiento adecuados.

¿Cómo puedo corregir caracteres incorrectos en archivos PDF con función de búsqueda?

Si el texto parece correcto visualmente en el PDF, pero muestra caracteres dañados al buscarlo o copiarlo, el problema se debe a la fuente predeterminada utilizada en la capa de texto buscable. Por defecto, SaveAsSearchablePdf utiliza Times New Roman, que no es totalmente compatible con todos los caracteres Unicode. Esto afecta a los idiomas con caracteres acentuados o no ASCII.

Para solucionar esto, proporciona un archivo de fuente compatible con Unicode como tercer parámetro:

result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf");
result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf");
result.SaveAsSearchablePdf("output.pdf", False, "Fonts/LiberationSerif-Regular.ttf")
$vbLabelText   $csharpLabel

También puede especificar un nombre de fuente personalizado como cuarto parámetro:

result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf", "MyFont");
result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf", "MyFont");
result.SaveAsSearchablePdf("output.pdf", False, "Fonts/LiberationSerif-Regular.ttf", "MyFont")
$vbLabelText   $csharpLabel

Esto se aplica a todos los tipos de resultados, incluidos OcrResult, OcrPhotoResult y OcrDocAdvancedResult, por lo que la corrección funciona independientemente del método de lectura que haya generado el resultado.

Por favor notaPara documentos compuestos originalmente en Times New Roman, se recomienda Liberation Serif, ya que es métricamente compatible y conserva el espaciado y el diseño originales. Para un uso multilingüe general, Noto Sans o DejaVu Sans son buenas alternativas.

En los casos en los que no sea posible escribir en una ruta de archivo, IronOCR también admite la devolución del PDF con capacidad de búsqueda como una matriz de bytes o un flujo.


¿Cómo puedo exportar archivos PDF con capacidad de búsqueda como bytes o secuencias?

El resultado del PDF con capacidad de búsqueda también se puede manejar como bytes o flujos utilizando los métodos SaveAsSearchablePdfBytes y SaveAsSearchablePdfStream, respectivamente. El siguiente ejemplo de código muestra cómo utilizar estos métodos.

:path=/static-assets/ocr/content-code-examples/how-to/searchable-pdf-searchable-pdf-byte-stream.cs
// Return as a byte array: suited for storing in a database or sending in an HTTP response body
byte[] pdfByte = ocrResult.SaveAsSearchablePdfBytes();

// Return as a stream: suited for uploading to cloud storage or piping to another I/O operation without buffering the full file
Stream pdfStream = ocrResult.SaveAsSearchablePdfStream();
' Return as a byte array: suited for storing in a database or sending in an HTTP response body
Dim pdfByte As Byte() = ocrResult.SaveAsSearchablePdfBytes()

' Return as a stream: suited for uploading to cloud storage or piping to another I/O operation without buffering the full file
Dim pdfStream As Stream = ocrResult.SaveAsSearchablePdfStream()
$vbLabelText   $csharpLabel

Estas opciones de salida son especialmente útiles cuando se integran con servicios de almacenamiento en la nube, bases de datos o aplicaciones web en las que el acceso al sistema de archivos puede ser limitado. El siguiente ejemplo muestra aplicaciones prácticas:

using IronOcr;
using System.IO;

public class SearchablePdfExporter
{
    public async Task ProcessAndUploadPdf(string inputPath)
    {
        var ocr = new IronTesseract
        {
            Configuration = { RenderSearchablePdf = true }
        };

        // Process the input
        using var input = new OcrImageInput(inputPath);
        var result = ocr.Read(input);

        // Option 1: Save to database as byte array
        byte[] pdfBytes = result.SaveAsSearchablePdfBytes();
        // Store pdfBytes in database BLOB field

        // Option 2: Upload to cloud storage using stream
        using (Stream pdfStream = result.SaveAsSearchablePdfStream())
        {
            // Upload stream to Azure Blob Storage, AWS S3, etc.
            await UploadToCloudStorage(pdfStream, "searchable-output.pdf");
        }

        // Option 3: Return as web response
        // return File(pdfBytes, "application/pdf", "searchable.pdf");
    }

    private async Task UploadToCloudStorage(Stream stream, string fileName)
    {
        // Cloud upload implementation
    }
}
using IronOcr;
using System.IO;

public class SearchablePdfExporter
{
    public async Task ProcessAndUploadPdf(string inputPath)
    {
        var ocr = new IronTesseract
        {
            Configuration = { RenderSearchablePdf = true }
        };

        // Process the input
        using var input = new OcrImageInput(inputPath);
        var result = ocr.Read(input);

        // Option 1: Save to database as byte array
        byte[] pdfBytes = result.SaveAsSearchablePdfBytes();
        // Store pdfBytes in database BLOB field

        // Option 2: Upload to cloud storage using stream
        using (Stream pdfStream = result.SaveAsSearchablePdfStream())
        {
            // Upload stream to Azure Blob Storage, AWS S3, etc.
            await UploadToCloudStorage(pdfStream, "searchable-output.pdf");
        }

        // Option 3: Return as web response
        // return File(pdfBytes, "application/pdf", "searchable.pdf");
    }

    private async Task UploadToCloudStorage(Stream stream, string fileName)
    {
        // Cloud upload implementation
    }
}
Imports IronOcr
Imports System.IO
Imports System.Threading.Tasks

Public Class SearchablePdfExporter
    Public Async Function ProcessAndUploadPdf(inputPath As String) As Task
        Dim ocr As New IronTesseract With {
            .Configuration = New TesseractConfiguration With {
                .RenderSearchablePdf = True
            }
        }

        ' Process the input
        Using input As New OcrImageInput(inputPath)
            Dim result = ocr.Read(input)

            ' Option 1: Save to database as byte array
            Dim pdfBytes As Byte() = result.SaveAsSearchablePdfBytes()
            ' Store pdfBytes in database BLOB field

            ' Option 2: Upload to cloud storage using stream
            Using pdfStream As Stream = result.SaveAsSearchablePdfStream()
                ' Upload stream to Azure Blob Storage, AWS S3, etc.
                Await UploadToCloudStorage(pdfStream, "searchable-output.pdf")
            End Using

            ' Option 3: Return as web response
            ' Return File(pdfBytes, "application/pdf", "searchable.pdf")
        End Using
    End Function

    Private Async Function UploadToCloudStorage(stream As Stream, fileName As String) As Task
        ' Cloud upload implementation
    End Function
End Class
$vbLabelText   $csharpLabel

Consideraciones sobre el rendimiento

Al procesar grandes volúmenes de documentos, considere la posibilidad de implementar operaciones de OCR multihilo para mejorar el rendimiento. IronOCR admite el procesamiento concurrente, lo que permite manejar varios documentos a la vez:

using IronOcr;
using System.Threading.Tasks;
using System.Collections.Concurrent;

public class BatchPdfProcessor
{
    private readonly IronTesseract _ocr;

    public BatchPdfProcessor()
    {
        _ocr = new IronTesseract
        {
            Configuration = 
            {
                RenderSearchablePdf = true,
                // Configure for optimal performance
                Language = OcrLanguage.English
            }
        };
    }

    public async Task ProcessBatchAsync(string[] filePaths)
    {
        var results = new ConcurrentBag<(string source, string output)>();

        await Parallel.ForEachAsync(filePaths, async (filePath, ct) =>
        {
            using var input = new OcrImageInput(filePath);
            var result = _ocr.Read(input);

            string outputPath = Path.ChangeExtension(filePath, ".searchable.pdf");
            result.SaveAsSearchablePdf(outputPath);

            results.Add((filePath, outputPath));
        });

        Console.WriteLine($"Processed {results.Count} files");
    }
}
using IronOcr;
using System.Threading.Tasks;
using System.Collections.Concurrent;

public class BatchPdfProcessor
{
    private readonly IronTesseract _ocr;

    public BatchPdfProcessor()
    {
        _ocr = new IronTesseract
        {
            Configuration = 
            {
                RenderSearchablePdf = true,
                // Configure for optimal performance
                Language = OcrLanguage.English
            }
        };
    }

    public async Task ProcessBatchAsync(string[] filePaths)
    {
        var results = new ConcurrentBag<(string source, string output)>();

        await Parallel.ForEachAsync(filePaths, async (filePath, ct) =>
        {
            using var input = new OcrImageInput(filePath);
            var result = _ocr.Read(input);

            string outputPath = Path.ChangeExtension(filePath, ".searchable.pdf");
            result.SaveAsSearchablePdf(outputPath);

            results.Add((filePath, outputPath));
        });

        Console.WriteLine($"Processed {results.Count} files");
    }
}
Imports IronOcr
Imports System.Threading.Tasks
Imports System.Collections.Concurrent

Public Class BatchPdfProcessor
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract With {
            .Configuration = New OcrConfiguration With {
                .RenderSearchablePdf = True,
                ' Configure for optimal performance
                .Language = OcrLanguage.English
            }
        }
    End Sub

    Public Async Function ProcessBatchAsync(filePaths As String()) As Task
        Dim results As New ConcurrentBag(Of (source As String, output As String))()

        Await Task.Run(Sub()
                           Parallel.ForEach(filePaths, Sub(filePath)
                                                           Using input As New OcrImageInput(filePath)
                                                               Dim result = _ocr.Read(input)

                                                               Dim outputPath As String = Path.ChangeExtension(filePath, ".searchable.pdf")
                                                               result.SaveAsSearchablePdf(outputPath)

                                                               results.Add((filePath, outputPath))
                                                           End Using
                                                       End Sub)
                       End Sub)

        Console.WriteLine($"Processed {results.Count} files")
    End Function
End Class
$vbLabelText   $csharpLabel

Opciones de configuración avanzadas

Para situaciones más avanzadas, puede aprovechar configuración detallada de Tesseract para ajustar el motor de OCR a tipos de documentos o idiomas específicos:

var advancedOcr = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        TesseractVariables = new Dictionary<string, object>
        {
            { "preserve_interword_spaces", 1 },
            { "tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" }
        },
        PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
    },
    Language = OcrLanguage.EnglishBest
};
var advancedOcr = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        TesseractVariables = new Dictionary<string, object>
        {
            { "preserve_interword_spaces", 1 },
            { "tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" }
        },
        PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
    },
    Language = OcrLanguage.EnglishBest
};
Imports IronOcr

Dim advancedOcr As New IronTesseract With {
    .Configuration = New TesseractConfiguration With {
        .RenderSearchablePdf = True,
        .TesseractVariables = New Dictionary(Of String, Object) From {
            {"preserve_interword_spaces", 1},
            {"tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"}
        },
        .PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
    },
    .Language = OcrLanguage.EnglishBest
}
$vbLabelText   $csharpLabel

Estas opciones de configuración se aplican por igual a los tres métodos de salida: SaveAsSearchablePdf, SaveAsSearchablePdfBytes y SaveAsSearchablePdfStream. El resumen que figura a continuación recoge el conjunto completo de métodos de PDF con capacidad de búsqueda junto con sus formatos de salida correspondientes.

Resumen

La creación de archivos PDF con capacidad de búsqueda con IronOCR es sencilla y flexible. Tanto si necesita procesar imágenes individuales, documentos de varias páginas, fotos a través de ReadPhoto o escaneos avanzados de documentos a través de ReadDocumentAdvanced, la biblioteca ofrece métodos robustos para generar archivos PDF con capacidad de búsqueda en diversos formatos. Utilice el parámetro ModelType para elegir entre los modelos de aprendizaje automático estándar y mejorados en función de la precisión. La posibilidad de exportar como archivos, bytes o flujos hace que se adapte a cualquier arquitectura de aplicación, desde aplicaciones de escritorio hasta servicios basados en la nube.

Para escenarios de OCR más avanzados, explore los ejemplos de código completos o consulte la documentación de la API para obtener información detallada sobre las firmas de métodos y las opciones.

Preguntas Frecuentes

¿Cómo puedo crear un PDF con función de búsqueda a partir de imágenes escaneadas en C#?

IronOCR simplifica la creación de archivos PDF con capacidad de búsqueda a partir de imágenes escaneadas. Basta con establecer RenderSearchablePdf en true en la configuración, utilizar el método Read() en la imagen de entrada y llamar a SaveAsSearchablePdf() con la ruta de salida deseada. IronOCR realizará el OCR en la imagen y generará un PDF con texto seleccionable y buscable superpuesto en la imagen original.

¿Qué formatos de archivo se pueden convertir en PDF con función de búsqueda?

IronOCR puede convertir varios formatos de imagen, incluidos JPG, PNG, TIFF y documentos PDF existentes en PDF con capacidad de búsqueda. La biblioteca admite tanto imágenes de una sola página como documentos de varias páginas, como archivos TIFF, procesando automáticamente todas las páginas y manteniendo el orden correcto de las páginas en el PDF de salida.

¿Puedo exportar archivos PDF con función de búsqueda como matrices de bytes o secuencias en lugar de archivos?

Sí, IronOCR permite exportar archivos PDF con capacidad de búsqueda en varios formatos. Además de guardar directamente en un archivo mediante SaveAsSearchablePdf(), también puede exportar los resultados del OCR como matrices de bytes o flujos, lo que facilita la integración con aplicaciones web, almacenamiento en la nube o sistemas de bases de datos sin crear archivos temporales.

¿Cuál es el código mínimo necesario para crear un PDF con capacidad de búsqueda?

La creación de un PDF con capacidad de búsqueda con IronOCR se puede hacer en una sola línea de código: new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } }.Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf"). Esto demuestra el diseño simplificado de la API de IronOCR.

¿Cómo funciona la capa de texto invisible en los PDF con función de búsqueda?

IronOCR gestiona automáticamente el posicionamiento del texto reconocido como una capa invisible sobre la imagen original del PDF. Esto garantiza una correspondencia precisa entre el texto y la imagen, lo que permite a los usuarios seleccionar y buscar texto sin alterar el aspecto visual del documento original. La biblioteca IronOCR utiliza fuentes especializadas y algoritmos de posicionamiento para lograrlo.

¿Puedo crear archivos PDF con capacidad de búsqueda a partir de fotos o capturas de pantalla?

Sí, SaveAsSearchablePdf es compatible con los resultados de ReadPhoto, ReadScreenShot y ReadDocumentAdvanced. Cada método devuelve un tipo de resultado que admite la exportación a PDF con capacidad de búsqueda, lo que facilita la conversión de fotos del mundo real, capturas de pantalla o escaneos de documentos complejos en PDF con capacidad de búsqueda.

¿Qué hace el parámetro ModelType?

El parámetro ModelType controla qué modelo de aprendizaje automático preentrenado se utiliza para el OCR. Normal es el valor predeterminado y procesa imágenes redimensionadas a 960 píxeles para obtener resultados rápidos. Enhanced admite imágenes de hasta 2560 píxeles, conservando los detalles más finos y mejorando la precisión para entradas de alta resolución.

¿Por qué los caracteres copiados o buscados aparecen dañados en mi PDF con capacidad de búsqueda?

Esto ocurre porque la fuente predeterminada (Times New Roman) utilizada en la capa de texto buscable no es totalmente compatible con todos los caracteres Unicode. Para solucionarlo, pase un archivo de fuente compatible con Unicode como tercer parámetro de SaveAsSearchablePdf. Si sus documentos se compusieron originalmente en Times New Roman y observa inconsistencias de espaciado con otras fuentes, pruebe Liberation Serif, ya que comparte las mismas métricas de glifos y conserva el diseño original.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
Revisado por
Jeff Fritz
Jeffrey T. Fritz
Gerente Principal de Programas - Equipo de la Comunidad .NET
Jeff también es Gerente Principal de Programas para los equipos de .NET y Visual Studio. Es el productor ejecutivo de la serie de conferencias virtuales .NET Conf y anfitrión de 'Fritz and Friends', una transmisión en vivo para desarrolladores que se emite dos veces a la semana donde habla sobre tecnología y escribe código junto con la audiencia. Jeff escribe talleres, presentaciones, y planifica contenido para los eventos de desarrolladores más importantes de Microsoft, incluyendo Microsoft Build, Microsoft Ignite, .NET Conf y la Cumbre de Microsoft MVP.
¿Listo para empezar?
Nuget Descargas 5,585,834 | Versión: 2026.4 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.