Jak zapisać wyniki jako plik PDF z możliwością wyszukiwania w języku C#

Zapisywanie plików PDF z możliwością wyszukiwania w języku C# za pomocą IronOCR

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

IronOCR umożliwia programistom C# konwersję zeskanowanych dokumentów i obrazów na pliki PDF z możliwością wyszukiwania przy użyciu technologii OCR, obsługując wyjście w postaci plików, bajtów lub strumieni za pomocą zaledwie kilku linii kodu.

PDF z funkcją wyszukiwania, często nazywany PDF-em OCR (Optical Character Recognition), to rodzaj dokumentu PDF, który zawiera zarówno zeskanowane obrazy, jak i tekst nadający się do odczytu maszynowego. Pliki PDF są tworzone poprzez przeprowadzenie OCR na zeskanowanych dokumentach papierowych lub obrazach, rozpoznanie tekstu na obrazach oraz przekształcenie go w tekst, który można zaznaczać i przeszukiwać.

SaveAsSearchablePdf jest również dostępny dla wyników z ReadPhoto, ReadScreenShot i ReadDocumentAdvanced, umożliwiając tworzenie przeszukiwalnych PDF z odbitki i zaawansowanych przepływów OCR dokumentów. Ta funkcja jest szczególnie przydatna podczas digitalizacji archiwów papierowych lub udostępniania starszych plików PDF do przeszukiwania w celu lepszego zarządzania dokumentami.

Szybki start: Eksportuj przeszukiwalny plik PDF w jednym wierszu

Ustaw RenderSearchablePdf = true, uruchom Read(...) na swoim wejściu i wywołaj SaveAsSearchablePdf(...). To wszystko, czego potrzeba, aby wygenerować plik PDF z pełną funkcją wyszukiwania za pomocą IronOCR.

  1. Install IronOCR with NuGet Package Manager

    PM > Install-Package IronOcr
  2. Skopiuj i uruchom ten fragment kodu.

    new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } } .Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf");
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


Jak wyeksportować wyniki OCR jako plik PDF z możliwością wyszukiwania?

Aby wyeksportować wynik jako przeszukiwalny PDF używając IronOCR, ustaw właściwość Configuration.RenderSearchablePdf na true, uzyskaj obiekt wyniku OCR z metody Read i wywołaj SaveAsSearchablePdf z docelową ścieżką pliku.

Dane wejściowe

Jedna strona z powieści o Harrym Potterze, zeskanowana jako plik TIFF i załadowana za pomocą OcrImageInput. Strona zawiera gęsty tekst drukowany, co stanowi realistyczny materiał do testowania warstwy tekstowej pliku PDF z możliwością wyszukiwania.

Strona z książki o Harrym Potterze przedstawiająca rozdział ósmy

potter.tiff: Zeskanowana strona powieści wykorzystana jako dane wejściowe do OCR w celu utworzenia pliku PDF z możliwością wyszukiwania, zawierającego niewidoczną warstwę tekstową.

: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

Wynik

searchablePdf.pdf: Plik PDF z możliwością wyszukiwania. Wybierz lub wyszukaj dowolne słowo, aby zweryfikować warstwę tekstową OCR.

W wynikowym pliku PDF osadzony jest oryginalny obraz zeskanowanej strony z niewidoczną warstwą tekstową umieszczoną nad każdym rozpoznanym słowem. Zaznacz lub wyszukaj dowolne słowo w przeglądarce, aby sprawdzić, czy warstwa tekstowa jest obecna.

IronOCR używa specjalnej czcionki do nakładki, co może powodować niewielkie różnice w rozmiarze renderowanego tekstu w porównaniu z oryginałem.

Podczas pracy z wielostronicowymi plikami TIFF lub złożonymi dokumentami IronOCR automatycznie przetwarza wszystkie strony i dołącza je do pliku wyjściowego. Biblioteka automatycznie obsługuje porządkowanie stron i pozycjonowanie nakładek tekstowych, zapewniając dokładne odwzorowanie tekstu na obraz.

Jak utworzyć pliki PDF z możliwością wyszukiwania na podstawie zdjęć lub skanów dokumentów o wysokiej jakości?

Eksport do przeszukiwalnego PDF jest również możliwy przy użyciu ReadPhoto, ReadScreenShot lub ReadDocumentAdvanced. Każda z tych metod zwraca typ wyniku wspierający SaveAsSearchablePdf.

Możesz opcjonalnie przekazać ModelType podczas wywoływania tych metod. Domyślnym ustawieniem jest Normal, podczas gdy Enhanced zapewnia lepszą dokładność kosztem szybkości.

