IRONPDFの使用

C# で PDF テーブルを読む方法

PDFドキュメントから構造化されたテーブルデータを抽出することは、データ分析、レポート作成、または他のシステムへの情報の統合において、C#開発者にとって頻繁に必要となる重要な作業です。 しかし、PDFは主に一貫した視覚的なプレゼンテーションを目的として設計されており、単純なデータ抽出には向いていません。 これは、PDFファイルからC#でプログラム的にテーブルを読み込むことを特に困難にします。テーブルは単純なテキストベースのグリッドからセル結合された複雑なレイアウト、またはスキャンされた文書の画像として埋め込まれたテーブルに至るまで、さまざまに変化する可能性があるためです。

このガイドは、IronPDFを使用した PDF テーブル抽出のアプローチに関する包括的な C# チュートリアルを提供します。 私たちは主に、IronPDFの強力なテキスト抽出機能を活用して、テキストベースのPDFから表形式のデータにアクセスし、それを解析する方法を探ります。 この方法の有効性を議論し、解析のための戦略を提供し、抽出された情報の処理に関する洞察を提供します。 さらに、スキャンされたPDFを含む、より複雑なシナリオに対処するための戦略についても触れます。


PDFから表データを抽出するためのC#の主要なステップ

  1. PDF処理用のIronPDF C#ライブラリをインストールします (https://nuget.org/packages/IronPdf/)。

  2. (オプションのデモステップ)IronPDF の RenderHtmlAsPdf を使用して、HTML 文字列からテーブル付きのサンプル PDF を作成します。 (セクションを参照: (デモステップ)表データでPDFドキュメントを作成する)

  3. 任意のPDFドキュメントをロードし、ExtractAllTextメソッドを使用してその生テキストコンテンツを取得します。 (セクション参照: PDFからテーブルデータを含む全テキストを抽出する)

  4. 抽出されたテキストを解析し、表の行とセルを識別するC#のロジックを実装します。 (「C#でテーブルデータを再構築するために解析された抽出テキスト」を参照)

  5. 構造化された表データを出力するか、後で使用するためにCSVファイルに保存します。 (「C#でテーブルデータを再構築するために解析された抽出テキスト」を参照)

  6. スキャンされたPDFに対してOCRのような高度な技術を検討してください(後述)。


IronPDF - C# PDFライブラリ

IronPDFは、.NETでPDFを操作するためのC# .NETライブラリソリューションであり、開発者がソフトウェアアプリケーションでPDFドキュメントを簡単に読み込み、作成し、編集するのを支援します。 (https://ironpdf.com/)。 その強力なChromiumエンジンは、HTMLからPDFドキュメントを高精度かつ高速でレンダリングします。 それにより、開発者はさまざまな形式からPDFへ、またはその逆方向へシームレスに変換することができます。 これは最新の.NETフレームワークである.NET 7、.NET 6、5、4、.NET Core、およびStandardをサポートしています。

さらに、IronPDF .NET API は、開発者が PDF を操作および編集し、ヘッダーやフッターを追加することを可能にし、そして重要なのは、PDF からテキスト、画像、そして(これから見るように)表データを簡単に抽出することです。

いくつかの重要な機能には次のものがあります:

IronPDFライブラリを使用してC#でテーブルデータを抽出する手順

PDFドキュメントからテーブルデータを抽出するために、C#プロジェクトを設定します:

  1. Visual Studio: Visual Studio(例:2022)をインストールしてください。 そうでない場合は、Visual Studio のウェブサイト (https://visualstudio.microsoft.com/downloads/) からダウンロードしてください。

  2. プロジェクトを作成:

    • Visual Studio 2022 を開き、新しいプロジェクトの作成をクリックします。

    C#でPDFテーブルを読む方法、図1: Visual Studioのスタート画面

    Visual Studio のスタート画面

    • "コンソール アプリ"(またはお好みのC#プロジェクト タイプ)を選択し、次へをクリックします。

    C#でPDFテーブルを読む方法、図2: Visual Studioで新しいコンソールアプリケーションを作成

    Visual Studioで新しいコンソールアプリケーションを作成する

    • プロジェクトに名前を付けて(例:「ReadPDFTableDemo」)、次へをクリックします。

    C#でPDFテーブルを読み取る方法、図3: 新しく作成されたアプリケーションの構成

    新しく作成したアプリケーションを設定する

    • 希望する .NET Framework を選択してください (.NET 6 以降など)。

    C#でPDFテーブルを読む方法、図4: .NET Frameworkを選択

    .NET Framework を選択

    • 作成をクリックします。 コンソールプロジェクトが作成されます。
  3. IronPDFをインストールする:

    • Visual Studio NuGet パッケージ マネージャーの使用:

      • ソリューションエクスプローラーでプロジェクトを右クリックし、「NuGet パッケージの管理...」を選択します。

    C#でPDFテーブルを読み取る方法, 図5: ツール & NuGetパッケージの管理

    ツールとNuGetパッケージの管理

    • NuGet パッケージ マネージャーで「IronPdf」を検索し、「インストール」をクリックします。

    PDFテーブルをC#で読み取る方法、図6: ツール&NuGetパッケージの管理

    ツールとNuGetパッケージの管理

(デモステップ) テーブルデータを使用してPDFドキュメントを作成する

このチュートリアルでは、最初にHTML文字列から単純なテーブルを含むサンプルPDFを作成します。 これは、抽出プロセスを示すための既知のPDF構造を提供します。 実際のシナリオでは、既存のPDFファイルをロードします。

IronPDFの名前空間を追加し、オプションでライセンスキーを設定します(IronPDFは開発には無料で使用できますが、透かしなしで商業用に展開するにはライセンスが必要です)。

using IronPdf;
using System;       // For StringSplitOptions, Console
using System.IO;    // For StreamWriter

// Apply your license key if you have one. Otherwise, IronPDF runs in trial mode.
// License.LicenseKey = "YOUR-TRIAL/PURCHASED-LICENSE-KEY";
using IronPdf;
using System;       // For StringSplitOptions, Console
using System.IO;    // For StreamWriter

// Apply your license key if you have one. Otherwise, IronPDF runs in trial mode.
// License.LicenseKey = "YOUR-TRIAL/PURCHASED-LICENSE-KEY";
Imports IronPdf
Imports System ' For StringSplitOptions, Console
Imports System.IO ' For StreamWriter

' Apply your license key if you have one. Otherwise, IronPDF runs in trial mode.
' License.LicenseKey = "YOUR-TRIAL/PURCHASED-LICENSE-KEY";
$vbLabelText   $csharpLabel

こちらはサンプルテーブルのHTML文字列です:

string HTML = "<html>" +
        "<style>" +
            "table, th, td {" +
                "border:1px solid black;" +
            "}" +
        "</style>" +
        "<body>" +
            "<h1>A Simple table example</h1>" + // Corrected typo: h1 not h2
            "<table>" +
                "<tr>" +
                    "<th>Company</th>" +
                    "<th>Contact</th>" +
                    "<th>Country</th>" +
               "</tr>" +
                "<tr>" +
                    "<td>Alfreds Futterkiste</td>" +
                    "<td>Maria Anders</td>" +
                    "<td>Germany</td>" +
                "</tr>" +
                "<tr>" +
                    "<td>Centro comercial Moctezuma</td>" +
                    "<td>Francisco Chang</td>" +
                    "<td>Mexico</td>" +
                "</tr>" +
            "</table>" +
            "<p>To understand the example better, we have added borders to the table.</p>" +
        "</body>" +
        "</html>";
string HTML = "<html>" +
        "<style>" +
            "table, th, td {" +
                "border:1px solid black;" +
            "}" +
        "</style>" +
        "<body>" +
            "<h1>A Simple table example</h1>" + // Corrected typo: h1 not h2
            "<table>" +
                "<tr>" +
                    "<th>Company</th>" +
                    "<th>Contact</th>" +
                    "<th>Country</th>" +
               "</tr>" +
                "<tr>" +
                    "<td>Alfreds Futterkiste</td>" +
                    "<td>Maria Anders</td>" +
                    "<td>Germany</td>" +
                "</tr>" +
                "<tr>" +
                    "<td>Centro comercial Moctezuma</td>" +
                    "<td>Francisco Chang</td>" +
                    "<td>Mexico</td>" +
                "</tr>" +
            "</table>" +
            "<p>To understand the example better, we have added borders to the table.</p>" +
        "</body>" +
        "</html>";
HTML

次に、ChromePdfRendererを使用してこのHTMLからPDFを作成します:

var renderer = new ChromePdfRenderer();
PdfDocument pdfDocument = renderer.RenderHtmlAsPdf(HTML);
pdfDocument.SaveAs("table_example.pdf");
Console.WriteLine("Sample PDF 'table_example.pdf' created.");
var renderer = new ChromePdfRenderer();
PdfDocument pdfDocument = renderer.RenderHtmlAsPdf(HTML);
pdfDocument.SaveAs("table_example.pdf");
Console.WriteLine("Sample PDF 'table_example.pdf' created.");
Dim renderer = New ChromePdfRenderer()
Dim pdfDocument As PdfDocument = renderer.RenderHtmlAsPdf(HTML)
pdfDocument.SaveAs("table_example.pdf")
Console.WriteLine("Sample PDF 'table_example.pdf' created.")
$vbLabelText   $csharpLabel

SaveAs メソッドはPDFを保存します。 生成されたtable_example.pdfはこのように見えます(HTMLに基づく概念的な画像):

C#でPDFテーブルを読む方法、図7: NuGetパッケージマネージャーUIでIronPDFを検索

NuGet パッケージ マネージャー UIで IronPDF を検索する

PDFから表データを含むすべてのテキストを抽出

テーブルデータを抽出するには、まずPDF(新しく作成したものまたは既存のPDF)を読み込み、ExtractAllText メソッドを使用します。 このメソッドはPDFページからすべてのテキストコンテンツを取得します。

// Load the PDF (if you just created it, it's already loaded in pdfDocument)
// If loading an existing PDF:
// PdfDocument pdfDocument = PdfDocument.FromFile("table_example.pdf"); 
// Or use the one created above:
string allText = pdfDocument.ExtractAllText();
// Load the PDF (if you just created it, it's already loaded in pdfDocument)
// If loading an existing PDF:
// PdfDocument pdfDocument = PdfDocument.FromFile("table_example.pdf"); 
// Or use the one created above:
string allText = pdfDocument.ExtractAllText();
' Load the PDF (if you just created it, it's already loaded in pdfDocument)
' If loading an existing PDF:
' PdfDocument pdfDocument = PdfDocument.FromFile("table_example.pdf"); 
' Or use the one created above:
Dim allText As String = pdfDocument.ExtractAllText()
$vbLabelText   $csharpLabel

allText 変数には、現在PDFからの全テキストコンテンツが格納されています。 生データを抽出して表示できます:

Console.WriteLine("\n--- Raw Extracted Text ---");
Console.WriteLine(allText);
Console.WriteLine("\n--- Raw Extracted Text ---");
Console.WriteLine(allText);
Imports Microsoft.VisualBasic

Console.WriteLine(vbLf & "--- Raw Extracted Text ---")
Console.WriteLine(allText)
$vbLabelText   $csharpLabel

C#でPDFテーブルを読み取る方法、図8:テキストを抽出するPDFファイル

テキストを抽出するPDFファイル

C#で抽出されたテキストを解析して表データを再構築する

抽出された生のテキストを使用して、次の課題はこの文字列を解析し、表形式のデータを特定して構造化することです。 この手順は、PDF内の表の一貫性と形式に大きく依存します。

一般的なパーシング戦略:

  1. 行区切りを特定する: 改行文字 (\n または \r\n) は一般的な行区切りです。

  2. 列の区切り文字を識別する: 行内のセルは、複数のスペース、タブ、または特定の既知の文字(例えば ')で区切られることがあります。 ' or ';'). 場合によっては、列が視覚的に整列していても明確なテキスト区切りがない場合、一貫したスペースパターンに基づいて構造を推測することがありますが、これはより複雑です。

  3. 非テーブルコンテンツのフィルタリング: ExtractAllText メソッドはすべてのテキストを取得します。 実際にテーブルを構成するテキストを特定するためのロジックが必要です。おそらく、ヘッダーのキーワードを探すか、前後のテキストをスキップすることで達成できるでしょう。

    C# の String.Split メソッドは、これに対する基本的なツールです。 こちらはサンプルからテーブル行のみを抽出し、ピリオドを含む行をフィルタリングする例です(この特定の例に対する簡単なヒューリスティックです):

Console.WriteLine("\n--- Parsed Table Data (Simple Heuristic) ---");
string[] textLines = allText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in textLines)
{
    // Simple filter: skip lines with a period, assuming they are not table data in this example
    // and skip lines that are too short or headers if identifiable
    if (line.Contains(".") 
 line.Contains("A Simple table example") 
 line.Length < 5) 
    {
        continue;
    }
    else
    {
        // Further split line into cells based on expected delimiters (e.g., multiple spaces)
        // This part requires careful adaptation to your PDF's table structure
        // Example: string[] cells = line.Split(new[] { "  ", "\t" }, StringSplitOptions.None);
        Console.WriteLine(line); // For now, just print the filtered line
    }
}
Console.WriteLine("\n--- Parsed Table Data (Simple Heuristic) ---");
string[] textLines = allText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in textLines)
{
    // Simple filter: skip lines with a period, assuming they are not table data in this example
    // and skip lines that are too short or headers if identifiable
    if (line.Contains(".") 
 line.Contains("A Simple table example") 
 line.Length < 5) 
    {
        continue;
    }
    else
    {
        // Further split line into cells based on expected delimiters (e.g., multiple spaces)
        // This part requires careful adaptation to your PDF's table structure
        // Example: string[] cells = line.Split(new[] { "  ", "\t" }, StringSplitOptions.None);
        Console.WriteLine(line); // For now, just print the filtered line
    }
}
Imports Microsoft.VisualBasic

