C#で検索可能なPDFとして結果を保存する方法

C#で検索可能なPDFを保存する with IronOCR

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

IronOCRはOCRテクノロジーを使用して、C#開発者がスキャンした文書や画像を検索可能なPDFに変換することを可能にし、わずか数行のコードでファイル、バイト、ストリームとしての出力をサポートします。

検索可能な PDF は、OCR (光学式文字認識) PDF とも呼ばれ、スキャンされた画像と機械で読み取り可能なテキストの両方を含む PDF ドキュメントの一種です。 これらの PDF は、スキャンされた紙の文書または画像に対して OCR を実行し、画像内のテキストを認識して、選択および検索可能なテキストに変換することによって作成されます。

IronOCR は、ドキュメントに対して光学文字認識を実行し、その結果を検索可能な PDF としてエクスポートするためのソリューションを提供します。 検索可能な PDF をファイル、バイト、ストリームとしてエクスポートすることをサポートします。 SaveAsSearchablePdf は、ReadScreenShot、および ReadDocumentAdvanced の結果でも利用可能であり、写真からの検索可能な PDF 作成と高度なドキュメント OCR ワークフローを可能にします。 この機能は、スキャンされたドキュメントを扱うとき、紙のアーカイブをデジタル化するとき、またはより良いドキュメント管理のためにレガシーPDFを検索可能にするときに特に役立ちます。

クイックスタート: 検索可能なPDFを1行でエクスポート

RenderSearchablePdf = true を設定し、入力に対して Read(...) を実行し、SaveAsSearchablePdf(...) を呼び出すだけで、 IronOCRを使用して完全に検索可能な PDF を生成できます。

  1. IronOCR をNuGetパッケージマネージャでインストール

    PM > Install-Package IronOcr
  2. このコード スニペットをコピーして実行します。

    new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true } } .Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf");
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronOCR を使い始めましょう無料トライアル

    arrow pointer


OCR結果を検索可能なPDFとしてエクスポートするにはどうすればよいですか?

IronOCR を使用して結果を検索可能な PDF としてエクスポートする方法は次のとおりです。 まず、Configuration.RenderSearchablePdf プロパティを true に設定する必要があります。 Read メソッドから OCR 結果オブジェクトを取得した後、出力ファイルパスを指定して SaveAsSearchablePdf メソッドを使用します。 以下のコードは、サンプル TIFF ファイルの使用方法を示しています。

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

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

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

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

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

複数ページのTIFFファイルや複雑な文書を扱う場合、IronOCRは自動的にすべてのページを処理し、検索可能なPDF出力に含めます。 このライブラリは、ページの順序とテキストオーバーレイの位置を自動的に処理し、テキストと画像の正確なマッピングを保証します。

以下は、サンプル TIFF と埋め込まれた検索可能な PDF のスクリーンショットです。 PDF 内のテキストを選択して、検索可能かどうかを確認します。 The ability to select also means the text can be searched in a PDF viewer.

IronOcrは画像ファイルにテキストをオーバーレイするために特定のフォントを使用しています。

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

写真や高度なドキュメントスキャンから検索可能なPDFを作成するにはどうすればよいですか?

検索可能な PDF エクスポートは、ReadScreenShot、または ReadDocumentAdvanced を使用する場合にも利用できます。 これらのメソッドはそれぞれ、SaveAsSearchablePdf をサポートする結果型を返します。

これらのメソッドを呼び出す際に、オプションで ModelType を渡すことができます。 デフォルトは Normal ですが、Enhanced は速度を犠牲にして精度を向上させます。

using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("photo.png");

// ReadPhoto with Enhanced model
OcrPhotoResult photoResult = ocr.ReadPhoto(input, ModelType.Enhanced);
Console.WriteLine(photoResult.Text);

// Save as searchable PDF
byte[] pdfBytes = photoResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-photo.pdf", pdfBytes);
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("photo.png");

// ReadPhoto with Enhanced model
OcrPhotoResult photoResult = ocr.ReadPhoto(input, ModelType.Enhanced);
Console.WriteLine(photoResult.Text);

// Save as searchable PDF
byte[] pdfBytes = photoResult.SaveAsSearchablePdf();
File.WriteAllBytes("searchable-photo.pdf", pdfBytes);
$vbLabelText   $csharpLabel
Photo containing text used as input for ReadPhoto OCR

