Wie man Ergebnisse als durchsuchbares PDF in C# speichert

Speichern von durchsuchbaren PDFs in C#35; mit IronOCR

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

IronOCR ermöglicht es C#-Entwicklern, gescannte Dokumente und Bilder mit Hilfe der OCR-Technologie in durchsuchbare PDFs zu konvertieren, wobei die Ausgabe als Dateien, Bytes oder Streams mit nur wenigen Codezeilen unterstützt wird.

Ein durchsuchbares PDF, oft auch als OCR-PDF (Optical Character Recognition) bezeichnet, ist ein PDF-Dokument, das sowohl gescannte Bilder als auch maschinenlesbaren Text enthält. Diese PDFs entstehen durch die Anwendung von OCR auf gescannte Papierdokumente oder Bilder, wodurch der Text in den Bildern erkannt und in auswählbaren und durchsuchbaren Text umgewandelt wird.

SaveAsSearchablePdf ist auch bei Ergebnissen von ReadPhoto, ReadScreenShot und ReadDocumentAdvanced verfügbar und ermöglicht die Erstellung durchsuchbarer PDFs aus Fotos und erweiterten Dokumenten-OCR-Workflows. Diese Funktion ist besonders nützlich beim Digitalisieren von Papierarchiven oder beim Durchsuchen älterer PDFs für ein besseres Dokumentenmanagement.

Schnellstart: Durchsuchbares PDF in einer Zeile exportieren

Setze RenderSearchablePdf = true, führe Read(...) auf deiner Eingabe aus und rufe SaveAsSearchablePdf(...) auf. Das ist alles, was nötig ist, um mit IronOCR ein vollständig durchsuchbares PDF zu erstellen.

  1. Installieren Sie IronOCR mit NuGet Package Manager

    PM > Install-Package IronOcr
  2. Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.

    new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } } .Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf");
  3. Bereitstellen zum Testen in Ihrer Live-Umgebung

    Beginnen Sie noch heute, IronOCR in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion

    arrow pointer


Wie exportiere ich OCR-Ergebnisse als durchsuchbare PDF-Datei?

Um das Ergebnis mit IronOCR als durchsuchbare PDF-Datei zu exportieren, setzen Sie die Eigenschaft Configuration.RenderSearchablePdf auf true, rufen Sie das OCR-Ergebnisobjekt mit der Methode Read ab und rufen Sie SaveAsSearchablePdf mit dem Ausgabedateipfad auf.

Eingabe

Eine einzelne Seite aus einem Harry-Potter-Roman, eingescannt als TIFF-Datei und geladen über OcrImageInput. Die Seite enthält dicht gedruckten Text, eine realistische Eingabe zum Testen der durchsuchbaren PDF-Textebene.

Seite aus dem Harry-Potter-Buch, Kapitel Acht

potter.tiff: Eingescannte Romanseite, die als OCR-Eingabe verwendet wurde, um ein durchsuchbares PDF mit einer unsichtbaren Textebene zu erzeugen.

: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

Ausgabe

searchablePdf.pdf: Durchsuchbare PDF-Ausgabe. Wählen Sie ein beliebiges Wort aus oder suchen Sie danach, um die OCR-Textebene zu überprüfen.

Die resultierende PDF-Datei enthält das Bild der ursprünglich gescannten Seite mit einer unsichtbaren Textebene, die über jedem erkannten Wort positioniert ist. Wählen Sie ein beliebiges Wort im Viewer aus oder suchen Sie danach, um zu bestätigen, dass die Textebene vorhanden ist.

IronOCR verwendet eine spezielle Schriftart für die Überlagerung, was zu leichten Abweichungen in der Größe des gerenderten Textes im Vergleich zum Original führen kann.

Bei der Bearbeitung mehrseitiger TIFF-Dateien oder komplexer Dokumente verarbeitet IronOCR automatisch alle Seiten und bezieht sie in die Ausgabe ein. Die Bibliothek übernimmt automatisch die Seitenanordnung und die Positionierung der Texteinblendungen und gewährleistet so eine genaue Text-Bild-Zuordnung.

Wie erstelle ich durchsuchbare PDFs aus Fotos oder erweiterten Dokumentenscans?

Der Export von durchsuchbaren PDFs ist auch über ReadPhoto, ReadScreenShot oder ReadDocumentAdvanced möglich. Jede dieser Methoden gibt einen Ergebnistyp zurück, der SaveAsSearchablePdf unterstützt.

Sie können optional ein ModelType beim Aufruf dieser Methoden übergeben. Der Standardwert ist Normal, während Enhanced eine höhere Genauigkeit auf Kosten der Geschwindigkeit bietet.

Eingabe

