フッターコンテンツにスキップ
IRONPDFの使用

C#でPDFファイルからテーブルデータを抽出する方法

多くの業界では、PDFファイルはレポート、請求書、データテーブルなどの構造化文書を共有するための標準フォーマットです。 しかし、特にテーブルに関しては、PDFからデータを抽出するのはPDFフォーマットの特性上、難しい場合があります。 構造化データフォーマットとは異なり、PDFは主にプレゼンテーション用に設計されており、データ抽出のためではありません。

しかし、IronPDF(強力なC# PDF .NETライブラリ)を使用すれば、PDFからテーブルのような構造化データを簡単に抽出し、.NETアプリケーションで処理することができます。 この記事では、IronPDFを使用してPDFファイルからテーブルデータを抽出する方法をステップバイステップでガイドします。

PDFドキュメントからテーブルを抽出する必要があるのはいつですか?

テーブルは在庫管理、データ入力、降水量の記録など、データを構造化して表示するのに便利な方法です。このため、PDFドキュメントからテーブルやテーブルデータを抽出する必要がある理由も多くあります。 最も一般的な使用例のいくつかを以下に示します:

  • データ入力の自動化: PDFのレポートや請求書内のテーブルからデータを抽出することで、データベースやスプレッドシートの入力を自動化できます。
  • データ分析: 企業はPDFフォーマットで構造化されたレポートを受け取ることがよくあります。 テーブルを抽出すると、このデータをプログラムで分析できます。
  • 文書変換: テーブルデータをExcelやCSVのようなよりアクセスしやすいフォーマットに抽出することで、データの操作、保存、共有が容易になります。
  • 監査およびコンプライアンス: 法的または財務記録のために、PDFドキュメントからプログラムでテーブルデータを抽出することで、監査の自動化やコンプライアンスの確保に役立ちます。

PDFのテーブルはどのように機能しますか?

PDFファイルフォーマットでは、テーブルのような構造化された形式でデータを保存するネイティブな機能は提供されていません。 今日の例で使用するテーブルは、HTMLで作成された後、PDFフォーマットに変換されました。 テーブルはテキストと線としてレンダリングされるため、OCRソフトウェア(IronOCRなど)を使用しない限り、テーブルデータの抽出には内容の解析と解釈がしばしば必要です。

C&#でPDFファイルからテーブルデータを抽出する方法

このタスクをIronPDFで解決する方法を探る前に、PDF抽出を扱えるオンラインツールをまず探ってみましょう。 オンラインのPDFツールを使用してPDFドキュメントからテーブルを抽出するには、以下の手順に従います:

  1. 無料のオンラインPDF抽出ツールにアクセスする
  2. テーブルを含むPDFをアップロードする
  3. 結果を表示してダウンロードする

ステップ1: 無料のオンラインPDF抽出ツールにアクセスする

今日は、オンラインPDFツールの例としてDocsumoを使用します。 Docsumoは無料のPDFテーブル抽出ツールを提供するオンラインPDFドキュメントAIです。

C#でPDFファイルからテーブルデータを抽出する方法:図1

ステップ2: テーブルを含むPDFをアップロードする

次に、「ファイルをアップロード」ボタンをクリックして、PDFファイルをアップロードして抽出します。 ツールは、PDFの処理を即座に開始します。

C#でPDFファイルからテーブルデータを抽出する方法:図2

ステップ3: 結果を表示してダウンロードする

DocsumoがPDFの処理を終えると、抽出されたテーブルが表示されます。 ここで、行の追加や削除などのテーブルの構造に調整を加えることができます。 ここで、テーブルを別のPDF、XLS、JSON、またはTextとしてダウンロードできます。

C#でPDFファイルからテーブルデータを抽出する方法:図3

IronPDFを使用したテーブルデータの抽出

IronPDFを使用すると、PDFからデータ、テキスト、グラフィックスを抽出し、それをプログラムでテーブルとして再構築することができます。 これを行うには、まずPDF内のテーブルからのテキストコンテンツを抽出し、そのテキストを使用してテーブルを行と列に解析する必要があります。 テーブルを抽出し始める前に、テーブル内のデータを抽出するIronPDFのExtractAllText()メソッドの動作を見てみましょう:

using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("example.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Output the extracted text to the console
        Console.WriteLine(text);
    }
}
using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("example.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Output the extracted text to the console
        Console.WriteLine(text);
    }
}
Imports IronPDF

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Load the PDF document
		Dim pdf As PdfDocument = PdfDocument.FromFile("example.pdf")

		' Extract all text from the PDF
		Dim text As String = pdf.ExtractAllText()

		' Output the extracted text to the console
		Console.WriteLine(text)
	End Sub
End Class
$vbLabelText   $csharpLabel