Console.WriteLine(vbLf & "--- Parsed Table Data (Simple Heuristic) ---")
Dim textLines() As String = allText.Split( { ControlChars.Cr, ControlChars.Lf }, StringSplitOptions.RemoveEmptyEntries)
For Each line As String In textLines
	' Simple filter: skip lines with a period, assuming they are not table data in this example
	' and skip lines that are too short or headers if identifiable
	If line.Contains(".") line.Contains("A Simple table example") line.Length < 5 Then
		Continue For
	Else
		' Further split line into cells based on expected delimiters (e.g., multiple spaces)
		' This part requires careful adaptation to your PDF's table structure
		' Example: string[] cells = line.Split(new[] { "  ", "\t" }, StringSplitOptions.None);
		Console.WriteLine(line) ' For now, just print the filtered line
	End If
Next line
$vbLabelText   $csharpLabel

このコードはテキストを行に分割します。 if 条件は、この特定の例の非テキスト部分への非常に基本的なフィルターです。 実際のシナリオでは、テーブルの行とセルを正確に特定して解析するためのより堅牢なロジックが必要です。

単純なフィルタリングされたテキストの出力:

C#でPDFテーブルを読む方法、図9: コンソールに抽出されたテキストが表示される

コンソールには抽出されたテキストが表示されます

