Archivos TIFF Grandes de Más de 2 GB Fallan al Cargar

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

IronOCR carga la imagen de entrada en un único búfer en memoria a través de su tipo interno AnyBitmap. Ese búfer está indexado por un entero de 32 bits, por lo que se limita a aproximadamente 2 GB independientemente de cuánta memoria del sistema tenga. Un TIFF mayor de 2 GB excede este límite y falla al cargar.

Loaded pages: 0

OcrInput.LoadImage(filePath) crea un AnyBitmap internamente y materializa toda la imagen en un solo búfer. Debido a que ese búfer está indexado por int, está efectivamente limitado a unos 2 GB sin importar cuánta memoria esté libre, por lo que un TIFF que supere ligeramente el límite no se puede mantener y la carga falla. Este es un límite de tiempo de ejecución, no específico del sistema operativo, por lo que afecta a todas las plataformas .NET por igual.

AdvertenciaLoadImage(filePath) actualmente devuelve cero páginas cargadas en lugar de lanzar una excepción clara. Esta falla silenciosa es un problema conocido; se planea una excepción más clara. El diseño de un único búfer es un límite arquitectónico, y el streaming TIFF por página nativo aún no está disponible.

Solución

La solución es dividir el TIFF en porciones de menos de 2 GB y pasar cada porción a IronOCR como un array de bytes en lugar de un camino de archivo.

1. Agregar Magick.NET

Use Magick.NET para dividir el TIFF antes de pasarlo a IronOCR. Seleccione la variante que coincide con su proyecto (Q8/Q16, AnyCPU/x64).

dotnet add package Magick.NET-Q16-AnyCPU
dotnet add package Magick.NET-Q16-AnyCPU
SHELL

2. Dividir el TIFF y Cargar Cada Porción

Abre el TIFF como un MagickImageCollection, divídelo en fragmentos de un número determinado de páginas que cada uno se mantenga por debajo de los 2 GB, convierte cada fragmento a una matriz de bytes y cárgalo con OcrInput.LoadImage(byte[]).

var inputPath = "input.tiff";
var pagesPerChunk = 100;
using var allPages = new MagickImageCollection(inputPath);
int chunkNumber = 1;
for (int i = 0; i < allPages.Count; i += pagesPerChunk)
{
    using var chunk = new MagickImageCollection();
    for (int j = i; j < Math.Min(i + pagesPerChunk, allPages.Count); j++)
    {
        chunk.Add(allPages[j].Clone());
    }
    foreach (var image in chunk)
    {
        image.SetCompression(CompressionMethod.LZW);
    }
    var chunkBytes = chunk.ToByteArray();
    using (var ocrInput = new OcrInput())
    {
        ocrInput.LoadImage(chunkBytes);
        var pages = ocrInput.GetPages().ToList();
        Console.WriteLine($"Loaded pages: {pages.Count}");
        var result = new IronTesseract().Read(ocrInput);
        Console.WriteLine("OCR Text Length: " + (result.Text?.Length ?? 0));
    }
    Console.WriteLine($"Chunk {chunkNumber} processed");
    chunkNumber++;
}
var inputPath = "input.tiff";
var pagesPerChunk = 100;
using var allPages = new MagickImageCollection(inputPath);
int chunkNumber = 1;
for (int i = 0; i < allPages.Count; i += pagesPerChunk)
{
    using var chunk = new MagickImageCollection();
    for (int j = i; j < Math.Min(i + pagesPerChunk, allPages.Count); j++)
    {
        chunk.Add(allPages[j].Clone());
    }
    foreach (var image in chunk)
    {
        image.SetCompression(CompressionMethod.LZW);
    }
    var chunkBytes = chunk.ToByteArray();
    using (var ocrInput = new OcrInput())
    {
        ocrInput.LoadImage(chunkBytes);
        var pages = ocrInput.GetPages().ToList();
        Console.WriteLine($"Loaded pages: {pages.Count}");
        var result = new IronTesseract().Read(ocrInput);
        Console.WriteLine("OCR Text Length: " + (result.Text?.Length ?? 0));
    }
    Console.WriteLine($"Chunk {chunkNumber} processed");
    chunkNumber++;
}
Imports System
Imports System.Linq
Imports ImageMagick

Dim inputPath As String = "input.tiff"
Dim pagesPerChunk As Integer = 100
Using allPages As New MagickImageCollection(inputPath)
    Dim chunkNumber As Integer = 1
    For i As Integer = 0 To allPages.Count - 1 Step pagesPerChunk
        Using chunk As New MagickImageCollection()
            For j As Integer = i To Math.Min(i + pagesPerChunk, allPages.Count) - 1
                chunk.Add(allPages(j).Clone())
            Next
            For Each image In chunk
                image.SetCompression(CompressionMethod.LZW)
            Next
            Dim chunkBytes = chunk.ToByteArray()
            Using ocrInput As New OcrInput()
                ocrInput.LoadImage(chunkBytes)
                Dim pages = ocrInput.GetPages().ToList()
                Console.WriteLine($"Loaded pages: {pages.Count}")
                Dim result = New IronTesseract().Read(ocrInput)
                Console.WriteLine("OCR Text Length: " & If(result.Text?.Length, 0))
            End Using
        End Using
        Console.WriteLine($"Chunk {chunkNumber} processed")
        chunkNumber += 1
    Next
End Using
$vbLabelText   $csharpLabel

Cada fragmento pasa por LoadImage(chunkBytes) como bytes sin procesar, manteniendo cada búfer por debajo del límite de 2 GB. SetCompression(CompressionMethod.LZW) reduce cada fragmento antes de convertirlo a una matriz de bytes.

3. Ajustar el Tamaño de la Porción

Ajusta pagesPerChunk para tus datos. Bájelo si una porción se aproxima a 2 GB o si la memoria es ajustada; súbalo para páginas más pequeñas para reducir la sobrecarga.

4. Tener en Cuenta Magick.NET en el Despliegue

Magick.NET envía binarios nativos de ImageMagick. Tenga en cuenta el tamaño añadido del paquete y la huella de dependencia nativa cuando despliegue.

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
¿Listo para empezar?
Nuget Descargas 6,136,090 | Versión: 2026.7 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.