Dane wejściowe

Zdjęcie malowidła ściennego z tekstem, załadowane za pomocą LoadImage. Scena zawiera wiele słów osadzonych w rzeczywistym środowisku, co czyni ją praktycznym testem dla ReadPhoto z modelem Enhanced.

Zdjęcie zawierające tekst użyty jako dane wejściowe dla OCR ReadPhoto

photo.png: Zdjęcie fototapety załadowane za pomocą ReadPhoto z wykorzystaniem modelu Enhanced w celu utworzenia pliku PDF z możliwością wyszukiwania.

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

Wynik

searchable-photo.pdf: Plik PDF z możliwością wyszukiwania wygenerowany przez ReadPhoto. Warstwa tekstowa obsługuje wyszukiwanie pełnotekstowe w dowolnej przeglądarce plików PDF.

Powstały plik PDF z funkcją wyszukiwania zawiera niewidoczną warstwę tekstową na rozpoznanych słowach. Wyszukiwanie słowa "Milk" w przeglądarce plików PDF zwraca 3 wyniki, wyodrębnione bezpośrednio z tekstu namalowanego na oryginalnym zdjęciu.

To samo podejście działa z ReadDocumentAdvanced, które zwraca OcrDocAdvancedResult:

Dane wejściowe

Zeskanowana faktura załadowana za pomocą LoadImage. Zawiera strukturalne pola (nazwa dostawcy, pozycje i sumy), które ReadDocumentAdvanced z modelem Enhanced rozpoznaje i osadza jako przeszukiwalną warstwę tekstu.

Dokument faktury użyty jako dane wejściowe dla ReadDocumentAdvanced OCR

invoice.png: Zeskanowana faktura załadowana do OcrInput i przekazana do ReadDocumentAdvanced z modelem 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

Wynik

searchable-doc.pdf: Plik PDF z możliwością wyszukiwania wygenerowany przez ReadDocumentAdvanced. Pola faktury można zaznaczać i przeszukiwać.

SaveAsSearchablePdf nie jest wspierany dla wyników ReadPassport lub ReadLicensePlate i spowoduje wystąpienie ExtensionAdvancedScanException.

Praca z dokumentami wielostronicowymi

Podczas operacji OCR plików PDF w dokumentach wielostronicowych IronOCR przetwarza każdą stronę po kolei i zachowuje oryginalną strukturę dokumentu.

Dane wejściowe

11-stronicowy raport roczny z Hartwell Capital Management, załadowany za pomocą OcrPdfInput. Strony 1–10 (indeksy 0–9) są wybierane przy użyciu zakresu PageIndices i przetwarzane w jednym wywołaniu Read.

multi-page-scan.pdf: 11-stronicowy raport roczny Hartwell Capital Management wykorzystany jako materiał wejściowy do konwersji do wielostronicowego pliku PDF z możliwością wyszukiwania.

: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

Wynik

searchable-multi-page.pdf: 10-stronicowy plik PDF z możliwością wyszukiwania. Każda strona zawiera niewidoczną warstwę tekstową umożliwiającą wyszukiwanie pełnotekstowe.

Powstały plik PDF zawiera 10 stron (strony 1–10 z oryginalnego raportu), z których każda posiada niewidoczną warstwę tekstową, dzięki czemu wyodrębniona treść jest zaznaczalna i można ją przeszukiwać w dowolnej przeglądarce plików PDF.

Jak zastosować filtry podczas tworzenia plików PDF z funkcją wyszukiwania?

Drugi parametr SaveAsSearchablePdf akceptuje wartość logiczną, która kontroluje, czy filtry obrazu są stosowane do osadzonego wyniku. Zastosowanie filtrów optymalizujących obraz może znacznie poprawić dokładność OCR, zwłaszcza w przypadku skanów o niskiej jakości.

Poniższy przykład stosuje filtr w odcieniach szarości i przekazuje true jako drugi argument, aby osadzić przefiltrowany obraz w przeszukiwalnym PDF.

: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

Aby uzyskać optymalne wyniki, warto rozważyć użycie Kreatora filtrów, który automatycznie określi najlepszą kombinację filtrów dla danego typu dokumentu. To narzędzie analizuje wprowadzone dane i sugeruje odpowiednie kroki przetwarzania wstępnego.

Jak naprawić nieprawidłowe znaki w plikach PDF z funkcją wyszukiwania?