テキストパース方法の重要な考慮事項:

  • 最適な用途: 簡単で一貫した表構造と明確なテキスト区切り文字を含むテキストベースのPDF。
  • 制限事項: この方法は以下の点で問題が生じる可能性があります:

    • 結合されたセルや複雑なネスト構造を持つテーブル。

    • 列がテキストの区切りではなく視覚的なスペーシングで定義されているテーブル。

    • OCRを必要とする画像として埋め込まれた表。

    • PDF生成のバリエーションにより、テキスト抽出順序が不一致になることがあります。

    フィルターされた行(理想的には表の行を表しています)をCSVファイルに保存できます。

using (StreamWriter file = new StreamWriter("parsed_table_data.csv", false))
{
    file.WriteLine("Company,Contact,Country"); // Write CSV Header
    foreach (string line in textLines)
    {
        if (line.Contains(".") 
 line.Contains("A Simple table example") 
 line.Length < 5)
        {
            continue;
        }
        else
        {
            // For a real CSV, you'd split 'line' into cells and join with commas
            // E.g., string[] cells = line.Split(new[] {"  "}, StringSplitOptions.RemoveEmptyEntries);
            // string csvLine = string.Join(",", cells);
            // file.WriteLine(csvLine);
            file.WriteLine(line.Replace("  ", ",").Trim()); // Basic replacement for this example
        }
    }
}
Console.WriteLine("\nFiltered table data saved to parsed_table_data.csv");
using (StreamWriter file = new StreamWriter("parsed_table_data.csv", false))
{
    file.WriteLine("Company,Contact,Country"); // Write CSV Header
    foreach (string line in textLines)
    {
        if (line.Contains(".") 
 line.Contains("A Simple table example") 
 line.Length < 5)
        {
            continue;
        }
        else
        {
            // For a real CSV, you'd split 'line' into cells and join with commas
            // E.g., string[] cells = line.Split(new[] {"  "}, StringSplitOptions.RemoveEmptyEntries);
            // string csvLine = string.Join(",", cells);
            // file.WriteLine(csvLine);
            file.WriteLine(line.Replace("  ", ",").Trim()); // Basic replacement for this example
        }
    }
}
Console.WriteLine("\nFiltered table data saved to parsed_table_data.csv");
Imports Microsoft.VisualBasic