C#でPDFファイルからテーブルデータを抽出する方法:図4

この例では、まずPdfDocumentクラスを使用してPDFドキュメントを読み込み、次にExtractAllText()メソッドを使用して文書内のすべてのテキストを抽出し、最後にコンソールにテキストを表示します。

IronPDFを使用したテキストからのテーブルデータの抽出

PDFからテキストを抽出した後、テーブルはプレーンテキストの一連の行と列として表示されます。 このテキストを行の区切り(\n)に基づいて分割し、さらに列に分割するには、一貫したスペースまたはカンマやタブなどの区切り文字を使用します。 テキストからテーブルを解析する基本的な例を以下に示します:

using IronPDF;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("table.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Split the text into lines (rows)
        string[] lines = text.Split('\n');

        foreach (string line in lines)
        {
            // Split the line into columns using the tab character
            string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
            Console.WriteLine("Row:");

            foreach (string column in columns)
            {
                Console.WriteLine("  " + column); // Output each column in the row
            }
        }
    }
}
using IronPDF;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("table.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Split the text into lines (rows)
        string[] lines = text.Split('\n');

        foreach (string line in lines)
        {
            // Split the line into columns using the tab character
            string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
            Console.WriteLine("Row:");

            foreach (string column in columns)
            {
                Console.WriteLine("  " + column); // Output each column in the row
            }
        }
    }
}
Imports Microsoft.VisualBasic
Imports IronPDF
Imports System
Imports System.Linq

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Load the PDF document
		Dim pdf As PdfDocument = PdfDocument.FromFile("table.pdf")

		' Extract all text from the PDF
		Dim text As String = pdf.ExtractAllText()

		' Split the text into lines (rows)
		Dim lines() As String = text.Split(ControlChars.Lf)

		For Each line As String In lines
			' Split the line into columns using the tab character
			Dim columns() As String = line.Split(ControlChars.Tab).Where(Function(col) Not String.IsNullOrWhiteSpace(col)).ToArray()
			Console.WriteLine("Row:")

			For Each column As String In columns
				Console.WriteLine("  " & column) ' Output each column in the row
			Next column
		Next line
	End Sub
End Class
$vbLabelText   $csharpLabel

C#でPDFファイルからテーブルデータを抽出する方法:図5

この例では、PDFドキュメントを読み込み、テキストを抽出するために、前述と同じ手順に従いました。 次に、抽出したテキストをline breaks(改行)に基づいて行に分割し、結果をlines配列に保管します。 foreachループを使用して配列内の行をループし、line.Split('\t')を使用してタブ文字'\t'を区切りにして行をさらに列に分割します。 columns配列の次の部分であるWhere(col => !string.IsNullOrWhiteSpace(col)).ToArray()は、余分なスペースにより生じる空の列をフィルタリングし、列を配列に追加します。

最後に、基本的な行と列の構造でテキストをコンソール出力ウィンドウに書き込みます。

抽出されたテーブルデータのCSVへのエクスポート