Ein Foto eines Wandgemäldes mit aufgemaltem Text, hochgeladen über LoadImage. Die Szene enthält mehrere Wörter, die in eine reale Umgebung eingebettet sind, wodurch sie einen praktischen Test für ReadPhoto mit dem Enhanced Modell darstellt.

Foto mit Text, das als Eingabe für ReadPhoto OCR verwendet wurde

photo.png: Wandbildfoto, das mit ReadPhoto und dem erweiterten Modell geladen wurde, um eine durchsuchbare PDF-Datei zu erzeugen.

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

Ausgabe

searchable-photo.pdf: Durchsuchbare PDF-Ausgabe von ReadPhoto. Die Textebene unterstützt die Volltextsuche in jedem PDF-Viewer.

Das resultierende durchsuchbare PDF enthält eine unsichtbare Textebene über den erkannten Wörtern. Die Suche nach "Milk" im PDF-Viewer liefert 3 Treffer, die direkt aus dem auf dem Originalfoto aufgemalten Text extrahiert wurden.

Der gleiche Ansatz funktioniert auch mit ReadDocumentAdvanced, was OcrDocAdvancedResult zurückgibt:

Eingabe

Eine gescannte Rechnung, die über LoadImage hochgeladen wurde. Es enthält strukturierte Felder (Lieferantenname, Positionen und Summen), die vom ReadDocumentAdvanced-Modell mit dem Enhanced-Modell erkannt und als durchsuchbare Textschicht eingebettet werden.

Rechnungsdokument als Eingabe für ReadDocumentAdvanced OCR verwendet

invoice.png: Die gescannte Rechnung wurde in OcrInput geladen und mit dem erweiterten Modell an ReadDocumentAdvanced übergeben.

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

Ausgabe

searchable-doc.pdf: Durchsuchbare PDF-Ausgabe von ReadDocumentAdvanced. Rechnungsfelder sind auswählbar und durchsuchbar.

SaveAsSearchablePdf wird für ReadPassport oder ReadLicensePlate Ergebnisse nicht unterstützt und löst einen ExtensionAdvancedScanException. aus.

Arbeiten mit mehrseitigen Dokumenten

Bei der Bearbeitung von PDF-OCR-Operationen an mehrseitigen Dokumenten verarbeitet IronOCR jede Seite nacheinander und erhält die ursprüngliche Dokumentstruktur bei.

Eingabe

Ein 11-seitiger Jahresbericht von Hartwell Capital Management wurde über OcrPdfInput hochgeladen. Die Seiten 1–10 (Indizes 0–9) werden mithilfe des Bereichs PageIndices ausgewählt und in einem einzigen Read-Aufruf verarbeitet.

multi-page-scan.pdf: 11-seitiger Jahresbericht von Hartwell Capital Management, der als Eingabe für die mehrseitige, durchsuchbare PDF-Konvertierung verwendet wurde.

: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

Ausgabe

searchable-multi-page.pdf: 10-seitiges, durchsuchbares PDF. Jede Seite enthält eine unsichtbare Textebene für die Volltextsuche.

Die resultierende PDF-Datei enthält 10 Seiten (Seiten 1–10 aus dem Originalbericht), wobei jede Seite eine unsichtbare Textebene enthält, die es ermöglicht, den extrahierten Inhalt in jedem PDF-Viewer auszuwählen und zu durchsuchen.

Wie kann ich bei der Erstellung durchsuchbarer PDFs Filter anwenden?

Der zweite Parameter SaveAsSearchablePdf akzeptiert einen booleschen Wert, der steuert, ob Bildfilter auf die eingebettete Ausgabe angewendet werden. Die Verwendung von Bildoptimierungsfiltern kann die OCR-Genauigkeit erheblich verbessern, insbesondere bei Minderwertigen Scans.

Im folgenden Beispiel wird der Graustufenfilter angewendet und true als zweites Argument übergeben, um das gefilterte Bild in die durchsuchbare PDF-Ausgabe einzubetten.

: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

Um optimale Ergebnisse zu erzielen, sollten Sie den Filter-Assistenten verwenden, um automatisch die beste Kombination von Filtern für Ihren spezifischen Dokumententyp zu ermitteln. Dieses Tool analysiert Ihre Eingaben und schlägt geeignete Vorverarbeitungsschritte vor.

Wie korrigiere ich fehlerhafte Zeichen in durchsuchbaren PDFs?

Wenn der Text in der PDF-Datei visuell korrekt erscheint, beim Suchen oder Kopieren jedoch fehlerhafte Zeichen angezeigt werden, liegt das Problem an der Standardschriftart, die in der durchsuchbaren Textebene verwendet wird. Standardmäßig verwendet SaveAsSearchablePdf die Schriftart Times New Roman, die nicht alle Unicode-Zeichen vollständig unterstützt. Dies betrifft Sprachen mit Akzentzeichen oder Nicht-ASCII-Zeichen.