Jeśli tekst wygląda poprawnie w pliku PDF, ale podczas wyszukiwania lub kopiowania wyświetla się jako uszkodzone znaki, przyczyną tego problemu jest domyślna czcionka używana w warstwie tekstu z możliwością wyszukiwania. Domyślnie SaveAsSearchablePdf używa Times New Roman, który nie w pełni obsługuje wszystkie znaki Unicode. Dotyczy to języków zawierających znaki akcentowane lub spoza zestawu ASCII.

Aby to naprawić, podaj plik czcionki zgodny z Unicode jako trzeci parametr:

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

Można również podać nazwę niestandardowej czcionki jako czwarty parametr:

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

Dotyczy to wszystkich typów wyników, w tym OcrResult, OcrPhotoResult i OcrDocAdvancedResult, więc poprawka działa niezależnie od tego, która metoda odczytu wywołała wynik.

Zwróć uwagęW przypadku dokumentów pierwotnie składanych czcionką Times New Roman zaleca się użycie czcionki Liberation Serif, ponieważ jest ona kompatybilna metrycznie, zachowując oryginalne odstępy i układ. Do ogólnego użytku wielojęzycznego dobrym wyborem są czcionki Noto Sans lub DejaVu Sans.

W sytuacjach, w których zapisanie pliku w ścieżce nie jest możliwe, IronOCR obsługuje również zwracanie przeszukiwalnego pliku PDF jako tablicy bajtów lub strumienia.


Jak wyeksportować pliki PDF z możliwością wyszukiwania jako bajty lub strumienie?

Wynik przeszukiwalnego PDF można również obsłużyć jako bajty lub strumienie za pomocą metod SaveAsSearchablePdfBytes i SaveAsSearchablePdfStream, odpowiednio. Poniższy przykład kodu pokazuje, jak korzystać z tych metod.

: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

Te opcje wyjściowe są szczególnie przydatne podczas integracji z usługami przechowywania w chmurze, bazami danych lub aplikacjami internetowymi, w których dostęp do systemu plików może być ograniczony. Poniższy przykład ilustruje praktyczne zastosowania:

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

Rozważania dotyczące wydajności

Podczas przetwarzania dużych ilości dokumentów warto rozważyć wdrożenie wielowątkowych operacji OCR w celu zwiększenia przepustowości. IronOCR obsługuje przetwarzanie równoległe, co pozwala na jednoczesną obsługę wielu dokumentów:

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

Zaawansowane opcje konfiguracji

W bardziej zaawansowanych scenariuszach można wykorzystać szczegółową konfigurację Tesseract, aby dostosować silnik OCR do konkretnych typów dokumentów lub języków:

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

Te opcje konfiguracji mają zastosowanie równo do trzech metod wyjścia: SaveAsSearchablePdf, SaveAsSearchablePdfBytes i SaveAsSearchablePdfStream. Poniższe podsumowanie zawiera pełen zestaw metod wyszukiwania w plikach PDF wraz z odpowiednimi formatami wyjściowymi.

Podsumowanie

Tworzenie plików PDF z możliwością wyszukiwania za pomocą IronOCR jest proste i elastyczne. Niezależnie od tego, czy trzeba przetworzyć pojedyncze obrazy, wielostronicowe dokumenty, zdjęcia za pomocą ReadPhoto lub zaawansowane skanowania dokumentów za pomocą ReadDocumentAdvanced, biblioteka zapewnia solidne metody generowania przeszukiwalnych PDF w różnych formatach. Użyj parametru ModelType, aby wybrać pomiędzy standardowym a ulepszonym modelem ML dla dokładności. Możliwość eksportowania w postaci plików, bajtów lub strumieni sprawia, że można je dostosować do dowolnej architektury aplikacji, od aplikacji desktopowych po usługi w chmurze.

W przypadku bardziej zaawansowanych scenariuszy OCR zapoznaj się z obszernymi przykładami kodu lub dokumentacją API, aby uzyskać szczegółowe informacje na temat sygnatur metod i opcji.

Często Zadawane Pytania

Jak utworzyć plik PDF z możliwością wyszukiwania na podstawie zeskanowanych obrazów w języku C#?

IronOCR ułatwia tworzenie plików PDF z możliwością wyszukiwania na podstawie zeskanowanych obrazów. Wystarczy ustawić RenderSearchablePdf na true w konfiguracji, użyć metody Read() na obrazie wejściowym i wywołać SaveAsSearchablePdf() z żądaną ścieżką wyjściową. IronOCR przeprowadzi OCR na obrazie i wygeneruje plik PDF z tekstem, który można zaznaczać i przeszukiwać, nałożonym na oryginalny obraz.

Jakie formaty plików można konwertować na pliki PDF z możliwością wyszukiwania?