PDFファイルからテーブルを抽出することをカバーしたので、その抽出されたデータで何ができるかを見てみましょう。 テーブルをCSVファイルとしてエクスポートすることは、データ入力のようなタスクを自動化し、このようなテーブルデータを処理するための便利な方法です。 この例で、テーブルにはシミュレートされたデータを入れ、今回は一週間の毎日の降水量を、PDFから抽出し、CSVファイルにエクスポートしました。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = "table.pdf";
        string csvPath = "output.csv";

        // Extract and parse table data
        var tableData = ExtractTableDataFromPdf(pdfPath);

        // Write the extracted data to a CSV file
        WriteDataToCsv(tableData, csvPath);
        Console.WriteLine($"Data extracted and saved to {csvPath}");
    }

    static List<string[]> ExtractTableDataFromPdf(string pdfPath)
    {
        var pdf = PdfDocument.FromFile(pdfPath);

        // Extract text from the first page
        var text = pdf.ExtractTextFromPage(0); 
        var rows = new List<string[]>();

        // Split text into lines (rows)
        var lines = text.Split('\n');

        // Variable to hold column values temporarily
        var tempColumns = new List<string>();

        foreach (var line in lines)
        {
            var trimmedLine = line.Trim();

            // Check for empty lines or lines that don't contain table data
            if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.Contains("Header"))
            {
                continue;
            }

            // Split line into columns. Adjust this based on how columns are separated.
            var columns = trimmedLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);

            if (columns.Length > 0)
            {
                // Add columns to temporary list
                tempColumns.AddRange(columns);
                rows.Add(tempColumns.ToArray());
                tempColumns.Clear(); // Clear temporary list after adding to rows
            }
        }

        return rows;
    }

    static void WriteDataToCsv(List<string[]> data, string csvPath)
    {
        using (var writer = new StreamWriter(csvPath))
        {
            foreach (var row in data)
            {
                // Join columns with commas and quote each field to handle commas within data
                var csvRow = string.Join(",", row.Select(field => $"\"{field.Replace("\"", "\"\"")}\""));
                writer.WriteLine(csvRow);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = "table.pdf";
        string csvPath = "output.csv";

        // Extract and parse table data
        var tableData = ExtractTableDataFromPdf(pdfPath);

        // Write the extracted data to a CSV file
        WriteDataToCsv(tableData, csvPath);
        Console.WriteLine($"Data extracted and saved to {csvPath}");
    }

    static List<string[]> ExtractTableDataFromPdf(string pdfPath)
    {
        var pdf = PdfDocument.FromFile(pdfPath);

        // Extract text from the first page
        var text = pdf.ExtractTextFromPage(0); 
        var rows = new List<string[]>();

        // Split text into lines (rows)
        var lines = text.Split('\n');

        // Variable to hold column values temporarily
        var tempColumns = new List<string>();

        foreach (var line in lines)
        {
            var trimmedLine = line.Trim();

            // Check for empty lines or lines that don't contain table data
            if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.Contains("Header"))
            {
                continue;
            }

            // Split line into columns. Adjust this based on how columns are separated.
            var columns = trimmedLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);

            if (columns.Length > 0)
            {
                // Add columns to temporary list
                tempColumns.AddRange(columns);
                rows.Add(tempColumns.ToArray());
                tempColumns.Clear(); // Clear temporary list after adding to rows
            }
        }

        return rows;
    }

    static void WriteDataToCsv(List<string[]> data, string csvPath)
    {
        using (var writer = new StreamWriter(csvPath))
        {
            foreach (var row in data)
            {
                // Join columns with commas and quote each field to handle commas within data
                var csvRow = string.Join(",", row.Select(field => $"\"{field.Replace("\"", "\"\"")}\""));
                writer.WriteLine(csvRow);
            }
        }
    }
}
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports IronPDF

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfPath As String = "table.pdf"
		Dim csvPath As String = "output.csv"

		' Extract and parse table data
		Dim tableData = ExtractTableDataFromPdf(pdfPath)

		' Write the extracted data to a CSV file
		WriteDataToCsv(tableData, csvPath)
		Console.WriteLine($"Data extracted and saved to {csvPath}")
	End Sub

	Private Shared Function ExtractTableDataFromPdf(ByVal pdfPath As String) As List(Of String())
		Dim pdf = PdfDocument.FromFile(pdfPath)

		' Extract text from the first page
		Dim text = pdf.ExtractTextFromPage(0)
		Dim rows = New List(Of String())()

		' Split text into lines (rows)
		Dim lines = text.Split(ControlChars.Lf)

		' Variable to hold column values temporarily
		Dim tempColumns = New List(Of String)()

		For Each line In lines
			Dim trimmedLine = line.Trim()

			' Check for empty lines or lines that don't contain table data
			If String.IsNullOrEmpty(trimmedLine) OrElse trimmedLine.Contains("Header") Then
				Continue For
			End If

			' Split line into columns. Adjust this based on how columns are separated.
			Dim columns = trimmedLine.Split( { " "c, ControlChars.Tab }, StringSplitOptions.RemoveEmptyEntries)

			If columns.Length > 0 Then
				' Add columns to temporary list
				tempColumns.AddRange(columns)
				rows.Add(tempColumns.ToArray())
				tempColumns.Clear() ' Clear temporary list after adding to rows
			End If
		Next line

		Return rows
	End Function

	Private Shared Sub WriteDataToCsv(ByVal data As List(Of String()), ByVal csvPath As String)
		Using writer = New StreamWriter(csvPath)
			For Each row In data
				' Join columns with commas and quote each field to handle commas within data
				Dim csvRow = String.Join(",", row.Select(Function(field) $"""{field.Replace("""", """""")}"""))
				writer.WriteLine(csvRow)
			Next row
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

サンプルPDFファイル

C#でPDFファイルからテーブルデータを抽出する方法:図6

出力CSVファイル

C#でPDFファイルからテーブルデータを抽出する方法:図7

ご覧の通り、我々はPDFテーブルをCSVに正常にエクスポートしました。まず、テーブルを含むPDFをロードし、新しいCSVファイルパスを作成しました。 この後、var tableData = ExtractTableDataFromPdf(pdfPath)行を使用してテーブルを抽出しました。これはExtractTableDataFromPdf()メソッドと呼ばれます。 このメソッドは、テーブルが存在するPDFページ上のすべてのテキストを抽出し、それをtext変数に格納します。