Using file As New StreamWriter("parsed_table_data.csv", False)
	file.WriteLine("Company,Contact,Country") ' Write CSV Header
	For Each line As String In textLines
		If line.Contains(".") line.Contains("A Simple table example") line.Length < 5 Then
			Continue For
		Else
			' For a real CSV, you'd split 'line' into cells and join with commas
			' E.g., string[] cells = line.Split(new[] {"  "}, StringSplitOptions.RemoveEmptyEntries);
			' string csvLine = string.Join(",", cells);
			' file.WriteLine(csvLine);
			file.WriteLine(line.Replace("  ", ",").Trim()) ' Basic replacement for this example
		End If
	Next line
End Using
Console.WriteLine(vbLf & "Filtered table data saved to parsed_table_data.csv")
$vbLabelText   $csharpLabel

C# におけるより複雑な PDF テーブル抽出のための戦略

複雑または画像ベースのPDFテーブルからデータを抽出するには、単純なテキストパースよりも高度な技術が必要となることが多いです。 IronPDFは、役立つ機能を提供します。

  • IronOCRの機能を使ったスキャンされた表の処理: 画像内に表がある場合(例:スキャンされたPDF)、ExtractAllText()だけではそれらをキャプチャできません。 IronOCRのテキスト検出機能は、これらの画像をまずテキストに変換できます。
