透かしなしで本番環境でテストしてください。
必要な場所で動作します。
30日間、完全に機能する製品をご利用いただけます。
数分で稼働させることができます。
製品トライアル期間中にサポートエンジニアリングチームへの完全アクセス
PDFドキュメントから構造化されたテーブルデータを抽出することは、データ分析、レポート作成、または他のシステムへの情報の統合において、C#開発者にとって頻繁に必要となる重要な作業です。 しかし、PDFは主に一貫した視覚的なプレゼンテーションを目的として設計されており、単純なデータ抽出には向いていません。 これは、PDFファイルからC#でプログラム的にテーブルを読み込むことを特に困難にします。テーブルは単純なテキストベースのグリッドからセル結合された複雑なレイアウト、またはスキャンされた文書の画像として埋め込まれたテーブルに至るまで、さまざまに変化する可能性があるためです。
このガイドは、IronPDFを使用した PDF テーブル抽出のアプローチに関する包括的な C# チュートリアルを提供します。 私たちは主に、IronPDFの強力なテキスト抽出機能を活用して、テキストベースのPDFから表形式のデータにアクセスし、それを解析する方法を探ります。 この方法の有効性を議論し、解析のための戦略を提供し、抽出された情報の処理に関する洞察を提供します。 さらに、スキャンされたPDFを含む、より複雑なシナリオに対処するための戦略についても触れます。
PDFから表データを抽出するためのC#の主要なステップ
PDF処理用のIronPDF C#ライブラリをインストールします (https://nuget.org/packages/IronPdf/)。
(オプションのデモステップ)IronPDF の RenderHtmlAsPdf
を使用して、HTML 文字列からテーブル付きのサンプル PDF を作成します。 (セクションを参照: (デモステップ)表データでPDFドキュメントを作成する)
任意のPDFドキュメントをロードし、ExtractAllText
メソッドを使用してその生テキストコンテンツを取得します。 (セクション参照: PDFからテーブルデータを含む全テキストを抽出する)
抽出されたテキストを解析し、表の行とセルを識別するC#のロジックを実装します。 (「C#でテーブルデータを再構築するために解析された抽出テキスト」を参照)
構造化された表データを出力するか、後で使用するためにCSVファイルに保存します。 (「C#でテーブルデータを再構築するために解析された抽出テキスト」を参照)
スキャンされたPDFに対してOCRのような高度な技術を検討してください(後述)。
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 からテキスト、画像、そして(これから見るように)表データを簡単に抽出することです。
PDFドキュメントからテーブルデータを抽出するために、C#プロジェクトを設定します:
Visual Studio: Visual Studio(例:2022)をインストールしてください。 そうでない場合は、Visual Studio のウェブサイト (https://visualstudio.microsoft.com/downloads/) からダウンロードしてください。
プロジェクトを作成:
Visual Studio のスタート画面
C#でPDFテーブルを読む方法、図2: Visual Studioで新しいコンソールアプリケーションを作成
Visual Studioで新しいコンソールアプリケーションを作成する
新しく作成したアプリケーションを設定する
.NET Framework を選択
IronPDFをインストールする:
Visual Studio NuGet パッケージ マネージャーの使用:
ツールとNuGetパッケージの管理
ツールとNuGetパッケージの管理
NuGet パッケージを直接ダウンロード: IronPDF の NuGet パッケージページにアクセスしてください (https://www.nuget.org/packages/IronPdf/)。
このチュートリアルでは、最初に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";
こちらはサンプルテーブルの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>";
次に、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.")
SaveAs
メソッドはPDFを保存します。 生成されたtable_example.pdf
はこのように見えます(HTMLに基づく概念的な画像):
NuGet パッケージ マネージャー UIで IronPDF を検索する
テーブルデータを抽出するには、まず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()
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)
テキストを抽出するPDFファイル
抽出された生のテキストを使用して、次の課題はこの文字列を解析し、表形式のデータを特定して構造化することです。 この手順は、PDF内の表の一貫性と形式に大きく依存します。
一般的なパーシング戦略:
行区切りを特定する: 改行文字 (\n
または \r\n
) は一般的な行区切りです。
列の区切り文字を識別する: 行内のセルは、複数のスペース、タブ、または特定の既知の文字(例えば ')で区切られることがあります。 ' or ';'). 場合によっては、列が視覚的に整列していても明確なテキスト区切りがない場合、一貫したスペースパターンに基づいて構造を推測することがありますが、これはより複雑です。
非テーブルコンテンツのフィルタリング: 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
このコードはテキストを行に分割します。 if
条件は、この特定の例の非テキスト部分への非常に基本的なフィルターです。 実際のシナリオでは、テーブルの行とセルを正確に特定して解析するためのより堅牢なロジックが必要です。
単純なフィルタリングされたテキストの出力:
コンソールには抽出されたテキストが表示されます
テキストパース方法の重要な考慮事項:
制限事項: この方法は以下の点で問題が生じる可能性があります:
結合されたセルや複雑なネスト構造を持つテーブル。
列がテキストの区切りではなく視覚的なスペーシングで定義されているテーブル。
OCRを必要とする画像として埋め込まれた表。
フィルターされた行(理想的には表の行を表しています)を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")
複雑または画像ベースのPDFテーブルからデータを抽出するには、単純なテキストパースよりも高度な技術が必要となることが多いです。 IronPDFは、役立つ機能を提供します。
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
詳細なガイダンスについては、IronOCR ドキュメント (https://ironsoftware.com/csharp/ocr/) をご覧ください。 OCR の後、生成されたテキスト文字列を解析します。
ExtractAllText()
はテキストストリームを提供しますが、シナリオによっては各テキストスニペットの x, y 座標を知ることが有益な場合があります。 IronPDFが境界ボックス情報付きでテキストを取得するAPIを提供する場合(最新のドキュメントを確認してください)、視覚的な配置に基づいてテーブルを再構築するためのより洗練された空間解析が可能になるかもしれません。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.
パターン認識と正規表現: 非常に予測可能なパターンを持つが区切り文字が不定なテーブルの場合、抽出されたテキストに複雑な正規表現を適用することで、テーブルデータを分離できる場合があります。
適切な戦略を選ぶことは、ソースPDFの複雑さと一貫性に依存します。 多くの一般的なビジネス文書でテキストベースの表を使用する際、IronPDFのExtractAllText
を賢いC#パーシングロジックと組み合わせると非常に効果的です。画像ベースの表の場合、そのOCR機能は不可欠です。
この記事では、主にExtractAllText()
メソッドとその後の文字列解析を利用し、IronPDF を使用して C# で PDF ドキュメントからテーブルデータを抽出する方法を示しました。 このアプローチはテキストベースのテーブルに対して強力である一方で、画像ベースのテーブルのようなより複雑なシナリオについては、IronPDFのOCR機能を使用するか、まずPDFを他の形式に変換することで対応できることを私たちは確認しました。
IronPDFは.NET開発者向けに多用途なツールキットを提供し、作成および編集から包括的なデータ抽出まで、多くのPDF関連タスクを簡素化します。 ExtractTextFromPage
のようなページ固有の抽出メソッドを提供し、DOCXからPDFへの変換をサポートします。
IronPDF は開発用に無料で提供されており、完全な商用機能を試験できる無料の試用ライセンスを提供しています。 本番導入のために、さまざまなライセンスオプションが利用可能です。
詳細および高度な使用例については、公式のIronPDFドキュメントと例をご覧ください (https://ironpdf.com/)