同じアプローチは ReadDocumentAdvanced でも機能し、OcrDocAdvancedResult を返します。

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

生成された検索可能なPDFファイルには、あらゆるPDFビューアで全文検索をサポートする目に見えないテキストレイヤーが含まれています。 例えば、上記の最初のPDFで"牛乳"を検索すると、3件の一致結果が表示されます。これらは元の写真の壁画から直接抽出されたものです。

SaveAsSearchablePdfReadPassport() または ReadLicensePlate() の結果ではサポートされておらず、ExtensionAdvancedScanException. をスローします。

複数ページのドキュメントを扱う

複数ページの文書に対するPDF OCR操作を扱う場合、IronOCRは各ページを順次処理し、元の文書構造を維持します。 以下は、複数ページのスキャンPDFを検索可能なPDFに変換する例です:

using IronOcr;

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

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

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

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

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

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

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

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

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

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

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

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

検索可能なPDFを作成するときにフィルタを適用するにはどうすればよいですか?

SaveAsSearchablePdf は、2 番目のパラメータとしてブール型のフラグも受け入れ、検索可能な PDF にフィルタを適用するかどうかを選択できるようにすることで、開発者に選択の柔軟性を提供します。 画像最適化フィルターを使用すると、特に低品質スキャンを扱う場合に、OCRの精度を大幅に向上させることができます。

以下は、グレースケールフィルターを適用し、SaveAsSearchablePdf の 2 番目のパラメーターに true を入れることでフィルターを適用した PDF を保存する例です。

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

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

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

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

// Save the result as a searchable PDF with filters applied
result.SaveAsSearchablePdf("outputGrayscale.pdf", true);
$vbLabelText   $csharpLabel

最適な結果を得るには、フィルタウィザードを使用して、特定のドキュメントタイプに最適なフィルタの組み合わせを自動的に決定することを検討してください。 このツールは、入力を分析し、適切な前処理ステップを提案します。

検索可能なPDFファイル内の誤った文字を修正するにはどうすればよいですか?

PDF上ではテキストが正しく表示されているのに、検索やコピーを行うと文字化けが発生する場合は、検索可能なテキストレイヤーで使用されているデフォルトフォントが原因です。 デフォルトでは、SaveAsSearchablePdf は Times New Roman を使用しますが、これはすべての Unicode 文字を完全にサポートしているわけではありません。 これは、アクセント記号付き文字や非ASCII文字を含む言語に影響します。

この問題を解決するには、3番目のパラメータとしてUnicode互換のフォントファイルを指定してください。

result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf");
result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf");
$vbLabelText   $csharpLabel

4番目のパラメータとして、カスタムフォント名を指定することもできます。

result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf", "MyFont");
result.SaveAsSearchablePdf("output.pdf", false, "Fonts/LiberationSerif-Regular.ttf", "MyFont");
$vbLabelText   $csharpLabel

これは、OcrDocAdvancedResultを含むすべての結果タイプに適用されるため、どの読み取り方法が結果を生成したかに関係なく、修正が有効になります。

ご注意Times New Romanで組版された文書の場合、Liberation Serifは計量的に互換性があり、元の間隔とレイアウトが維持されるため推奨されます。 汎用的な多言語使用には、Noto SansまたはDejaVu Sansが良い代替品です。)


検索可能なPDFをバイトまたはストリームとしてエクスポートするにはどうすればよいですか?

検索可能な PDF の出力は、それぞれ SaveAsSearchablePdfBytes および SaveAsSearchablePdfStream メソッドを使用して、バイトまたはストリームとして処理することもできます。 以下のコード例は、これらのメソッドを活用する方法を示しています。

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

// Export searchable PDF stream
Stream pdfStream = ocrResult.SaveAsSearchablePdfStream();
$vbLabelText   $csharpLabel

これらの出力オプションは、ファイルシステムへのアクセスが制限される可能性のあるクラウドストレージサービス、データベース、またはWebアプリケーションと統合する場合に特に便利です。 以下は、実用的なアプリケーションを示す拡大例です:

using IronOcr;
using System.IO;

