using IronOcr;// Create the OCR engine: defaults to English with balanced speed and accuracyIronTesseract ocrTesseract = new IronTesseract();// Required: without this flag the text overlay layer is not built, and SaveAsSearchablePdf produces a plain image PDFocrTesseract.Configuration.RenderSearchablePdf = true;// Wrap the TIFF in OcrImageInput: handles DPI detection and page layout automaticallyusing var imageInput = new OcrImageInput("Potter.tiff");// Run OCR; returns a result containing the recognized text and spatial layout dataOcrResult ocrResult = ocrTesseract.Read(imageInput);// Write the output: the original scanned image is preserved with an invisible text layer on topocrResult.SaveAsSearchablePdf("searchablePdf.pdf");
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");
ImportsIronOcr' Create the OCR engine: defaults to English with balanced speed and accuracyDim ocrTesseract As New IronTesseract()' Required: without this flag the text overlay layer is not built, and SaveAsSearchablePdf produces a plain image PDFocrTesseract.Configuration.RenderSearchablePdf = True' Wrap the TIFF in OcrImageInput: handles DPI detection and page layout automaticallyUsing imageInput As New OcrImageInput("Potter.tiff") ' Run OCR; returns a result containing the recognized text and spatial layout data Dim ocrResult AsOcrResult = ocrTesseract.Read(imageInput) ' Write the output: the original scanned image is preserved with an invisible text layer on top ocrResult.SaveAsSearchablePdf("searchablePdf.pdf")EndUsing
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
using IronOcr;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("photo.png");// ReadPhoto with Enhanced modelOcrPhotoResult photoResult = ocr.ReadPhoto(input, ModelType.Enhanced);Console.WriteLine(photoResult.Text);// Save as searchable PDFbyte[] pdfBytes = photoResult.SaveAsSearchablePdfBytes();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.SaveAsSearchablePdfBytes();
File.WriteAllBytes("searchable-photo.pdf", pdfBytes);
using IronOcr;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("invoice.png");// ReadDocumentAdvanced with Enhanced modelOcrDocAdvancedResult docResult = ocr.ReadDocumentAdvanced(input, ModelType.Enhanced);byte[] docPdfBytes = docResult.SaveAsSearchablePdfBytes();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.SaveAsSearchablePdfBytes();
File.WriteAllBytes("searchable-doc.pdf", docPdfBytes);
一份來自Hartwell Capital Management的11頁年度報告,通過OcrPdfInput載入。 使用Read調用中處理它們。
multi-page-scan.pdf:用作多頁可搜尋PDF轉換輸入的11頁Hartwell Capital Management年度報告。
using IronOcr;// Create the OCR engine. RenderSearchablePdf is false by default; no need to set it when using OcrPdfInput directlyvar ocrTesseract = new IronTesseract();// Load pages 1–10 (indices 0–9) only; PageIndices avoids loading and OCR-ing the full document unnecessarilyusing var pdfInput = new OcrPdfInput("multi-page-scan.pdf", PageIndices: Enumerable.Range(0, 10));// Run OCR across all selected pages in orderOcrResult result = ocrTesseract.Read(pdfInput);// Write the searchable PDF; true = apply the input's image filters to the embedded page images in the outputresult.SaveAsSearchablePdf("searchable-multi-page.pdf", true);
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);
ImportsIronOcr' Create the OCR engine. RenderSearchablePdf is false by default; no need to set it when using OcrPdfInput directlyDim ocrTesseract As New IronTesseract()' Load pages 1–10 (indices 0–9) only; PageIndices avoids loading and OCR-ing the full document unnecessarilyUsing pdfInput As New OcrPdfInput("multi-page-scan.pdf", PageIndices:=Enumerable.Range(0, 10)) ' Run OCR across all selected pages in order Dim result AsOcrResult = 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)EndUsing
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
using IronOcr;// Create OCR engine: filters are applied at the OcrInput level, so no configuration changes are needed herevar ocr = new IronTesseract();var ocrInput = new OcrInput();// Load the scanned PDF as the OCR sourceocrInput.LoadPdf("invoice.pdf");// Convert to grayscale: removes color noise that can reduce OCR accuracy on color-printed documentsocrInput.ToGrayScale();// Run OCR on the preprocessed inputOcrResult result = ocr.Read(ocrInput);// Write the searchable PDF; true = embed the grayscale-filtered image rather than the original color scanresult.SaveAsSearchablePdf("outputGrayscale.pdf", true);
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);
ImportsIronOcr' Create OCR engine: filters are applied at the OcrInput level, so no configuration changes are needed hereDim ocr As New IronTesseract()Dim ocrInput As New OcrInput()' Load the scanned PDF as the OCR sourceocrInput.LoadPdf("invoice.pdf")' Convert to grayscale: removes color noise that can reduce OCR accuracy on color-printed documentsocrInput.ToGrayScale()' Run OCR on the preprocessed inputDim result AsOcrResult = ocr.Read(ocrInput)' Write the searchable PDF; True = embed the grayscale-filtered image rather than the original color scanresult.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)
// Return as a byte array: suited for storing in a database or sending in an HTTP response bodybyte[] pdfByte = ocrResult.SaveAsSearchablePdfBytes();// Return as a stream: suited for uploading to cloud storage or piping to another I/O operation without buffering the full fileStream pdfStream = ocrResult.SaveAsSearchablePdfStream();
// 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 bodyDim pdfByte AsByte() = ocrResult.SaveAsSearchablePdfBytes()' Return as a stream: suited for uploading to cloud storage or piping to another I/O operation without buffering the full fileDim pdfStream AsStream = 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()
using IronOcr;using System.IO;public class SearchablePdfExporter{ public async TaskProcessAndUploadPdf(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. awaitUploadToCloudStorage(pdfStream, "searchable-output.pdf"); } // Option 3: Return as web response // return File(pdfBytes, "application/pdf", "searchable.pdf"); } private async TaskUploadToCloudStorage(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
}
}
ImportsIronOcrImportsSystem.IOPublic Class SearchablePdfExporter PublicAsync Function ProcessAndUploadPdf(inputPath AsString) AsTask Dim ocr As New IronTesseractWith { .Configuration = { .RenderSearchablePdf = True } } ' Process the inputUsing input As New OcrImageInput(inputPath) Dim result = ocr.Read(input) ' Option 1: Save to database as byte array Dim pdfBytes AsByte() = result.SaveAsSearchablePdfBytes() ' Store pdfBytes in database BLOB field ' Option 2: Upload to cloud storage using streamUsing pdfStream AsStream = result.SaveAsSearchablePdfStream() ' Upload stream to Azure Blob Storage, AWS S3, etc.AwaitUploadToCloudStorage(pdfStream, "searchable-output.pdf")EndUsing ' Option 3: Return as web response ' Return File(pdfBytes, "application/pdf", "searchable.pdf")EndUsing End Function PrivateAsync Function UploadToCloudStorage(stream AsStream, fileName AsString) AsTask ' Cloud upload implementation End FunctionEnd Class
Imports IronOcr
Imports System.IO
Public Class SearchablePdfExporter
Public Async Function ProcessAndUploadPdf(inputPath As String) As Task
Dim ocr As New IronTesseract With {
.Configuration = { .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
using IronOcr;using System.Threading.Tasks;using System.Collections.Concurrent;public class BatchPdfProcessor{ private readonly IronTesseract _ocr; publicBatchPdfProcessor() { _ocr = new IronTesseract {Configuration = {RenderSearchablePdf = true, // Configure for optimal performanceLanguage = OcrLanguage.English } }; } public async TaskProcessBatchAsync(string[] filePaths) { var results = new ConcurrentBag<(string source, string output)>(); awaitParallel.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");
}
}
ImportsIronOcrImportsSystem.Threading.TasksImportsSystem.Collections.ConcurrentPublic Class BatchPdfProcessor PrivateReadOnly _ocr AsIronTesseract Public Sub New() _ocr = New IronTesseractWith { .Configuration = { .RenderSearchablePdf = True, ' Configure for optimal performance .Language = OcrLanguage.English } } End Sub PublicAsync Function ProcessBatchAsync(filePaths AsString()) AsTask Dim results As New ConcurrentBag(Of (source AsString, output AsString))()AwaitTask.Run(Sub()Parallel.ForEach(filePaths, Sub(filePath)Using input As New OcrImageInput(filePath) Dim result = _ocr.Read(input) Dim outputPath AsString = Path.ChangeExtension(filePath, ".searchable.pdf") result.SaveAsSearchablePdf(outputPath) results.Add((filePath, outputPath))EndUsing End Sub) End Function)Console.WriteLine($"Processed {results.Count} files") End FunctionEnd Class
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 = {
.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 Function)
Console.WriteLine($"Processed {results.Count} files")
End Function
End Class
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
};
ImportsIronOcrDim advancedOcr As New IronTesseractWith { .Configuration = New TesseractConfigurationWith { .RenderSearchablePdf = True, .TesseractVariables = New Dictionary(OfString, Object) From { {"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
}
這是因為可搜尋文字層中使用的預設字體(Times New Roman)不完全支持所有Unicode字元。要解決此問題,請將Unicode相容的字體文件作為SaveAsSearchablePdf的第三個參數傳入。如果您的文件最初是Times New Roman排版的,並且在使用其他字體時發現間距不一致,請嘗試Liberation Serif,因為它具有相同的字形尺寸,並保持原始佈局。
What advanced configuration options are available in IronOCR for creating searchable PDFs?
IronOCR offers advanced configuration options, including detailed Tesseract configuration, setting Tesseract variables, and choosing different page segmentation modes. These can be tailored to fine-tune OCR for specific document types or languages.