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.

IronOCR proporciona una solución para realizar reconocimiento óptico de caracteres en documentos y exportar los resultados como PDFs con capacidad de búsqueda. Soporta la exportación de PDFs con capacidad de búsqueda como archivos, bytes y flujos. 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 es especialmente útil cuando se trabaja con documentos escaneados, se digitalizan archivos en papel o se hacen búsquedas en archivos PDF heredados para mejorar la 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?

Así exportas el resultado como PDF buscable con IronOCR. Primero debe establecer la propiedad Configuration.RenderSearchablePdf en true. Después de obtener el objeto de resultado del OCR mediante el método Read, utilice el método SaveAsSearchablePdf especificando la ruta del archivo de salida. El código a continuación demuestra el uso de un archivo TIFF de muestra.

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

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Enable render as searchable PDF
ocrTesseract.Configuration.RenderSearchablePdf = true;

// Add image
using var imageInput = new OcrImageInput("Potter.tiff");
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);

// Export as searchable PDF
ocrResult.SaveAsSearchablePdf("searchablePdf.pdf");
$vbLabelText   $csharpLabel

Cuando se trabaja con archivos TIFF de varias páginas o documentos complejos, IronOcr procesa automáticamente todas las páginas y las incluye en el PDF de salida en el que se pueden realizar búsquedas. 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.

A continuación, una captura del TIFF de muestra y un PDF embebido buscable. Intenta seleccionar el texto en el PDF para confirmar su capacidad de búsqueda. La capacidad de selección también significa que el texto puede ser buscado en un visor de PDF.

IronOCR utiliza un tipo de letra particular para superponer el texto en el archivo de imagen, lo que puede dar lugar a algunas discrepancias en el tamaño del texto.

Page from Harry Potter book showing Chapter Eight 'The Deathday Party' with text about Harry meeting Nearly Headless Nick

¿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.

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);
$vbLabelText   $csharpLabel
Photo containing text used as input for ReadPhoto OCR

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

// ReadDocumentAdvanced with Enhanced model
OcrDocAdvancedResult docResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced);
byte[] docPdfBytes = docResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-doc.pdf", docPdfBytes);
// ReadDocumentAdvanced with Enhanced model
OcrDocAdvancedResult docResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced);
byte[] docPdfBytes = docResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-doc.pdf", docPdfBytes);
$vbLabelText   $csharpLabel
Invoice document used as input for ReadDocumentAdvanced OCR

Los archivos PDF con capacidad de búsqueda resultantes contienen una capa de texto invisible que permite la búsqueda de texto completo en cualquier visor de PDF. Por ejemplo, al buscar "Milk" en el primer PDF anterior se obtienen 3 resultados, extraídos directamente del mural de la foto original.

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

Trabajar con documentos de varias páginas

Cuando se trata de operaciones de OCR de PDF en documentos de varias páginas, IronOcr procesa cada página secuencialmente y mantiene la estructura original del documento. He aquí un ejemplo de conversión de un PDF escaneado de varias páginas en un PDF con capacidad de búsqueda:

using IronOcr;

// Initialize IronTesseract with configuration
var ocrTesseract = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        PageSegmentationMode = TesseractPageSegmentationMode.Auto
    }
};

// Load a multi-page PDF
using var pdfInput = new OcrPdfInput("multi-page-scan.pdf");

// Optionally specify page range (e.g., pages 1-10)
pdfInput.SelectPages(1, 10);

// Perform OCR with progress tracking
OcrResult result = ocrTesseract.Read(pdfInput);

// Save as searchable PDF
result.SaveAsSearchablePdf("searchable-multi-page.pdf");

// Display total pages processed
Console.WriteLine($"Processed {result.Pages.Length} pages");
using IronOcr;

// Initialize IronTesseract with configuration
var ocrTesseract = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        PageSegmentationMode = TesseractPageSegmentationMode.Auto
    }
};

// Load a multi-page PDF
using var pdfInput = new OcrPdfInput("multi-page-scan.pdf");

// Optionally specify page range (e.g., pages 1-10)
pdfInput.SelectPages(1, 10);

// Perform OCR with progress tracking
OcrResult result = ocrTesseract.Read(pdfInput);

// Save as searchable PDF
result.SaveAsSearchablePdf("searchable-multi-page.pdf");

// Display total pages processed
Console.WriteLine($"Processed {result.Pages.Length} pages");
$vbLabelText   $csharpLabel

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

SaveAsSearchablePdf también acepta un indicador booleano como segundo parámetro que permite aplicar o no filtros a un PDF con capacidad de búsqueda, lo que ofrece a los desarrolladores flexibilidad a la hora de elegir. 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.

A continuación se muestra un ejemplo de cómo aplicar el filtro de escala de grises y, a continuación, guardar el PDF con un filtro introduciendo true en el segundo parámetro de SaveAsSearchablePdf.

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

var ocr = new IronTesseract();
var ocrInput = new OcrInput();

// Load a PDF file
ocrInput.LoadPdf("invoice.pdf");

// Apply gray scale filter
ocrInput.ToGrayScale();
OcrResult result = ocr.Read(ocrInput);

// Save the result as a searchable PDF with filters applied
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");
$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");
$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.


¿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 ejemplo de código a continuación muestra cómo utilizar estos métodos.

:path=/static-assets/ocr/content-code-examples/how-to/searchable-pdf-searchable-pdf-byte-stream.cs
// Export searchable PDF byte
byte[] pdfByte = ocrResult.SaveAsSearchablePdfBytes();

// Export searchable PDF stream
Stream pdfStream = 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. He aquí un ejemplo ampliado que 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
    }
}
$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");
    }
}
$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
};
$vbLabelText   $csharpLabel

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 exhaustivos ejemplos de código o consulte la documentación de la API para obtener firmas de métodos y opciones detalladas.

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 superposición de texto en los PDF con función de búsqueda?

IronOCR gestiona automáticamente el posicionamiento del texto reconocido como una superposición invisible sobre la imagen original en el PDF. De este modo se garantiza una asignación precisa del texto a la imagen, lo que permite a los usuarios seleccionar y buscar texto manteniendo el aspecto visual del documento original. Para ello, la biblioteca utiliza fuentes y algoritmos de posicionamiento especializados.

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,556,263 | Versión: 2026.3 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.