Um dies zu beheben, geben Sie eine Unicode-kompatible Schriftartdatei als dritten Parameter an:

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

Sie können auch einen benutzerdefinierten Schriftartnamen als vierten Parameter angeben:

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

Dies gilt für alle Ergebnistypen einschließlich OcrResult, OcrPhotoResult und OcrDocAdvancedResult, sodass die Korrektur unabhängig davon funktioniert, welche Lesemethode das Ergebnis erzeugt hat.

Für Dokumente, die ursprünglich in Times New Roman gesetzt wurden, wird Liberation Serif empfohlen, da diese Schriftart metrisch kompatibel ist und den ursprünglichen Zeilenabstand und das Layout beibehält. Für den allgemeinen mehrsprachigen Einsatz sind Noto Sans oder DejaVu Sans gute Alternativen.)}]

Für Szenarien, in denen das Schreiben in einen Dateipfad nicht möglich ist, unterstützt IronOCR auch die Rückgabe des durchsuchbaren PDFs als Byte-Array oder Stream.


Wie exportiere ich durchsuchbare PDFs als Bytes oder Streams?

Die Ausgabe des durchsuchbaren PDFs kann auch als Bytes oder Streams mit Hilfe der Methoden SaveAsSearchablePdfBytes bzw. SaveAsSearchablePdfStream verarbeitet werden. Das folgende Codebeispiel zeigt, wie diese Methoden verwendet werden.

: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

Diese Ausgabeoptionen sind besonders nützlich bei der Integration mit Cloud-Speicherdiensten, Datenbanken oder Webanwendungen, bei denen der Zugriff auf das Dateisystem eingeschränkt sein kann. Das folgende Beispiel veranschaulicht praktische Anwendungen:

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

Erwägungen zur Leistung

Bei der Verarbeitung großer Mengen von Dokumenten sollte die Implementierung von Multithreading-OCR-Operationen in Betracht gezogen werden, um den Durchsatz zu erhöhen. IronOCR unterstützt die gleichzeitige Verarbeitung, so dass Sie mehrere Dokumente gleichzeitig bearbeiten können:

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

Erweiterte Konfigurationsoptionen

Für fortgeschrittene Szenarien können Sie die detaillierte Tesseract-Konfiguration nutzen, um die OCR-Engine für bestimmte Dokumenttypen oder Sprachen feinabzustimmen:

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

Diese Konfigurationsoptionen gelten gleichermaßen für alle drei Ausgabemethoden: SaveAsSearchablePdf, SaveAsSearchablePdfBytes und SaveAsSearchablePdfStream. Die folgende Zusammenfassung enthält alle durchsuchbaren PDF-Methoden mit ihren jeweiligen Ausgabeformaten.

Zusammenfassung

Die Erstellung durchsuchbarer PDFs mit IronOCR ist einfach und flexibel. Egal ob Sie einzelne Bilder, mehrseitige Dokumente, Fotos über ReadPhoto oder erweiterte Dokumentenscans über ReadDocumentAdvanced verarbeiten müssen, die Bibliothek bietet robuste Methoden zur Generierung durchsuchbarer PDFs in verschiedenen Formaten. Verwenden Sie den Parameter ModelType, um zwischen dem Standard-ML-Modell und dem erweiterten ML-Modell für die Genauigkeit zu wählen. Durch die Möglichkeit, als Dateien, Bytes oder Streams zu exportieren, kann das Dokument an jede Anwendungsarchitektur angepasst werden, von Desktop-Anwendungen bis hin zu Cloud-basierten Diensten.

Für komplexere OCR-Szenarien sollten Sie die ausführlichen Codebeispiele studieren oder in der API-Dokumentation nach detaillierten Methodensignaturen und Optionen suchen.

Häufig gestellte Fragen

Wie erstelle ich eine durchsuchbare PDF-Datei aus gescannten Bildern in C#?

IronOCR macht es einfach, durchsuchbare PDFs aus gescannten Bildern zu erstellen. Setzen Sie einfach RenderSearchablePdf in der Konfiguration auf true, verwenden Sie die Read()-Methode für Ihr Eingabebild und rufen Sie SaveAsSearchablePdf() mit Ihrem gewünschten Ausgabepfad auf. IronOCR führt eine OCR auf dem Bild durch und erzeugt eine PDF-Datei mit auswählbarem, durchsuchbarem Text, der über das Originalbild gelegt wird.