public class SearchablePdfExporter
{
    public async Task ProcessAndUploadPdf(string inputPath)
    {
        var ocr = new IronTesseract
        {
            Configuration = { RenderSearchablePdf = true }
        };

        // Process the input
        using var input = new OcrImageInput(inputPath);
        var result = ocr.Read(input);

        // Option 1: Save to database as byte array
        byte[] pdfBytes = result.SaveAsSearchablePdfBytes();
        // Store pdfBytes in database BLOB field

        // Option 2: Upload to cloud storage using stream
        using (Stream pdfStream = result.SaveAsSearchablePdfStream())
        {
            // Upload stream to Azure Blob Storage, AWS S3, etc.
            await UploadToCloudStorage(pdfStream, "searchable-output.pdf");
        }

        // Option 3: Return as web response
        // return File(pdfBytes, "application/pdf", "searchable.pdf");
    }

    private async Task UploadToCloudStorage(Stream stream, string fileName)
    {
        // Cloud upload implementation
    }
}
using IronOcr;
using System.IO;

public class SearchablePdfExporter
{
    public async Task ProcessAndUploadPdf(string inputPath)
    {
        var ocr = new IronTesseract
        {
            Configuration = { RenderSearchablePdf = true }
        };

        // Process the input
        using var input = new OcrImageInput(inputPath);
        var result = ocr.Read(input);

        // Option 1: Save to database as byte array
        byte[] pdfBytes = result.SaveAsSearchablePdfBytes();
        // Store pdfBytes in database BLOB field

        // Option 2: Upload to cloud storage using stream
        using (Stream pdfStream = result.SaveAsSearchablePdfStream())
        {
            // Upload stream to Azure Blob Storage, AWS S3, etc.
            await UploadToCloudStorage(pdfStream, "searchable-output.pdf");
        }

        // Option 3: Return as web response
        // return File(pdfBytes, "application/pdf", "searchable.pdf");
    }

    private async Task UploadToCloudStorage(Stream stream, string fileName)
    {
        // Cloud upload implementation
    }
}
$vbLabelText   $csharpLabel

パフォーマンスの考慮事項

大量のドキュメントを処理する場合は、マルチスレッド OCR 操作を実装してスループットを向上させることを検討してください。 IronOCRは同時処理をサポートしており、複数のドキュメントを同時に扱うことができます:

using IronOcr;
using System.Threading.Tasks;
using System.Collections.Concurrent;

public class BatchPdfProcessor
{
    private readonly IronTesseract _ocr;

    public BatchPdfProcessor()
    {
        _ocr = new IronTesseract
        {
            Configuration = 
            {
                RenderSearchablePdf = true,
                // Configure for optimal performance
                Language = OcrLanguage.English
            }
        };
    }

    public async Task ProcessBatchAsync(string[] filePaths)
    {
        var results = new ConcurrentBag<(string source, string output)>();

        await Parallel.ForEachAsync(filePaths, async (filePath, ct) =>
        {
            using var input = new OcrImageInput(filePath);
            var result = _ocr.Read(input);

            string outputPath = Path.ChangeExtension(filePath, ".searchable.pdf");
            result.SaveAsSearchablePdf(outputPath);

            results.Add((filePath, outputPath));
        });

        Console.WriteLine($"Processed {results.Count} files");
    }
}
using IronOcr;
using System.Threading.Tasks;
using System.Collections.Concurrent;

public class BatchPdfProcessor
{
    private readonly IronTesseract _ocr;

    public BatchPdfProcessor()
    {
        _ocr = new IronTesseract
        {
            Configuration = 
            {
                RenderSearchablePdf = true,
                // Configure for optimal performance
                Language = OcrLanguage.English
            }
        };
    }

    public async Task ProcessBatchAsync(string[] filePaths)
    {
        var results = new ConcurrentBag<(string source, string output)>();

        await Parallel.ForEachAsync(filePaths, async (filePath, ct) =>
        {
            using var input = new OcrImageInput(filePath);
            var result = _ocr.Read(input);

            string outputPath = Path.ChangeExtension(filePath, ".searchable.pdf");
            result.SaveAsSearchablePdf(outputPath);

            results.Add((filePath, outputPath));
        });

        Console.WriteLine($"Processed {results.Count} files");
    }
}
$vbLabelText   $csharpLabel

高度な設定オプション

より高度なシナリオでは、詳細なTesseract設定を活用して、特定のドキュメントタイプや言語向けにOCRエンジンを微調整することができます:

var advancedOcr = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        TesseractVariables = new Dictionary<string, object>
        {
            { "preserve_interword_spaces", 1 },
            { "tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" }
        },
        PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
    },
    Language = OcrLanguage.EnglishBest
};
var advancedOcr = new IronTesseract
{
    Configuration = 
    {
        RenderSearchablePdf = true,
        TesseractVariables = new Dictionary<string, object>
        {
            { "preserve_interword_spaces", 1 },
            { "tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" }
        },
        PageSegmentationMode = TesseractPageSegmentationMode.SingleColumn
    },
    Language = OcrLanguage.EnglishBest
};
$vbLabelText   $csharpLabel

まとめ

IronOCRで検索可能なPDFを作成するのは簡単で柔軟です。 単一画像、複数ページの文書、ReadPhoto を使用した写真、または ReadDocumentAdvanced を使用した高度な文書スキャンなど、どのような処理が必要な場合でも、このライブラリはさまざまな形式で検索可能な PDF を生成するための強力な方法を提供します。 精度に関して、標準MLモデルと拡張MLモデルのどちらかを選択するには、ModelType パラメータを使用します。 ファイル、バイト、ストリームとしてエクスポートできるため、デスクトップアプリケーションからクラウドベースのサービスまで、あらゆるアプリケーションアーキテクチャに適応できます。

より高度な OCR シナリオについては、包括的なコード例を参照するか、APIドキュメントで詳細なメソッドのシグネチャとオプションを参照してください。

よくある質問

C#でスキャン画像から検索可能なPDFを作成するには?

IronOCRはスキャンした画像から検索可能なPDFを簡単に作成できます。設定でRenderSearchablePdfをtrueに設定し、入力画像にRead()メソッドを使用し、希望の出力パスを指定してSaveAsSearchablePdf()を呼び出すだけです。IronOCRは画像に対してOCRを実行し、選択可能で検索可能なテキストを元の画像に重ねたPDFを生成します。

検索可能なPDFに変換できるファイル形式は?

IronOCRはJPG、PNG、TIFF、既存のPDFドキュメントを含む様々な画像フォーマットを検索可能なPDFに変換することができます。このライブラリは単一ページの画像とTIFFファイルのような複数ページのドキュメントの両方をサポートし、自動的にすべてのページを処理し、出力される検索可能なPDFの適切なページ順序を維持します。

検索可能なPDFをファイルではなく、バイト配列やストリームとしてエクスポートできますか?

はい、IronOCRは検索可能なPDFを複数のフォーマットでエクスポートすることができます。SaveAsSearchablePdf()を使ってファイルに直接保存するだけでなく、OCR結果をバイト配列やストリームとしてエクスポートすることもできます。

検索可能なPDFを作成するために最低限必要なコードは何ですか?

IronOCRで検索可能なPDFを作成するのは、たった1行のコードで可能です: new IronOcr.IronTesseract { Configuration = { RenderSearchablePdf = true }.}.Read(new IronOcr.OcrImageInput("file.jpg")).SaveAsSearchablePdf("searchable.pdf").これはIronOCRの合理化されたAPI設計を示している。

検索可能PDFのテキストオーバーレイはどのように機能しますか?

IronOCRは、認識されたテキストをPDFの原画像の上に不可視のオーバーレイとして自動的に配置します。これにより、テキストと画像の正確なマッピングが保証され、ユーザーは元の文書の外観を維持したままテキストを選択、検索することができます。このライブラリは、特殊なフォントと位置決めアルゴリズムを使用してこれを実現します。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

レビュー済み
Jeff Fritz
Jeffrey T. Fritz
プリンシパルプログラムマネージャー - .NETコミュニティチーム
Jeffはまた、.NETとVisual Studioチームのプリンシパルプログラムマネージャーです。彼は.NET Conf仮想会議シリーズのエグゼクティブプロデューサーであり、週に二回放送される開発者向けライブストリーム『Fritz and Friends』のホストを務め、テクノロジーについて話すことや視聴者と一緒にコードを書くことをしています。Jeffはワークショップ、プレゼンテーション、およびMicrosoft Build、Microsoft Ignite、.NET Conf、Microsoft MVPサミットを含む最大のMicrosoft開発者イベントのコンテンツを企画しています。
準備はできましたか?
Nuget ダウンロード 5,556,263 | バージョン: 2026.3 リリース
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronOcr
サンプルを実行 あなたの画像が検索可能なテキストになるのをご覧ください。