IronOCRでの大きなPDFファイルの取り扱い

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

複数ページの大きなPDFにOCRを実行すると、メモリが急増し、プロセスがクラッシュする可能性があります。 通常の原因は、すべてのページを一度にメモリに読み込むことです。

System.OutOfMemoryException

OcrInput.LoadPdf("large.pdf")は一度にすべてのページを読み取ります。 IronOCRのイメージングシステムはすべてのページを同時にレンダリングし、DPIがOutOfMemoryExceptionまたはリソースデッドロックを引き起こすことを意味します。

解決策

解決策はPDFを1ページずつ処理し、レンダリングDPIをテキスト品質が許す限り低く保つことです。

1. ページ数を取得する

文書をIronPdf.PdfDocument(または他の任意のPDFライブラリ)で開き、ページ数を読み取ります。

using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
Imports IronPdf

Using pdf = IronPdf.PdfDocument.FromFile(pdfPath)
    Dim pageCount = pdf.PageCount
End Using
$vbLabelText   $csharpLabel

2. 一度に1ページだけ読み込む

ページをループし、OcrInput.LoadPdfPage("file.pdf", pageIndex, dpi)を使用して各ページを個別に読み込みます。 視覚品質が維持されている場合は、メモリを節約するために、DPIを80まで下げます。

3. 読み取りと連結

各1ページ入力をStringBuilderに追加します。

var ocr = new IronTesseract();
var pdfPath = "large.pdf";
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
var textBuilder = new StringBuilder();
for (int i = 0; i < pageCount; i++)
{
    using var input = new OcrInput();
    input.LoadPdfPage(pdfPath, i, 80);
    var result = ocr.Read(input);
    textBuilder.Append(result.Text);
    textBuilder.Append(' '); // Add space between pages
}
Console.WriteLine(textBuilder.ToString().Trim());
var ocr = new IronTesseract();
var pdfPath = "large.pdf";
using var pdf = IronPdf.PdfDocument.FromFile(pdfPath);
var pageCount = pdf.PageCount;
var textBuilder = new StringBuilder();
for (int i = 0; i < pageCount; i++)
{
    using var input = new OcrInput();
    input.LoadPdfPage(pdfPath, i, 80);
    var result = ocr.Read(input);
    textBuilder.Append(result.Text);
    textBuilder.Append(' '); // Add space between pages
}
Console.WriteLine(textBuilder.ToString().Trim());
Imports IronOcr
Imports IronPdf
Imports System.Text

Dim ocr As New IronTesseract()
Dim pdfPath As String = "large.pdf"
Using pdf = PdfDocument.FromFile(pdfPath)
    Dim pageCount As Integer = pdf.PageCount
    Dim textBuilder As New StringBuilder()
    For i As Integer = 0 To pageCount - 1
        Using input As New OcrInput()
            input.LoadPdfPage(pdfPath, i, 80)
            Dim result = ocr.Read(input)
            textBuilder.Append(result.Text)
            textBuilder.Append(" ") ' Add space between pages
        End Using
    Next
    Console.WriteLine(textBuilder.ToString().Trim())
End Using
$vbLabelText   $csharpLabel

OcrInputがページの画像データを解放するため、ページ数でメモリが増加せず、ループ中もメモリが平坦になります。

オプション: まずPDFを圧縮する

非常に複雑または画像が多いファイルでは、ページごとのループがまだ困難になることがあります。 IronPDFのCompress APIを使用してOCR前にPDFを圧縮し、IronOCRが処理する画像データを削減します。 これは特にスキャンされたまたは画像が多いドキュメントで効果を発揮します。

直接ストリームに圧縮し、そのストリームをOcrInputにロードします。

var pdf = PdfDocument.FromFile(pdfPath);
var stream = pdf.CompressPdfToStream(CompressStructTree: true);
var ocrTesseract = new IronTesseract();
using var ocrInput = new OcrInput();
ocrInput.LoadPdfPage(stream, 1);
var pdf = PdfDocument.FromFile(pdfPath);
var stream = pdf.CompressPdfToStream(CompressStructTree: true);
var ocrTesseract = new IronTesseract();
using var ocrInput = new OcrInput();
ocrInput.LoadPdfPage(stream, 1);
Imports IronTesseract

Dim pdf = PdfDocument.FromFile(pdfPath)
Dim stream = pdf.CompressPdfToStream(CompressStructTree:=True)
Dim ocrTesseract = New IronTesseract()
Using ocrInput As New OcrInput()
    ocrInput.LoadPdfPage(stream, 1)
End Using
$vbLabelText   $csharpLabel

PDFに埋め込まれた画像がある場合、圧縮時にJpegQualityを下げてデータをさらに縮小します。

var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
var pdf = PdfDocument.FromFile(@"D:\hugePdf.pdf");
var stream = pdf.CompressPdfToStream(JpegQuality: 75, CompressStructTree: true);
Imports System

Dim pdf = PdfDocument.FromFile("D:\hugePdf.pdf")
Dim stream = pdf.CompressPdfToStream(JpegQuality:=75, CompressStructTree:=True)
$vbLabelText   $csharpLabel

警告ループの反復に同じMemoryStreamを再利用する場合 各読み取り前に位置を0にリセットします。 ストリームは一度読み取られると消費されるため、位置がリセットされていないと読み取りに失敗します。

デバッグのヒント

  • DPIを下げる: 100までの範囲でメモリ使用量を著しく削減しますが、テキストは依然として読みやすいです。
  • 大きなファイルでLoadPdf()を避ける:本当に小さい場合以外は、ドキュメント全体を一度に読み取らないでください。
  • 早めに開放する:次のusingを包むことでページ間でメモリが解放されます。
  • 慎重に並列化:余裕のあるメモリとCPUを持つマシンでのみページを同時実行します; 大きなPDFでは逆効果になることがあります。
Curtis Chau
テクニカルライター

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

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

準備はできましたか?
Nuget ダウンロード 6,136,090 | バージョン: 2026.7 リリースされたばかり
Still Scrolling Icon

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

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