その後、テキストを行と列に分割しました。 最終的に、この分割プロセスからの結果を返した後、抽出し分割したテキストを取って、それをStreamWriterを使用してCSVファイルに書き込むstatic void WriteDataToCsv()メソッドを呼び出します。

ヒントとベストプラクティス

PDFテーブルを使用する際には、いくつかの基本的なベストプラクティスを守ることで、エラーや問題に遭遇する可能性を最小限に抑えることができます。

  • PDFの前処理: 可能であれば、PDFを前処理して一貫したフォーマットを保証することで抽出プロセスを簡素化します。
  • データの検証: 常に抽出されたデータを検証して、正確性と完全性を確保します。
  • エラーの処理: テキスト抽出や解析が失敗した場合に備えて、try-catchブロックでコードをラップするなど、エラーハンドリングを実装します。
  • パフォーマンスの最適化: 大規模なPDFの場合、パフォーマンス問題を扱うためにテキスト抽出と解析を最適化することを検討します。

IronPDFのライセンス

IronPDFは異なるライセンスオプションを提供しており、ライセンスを決定する前にIronPDFが提供するすべての強力な機能を試すことができます。

結論

IronPDFを使用してPDFからテーブルを抽出することは、データの抽出を自動化し、分析を容易にし、ドキュメントをよりアクセスしやすい形式に変換する強力な方法です。 単純なテーブルから複雑で不規則な形式に至るまで、IronPDFはテーブルデータを効率的に抽出し処理するために必要なツールを提供します。

IronPDFを使用することで、自動データ入力、ドキュメント変換、データ分析などのワークフローを合理化できます。 IronPDFが提供する柔軟性と高度な機能は、様々なPDFベースのタスクを処理するための貴重なツールとなります。

よくある質問

C#を使用してPDFからテーブルを抽出する方法は?

C#でPDFからテーブルを抽出するにはIronPDFを使用できます。IronPDFを使用してPDFドキュメントを読み込み、テキストを抽出し、そのテキストをプログラムで行と列に解析します。

なぜPDFドキュメントからテーブルデータを抽出するのは難しいのですか?

PDFは主にデータ構造ではなくプレゼンテーション向けに設計されているため、テーブルのような構造化データの抽出が難しいのです。IronPDFのようなツールは、このデータを効果적으로解釈し抽出するのに役立ちます。

PDFからテーブルを抽出することの利点は何ですか?

PDFからテーブルを抽出することにより、データ入力の自動化、データ分析の実施、よりアクセスしやすいフォーマットへのドキュメント変換、監査プロセスでのコンプライアンスの確保が容易になります。

PDF抽出で複雑なテーブル形式をどのように処理しますか?

IronPDFは、複雑かつ不規則なテーブル形式からでもテーブルデータを抽出し処理する機能を提供し、正確なデータ抽出を保証します。

抽出したPDFテーブルデータをCSVに変換するプロセスは何ですか?

IronPDFを使用してPDFのテーブルデータを抽出し解析した後、StreamWriterを使って解析したデータを書き込むことにより、このデータをCSVファイルにエクスポートできます。

PDFテーブル抽出のベストプラクティスは何ですか?

一貫したフォーマットに向けてPDFを事前処理し、抽出されたデータを検証し、エラー処理を実装し、大規模なPDFファイルを扱う際にはパフォーマンスを最適化します。

IronPDFは監査およびコンプライアンスタスクに役立ちますか?

はい、IronPDFはPDFから表形式データを抽出し、それをExcelやCSVのような形式に変換し、レビューや分析のためにデータをよりアクセスしやすくすることで、監査とコンプライアンスに役立ちます。

IronPDFはどのようなライセンスオプションを提供していますか?

IronPDFは、試用版を含むさまざまなライセンスオプションを提供しているため、フルライセンスを購入する前にその機能を探索することができます。

PDFからテーブルを抽出する際に発生する可能性のある一般的なトラブルシューティングシナリオは何ですか?

一般的な問題には、テーブルの不整合なフォーマットやテキスト抽出のエラーがあります。IronPDFの強力な機能を使用すれば、正確な解析機能を提供することでこれらの課題を軽減できます。

IronPDF は .NET 10 と完全に互換性がありますか? また、テーブル抽出ワークフローにどのような利点がありますか?

はい。IronPDF は .NET 10(および .NET 9、8、7、6、Core、Standard、Framework)をサポートしています。つまり、最新の .NET 10 プロジェクトでも設定の問題なしに使用できます。.NET 10 上で開発を行う開発者は、割り当ての削減や JIT コンパイラの最適化の強化といったランタイムパフォーマンスの向上の恩恵を受け、PDF 処理や表抽出操作の高速化に役立ちます。

Curtis Chau
テクニカルライター

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

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