IronOCR może konwertować różne formaty obrazów, w tym JPG, PNG, TIFF oraz istniejące dokumenty PDF, na pliki PDF z możliwością wyszukiwania. Biblioteka IronOCR obsługuje zarówno obrazy jednostronicowe, jak i dokumenty wielostronicowe, takie jak pliki TIFF, automatycznie przetwarzając wszystkie strony i zachowując właściwą kolejność stron w wyjściowym pliku PDF z możliwością wyszukiwania.

Czy mogę eksportować pliki PDF z możliwością wyszukiwania jako tablice bajtów lub strumienie zamiast plików?

Tak, IronOCR obsługuje eksportowanie plików PDF z możliwością wyszukiwania w wielu formatach. Oprócz zapisywania bezpośrednio do pliku za pomocą funkcji SaveAsSearchablePdf(), można również eksportować wyniki OCR jako tablice bajtów lub strumienie, co ułatwia integrację z aplikacjami internetowymi, pamięcią w chmurze lub systemami baz danych bez tworzenia plików tymczasowych.

Jaki jest minimalny kod wymagany do utworzenia pliku PDF z możliwością wyszukiwania?

Utworzenie pliku PDF z możliwością wyszukiwania za pomocą IronOCR można wykonać za pomocą zaledwie jednej linii kodu: new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } }.Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf"). Pokazuje to uproszczoną konstrukcję API IronOCR.

Jak działa niewidoczna warstwa tekstowa w plikach PDF z funkcją wyszukiwania?

IronOCR automatycznie zajmuje się pozycjonowaniem rozpoznanego tekstu jako niewidocznej warstwy nałożonej na oryginalny obraz w pliku PDF. Zapewnia to dokładne odwzorowanie tekstu na obraz, umożliwiając użytkownikom zaznaczanie i wyszukiwanie tekstu przy zachowaniu wyglądu oryginalnego dokumentu. Biblioteka IronOCR wykorzystuje do tego specjalistyczne czcionki i algorytmy pozycjonowania.

Czy mogę tworzyć pliki PDF z możliwością wyszukiwania na podstawie zdjęć lub zrzutów ekranu?

Tak, funkcja SaveAsSearchablePdf jest obsługiwana w wynikach metod ReadPhoto, ReadScreenShot i ReadDocumentAdvanced. Każda z tych metod zwraca typ wyniku, który obsługuje eksport do formatu PDF z możliwością wyszukiwania, co ułatwia konwersję rzeczywistych zdjęć, zrzutów ekranu lub skanów złożonych dokumentów do plików PDF z możliwością wyszukiwania.

Do czego służy parametr ModelType?

Parametr ModelType kontroluje, który wstępnie wytrenowany model ML jest używany do OCR. Normal to ustawienie domyślne, które przetwarza obrazy o rozmiarze 960 pikseli, zapewniając szybkie wyniki. Enhanced obsługuje obrazy o rozmiarze do 2560 pikseli, zachowując drobniejsze szczegóły i poprawiając dokładność w przypadku danych wejściowych o wysokiej rozdzielczości.

Dłączego skopiowane lub wyszukane znaki są uszkodzone w moim pliku PDF z funkcją wyszukiwania?

Dzieje się tak, ponieważ domyślna czcionka (Times New Roman) używana w warstwie tekstu z możliwością wyszukiwania nie obsługuje w pełni wszystkich znaków Unicode. Aby to naprawić, należy przekazać plik czcionki zgodnej z Unicode jako trzeci parametr funkcji SaveAsSearchablePdf. Jeśli dokumenty zostały pierwotnie złożone czcionką Times New Roman i zauważysz niespójności w odstępach w porównaniu z innymi czcionkami, wypróbuj czcionkę Liberation Serif, ponieważ ma ona takie same metryki glifów i zachowuje oryginalny układ.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Sprawdzone przez
Jeff Fritz
Jeffrey T. Fritz
Główny Menedżer Programu - Zespół .NET Community
Jeff jest również Głównym Menedżerem Programu dla zespołów .NET i Visual Studio. Jest producentem wykonawczym wirtualnej serii konferencji .NET Conf i prowadzi 'Fritz and Friends', transmisję na żywo dla deweloperów emitowaną dwa razy w tygodniu, gdzie rozmawia o technologii i pisze kod razem z widzami. Jeff pisze warsztaty, prezentacje i planuje treści dla największych wydarzeń Microsoft dla deweloperów, w tym Microsoft Build, Microsoft Ignite, .NET Conf i Microsoft MVP Summit.
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 5,571,678 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronOcr
uruchom próbkę obserwuj, jak twój obraz staje się tekstem z możliwością wyszukiwania.