// Conceptual OCR usage (refer to IronOCR's documentation for detailed implementation)
// Install Package IronOcr
using IronOcr;
using (var ocrInput = new OcrInput("scanned_pdf_with_table.pdf"))
{
     ocrInput.TargetDPI = 300; // Good DPI for OCR accuracy
     var ocrResult = new IronOcr().Read(ocrInput);
     string ocrExtractedText = ocrResult.Text;
     // Now, apply parsing logic to 'ocrExtractedText'
     Console.WriteLine("\n--- OCR Extracted Text for Table Parsing ---");
     Console.WriteLine(ocrExtractedText);
}
// Conceptual OCR usage (refer to IronOCR's documentation for detailed implementation)
// Install Package IronOcr
using IronOcr;
using (var ocrInput = new OcrInput("scanned_pdf_with_table.pdf"))
{
     ocrInput.TargetDPI = 300; // Good DPI for OCR accuracy
     var ocrResult = new IronOcr().Read(ocrInput);
     string ocrExtractedText = ocrResult.Text;
     // Now, apply parsing logic to 'ocrExtractedText'
     Console.WriteLine("\n--- OCR Extracted Text for Table Parsing ---");
     Console.WriteLine(ocrExtractedText);
}
' Conceptual OCR usage (refer to IronOCR's documentation for detailed implementation)
' Install Package IronOcr
Imports Microsoft.VisualBasic
Imports IronOcr
Using ocrInput As New OcrInput("scanned_pdf_with_table.pdf")
	 ocrInput.TargetDPI = 300 ' Good DPI for OCR accuracy
	 Dim ocrResult = (New IronOcr()).Read(ocrInput)
	 Dim ocrExtractedText As String = ocrResult.Text
	 ' Now, apply parsing logic to 'ocrExtractedText'
	 Console.WriteLine(vbLf & "--- OCR Extracted Text for Table Parsing ---")
	 Console.WriteLine(ocrExtractedText)