Welche Dateiformate können in durchsuchbare PDFs konvertiert werden?

IronOCR kann verschiedene Bildformate wie JPG, PNG, TIFF und bestehende PDF-Dokumente in durchsuchbare PDFs konvertieren. Die Bibliothek unterstützt sowohl einseitige Bilder als auch mehrseitige Dokumente wie TIFF-Dateien, wobei alle Seiten automatisch verarbeitet werden und die korrekte Seitenreihenfolge in der durchsuchbaren PDF-Ausgabe beibehalten wird.

Kann ich durchsuchbare PDF-Dateien als Byte-Arrays oder Streams anstelle von Dateien exportieren?

Ja, IronOCR unterstützt den Export von durchsuchbaren PDFs in mehreren Formaten. Neben dem direkten Speichern in eine Datei mit SaveAsSearchablePdf() können Sie die OCR-Ergebnisse auch als Byte-Arrays oder Streams exportieren, was die Integration in Webanwendungen, Cloud-Speicher oder Datenbanksysteme erleichtert, ohne dass temporäre Dateien erstellt werden müssen.

Welcher Code ist mindestens erforderlich, um eine durchsuchbare PDF-Datei zu erstellen?

Die Erstellung einer durchsuchbaren PDF-Datei mit IronOCR kann in nur einer Codezeile erfolgen: new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } }.Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf"). Dies demonstriert das schlanke API-Design von IronOCR.

Wie funktioniert die unsichtbare Textebene in durchsuchbaren PDFs?

IronOCR positioniert erkannten Text automatisch als unsichtbare Ebene über dem Originalbild im PDF. Dies gewährleistet eine präzise Text-Bild-Zuordnung und ermöglicht es Benutzern, Text auszuwählen und zu durchsuchen, ohne das visuelle Erscheinungsbild des Originaldokuments zu verändern. Die Bibliothek verwendet hierfür spezielle Schriftarten und Positionierungsalgorithmen.

Kann ich aus Fotos oder Screenshots durchsuchbare PDFs erstellen?

Ja, SaveAsSearchablePdf wird für Ergebnisse von ReadPhoto , ReadScreenShot und ReadDocumentAdvanced unterstützt. Jede Methode liefert einen Ergebnistyp, der den Export durchsuchbarer PDFs unterstützt und somit die Konvertierung von Fotos, Screenshots oder komplexen Dokumentenscans in durchsuchbare PDFs vereinfacht.

Was bewirkt der Parameter ModelType?

Der Parameter ModelType steuert, welches vortrainierte ML-Modell für die OCR verwendet wird. Standardmäßig wird Normal verwendet, das Bilder mit einer Größe von 960 Pixeln verarbeitet, um schnelle Ergebnisse zu erzielen. Enhanced unterstützt Bilder mit bis zu 2560 Pixeln, wodurch feinere Details erhalten bleiben und die Genauigkeit bei hochauflösenden Eingaben verbessert wird.

Warum werden kopierte oder gesuchte Zeichen in meiner durchsuchbaren PDF-Datei fehlerhaft angezeigt?

Dies liegt daran, dass die Standardschriftart (Times New Roman) der durchsuchbaren Textebene nicht alle Unicode-Zeichen vollständig unterstützt. Um dies zu beheben, übergeben Sie eine Unicode-kompatible Schriftartdatei als dritten Parameter von SaveAsSearchablePdf . Falls Ihre Dokumente ursprünglich in Times New Roman gesetzt wurden und Sie bei anderen Schriftarten Inkonsistenzen im Zeichenabstand feststellen, versuchen Sie es mit Liberation Serif. Diese Schriftart verwendet dieselben Glyphenmetriken und bewahrt das ursprüngliche Layout.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Rezensiert von
Jeff Fritz
Jeffrey T. Fritz
Principal Program Manager - .NET Community Team
Jeff ist außerdem Principal Program Manager für das .NET- und Visual Studio-Team. Er ist der ausführende Produzent der .NET Conf Virtual Conference Series und moderiert ‚Fritz and Friends‘, einen Livestream für Entwickler, der zweimal wöchentlich ausgestrahlt wird. Dort spricht er über Technik und schreibt gemeinsam mit den Zuschauern Code. Jeff schreibt Workshops, Präsentationen und plant Inhalte für die größten Microsoft-Entwicklerveranstaltungen, einschließlich Microsoft Build, Microsoft Ignite, .NET Conf und dem Microsoft MVP Summit.
Bereit anzufangen?
Nuget Downloads 5,570,591 | Version: 2026.4 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronOcr
Führen Sie ein Beispiel aus und beobachten Sie, wie Ihr Bild zu durchsuchbarem Text wird.