End Using
$vbLabelText   $csharpLabel

詳細なガイダンスについては、IronOCR ドキュメント (https://ironsoftware.com/csharp/ocr/) をご覧ください。 OCR の後、生成されたテキスト文字列を解析します。

  • 座標に基づくテキスト抽出(上級): IronPDF の ExtractAllText() はテキストストリームを提供しますが、シナリオによっては各テキストスニペットの x, y 座標を知ることが有益な場合があります。 IronPDFが境界ボックス情報付きでテキストを取得するAPIを提供する場合(最新のドキュメントを確認してください)、視覚的な配置に基づいてテーブルを再構築するためのより洗練された空間解析が可能になるかもしれません。
  • PDFを他の形式に変換する: IronPDFは、PDFをHTMLのような構造化形式に変換できます。 しばしば、HTMLテーブルを解析する方が、生のPDFテキストを解析するよりも簡単です。
PdfDocument pdfToConvert = PdfDocument.FromFile("your_document.pdf");
string htmlOutput = pdfToConvert.ToHtmlString();
// Then use an HTML parsing library (e.g., HtmlAgilityPack) to extract tables from htmlOutput.
PdfDocument pdfToConvert = PdfDocument.FromFile("your_document.pdf");
string htmlOutput = pdfToConvert.ToHtmlString();
// Then use an HTML parsing library (e.g., HtmlAgilityPack) to extract tables from htmlOutput.
Dim pdfToConvert As PdfDocument = PdfDocument.FromFile("your_document.pdf")
Dim htmlOutput As String = pdfToConvert.ToHtmlString()
' Then use an HTML parsing library (e.g., HtmlAgilityPack) to extract tables from htmlOutput.
$vbLabelText   $csharpLabel
  • パターン認識と正規表現: 非常に予測可能なパターンを持つが区切り文字が不定なテーブルの場合、抽出されたテキストに複雑な正規表現を適用することで、テーブルデータを分離できる場合があります。

    適切な戦略を選ぶことは、ソースPDFの複雑さと一貫性に依存します。 多くの一般的なビジネス文書でテキストベースの表を使用する際、IronPDFのExtractAllTextを賢いC#パーシングロジックと組み合わせると非常に効果的です。画像ベースの表の場合、そのOCR機能は不可欠です。

要約

この記事では、主にExtractAllText()メソッドとその後の文字列解析を利用し、IronPDF を使用して C# で PDF ドキュメントからテーブルデータを抽出する方法を示しました。 このアプローチはテキストベースのテーブルに対して強力である一方で、画像ベースのテーブルのようなより複雑なシナリオについては、IronPDFのOCR機能を使用するか、まずPDFを他の形式に変換することで対応できることを私たちは確認しました。

IronPDFは.NET開発者向けに多用途なツールキットを提供し、作成および編集から包括的なデータ抽出まで、多くのPDF関連タスクを簡素化します。 ExtractTextFromPageのようなページ固有の抽出メソッドを提供し、DOCXからPDFへの変換をサポートします。

IronPDF は開発用に無料で提供されており、完全な商用機能を試験できる無料の試用ライセンスを提供しています。 本番導入のために、さまざまなライセンスオプションが利用可能です。

詳細および高度な使用例については、公式のIronPDFドキュメントと例をご覧ください (https://ironpdf.com/)

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
QRコードをPDFに変換する方法
次へ >
C# チュートリアル: IronPDF で PDF テキスト コンテンツ ビューアを構築する (Windows フォーム)