IRONPDFの使用

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

公開済み 2024年10月23日
共有:

多くの業界では、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抽出ツールに移動する

本日はDocsumoオンラインPDFツールの例 Docsumoは、無料のPDF表抽出ツールを提供するオンラインPDF文書AIです。

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

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

ファイルをアップロード」ボタンをクリックして、PDFファイルをアップロードしてください。 ツールは直ちにPDFの処理を開始します。

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

ステップ3:結果の表示とダウンロード

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

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

IronPDFを使ってテーブルデータを抽出する

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

using IronPDF;
PdfDocument pdf = PdfDocument.FromFile("example.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
using IronPDF;
PdfDocument pdf = PdfDocument.FromFile("example.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
Imports IronPDF
Private pdf As PdfDocument = PdfDocument.FromFile("example.pdf")
Private text As String = pdf.ExtractAllText()
Console.WriteLine(text)
VB   C#

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

この例では、PDFドキュメントをPdfDocumentクラスを作成し、ExtractAllText() 最終的にコンソールにテキストを表示する前に、ドキュメント内のすべてのテキストを抽出する方法。

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

PDFからテキストを抽出した後、表はプレーンテキストの一連の行と列として表示されます。 このテキストは、改行に基づいて分割することができます(以下の内容を日本語に翻訳してください:

\nという表現の"\n"は改行を表す記号として理解しました。では、具体的な文章を提供してください。)この翻訳では、行をカラムに分割し、カンマやタブなどの区切り文字を使用します。 以下は、テキストから表を解析する方法の基本的な例です:

using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("table.pdf");
string text = pdf.ExtractAllText();
string[] lines = text.Split('\n');
foreach (string line in lines)
{
    string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
    Console.WriteLine("Row: ");
    foreach (string column in columns)
    {
        Console.WriteLine("  " + column);
    }
}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("table.pdf");
string text = pdf.ExtractAllText();
string[] lines = text.Split('\n');
foreach (string line in lines)
{
    string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
    Console.WriteLine("Row: ");
    foreach (string column in columns)
    {
        Console.WriteLine("  " + column);
    }
}
Imports Microsoft.VisualBasic
Imports IronPdf
Private pdf As PdfDocument = PdfDocument.FromFile("table.pdf")
Private text As String = pdf.ExtractAllText()
Private lines() As String = text.Split(ControlChars.Lf)
For Each line As String In lines
	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)
	Next column
Next line
VB   C#

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

この例では、前回と同じ手順でPDF文書を読み込み、テキストを抽出しました。 次に、text.Splitを使用します。('\n') 抽出されたテキストを改行に基づいて行に分割し、結果を lines 配列に格納します。 foreachループは、配列の行をループするために使用されます。('\t') タブ文字 ' \t' を区切り文字として使用し、行を列に分割します。 列の配列の次の部分、どこで(コル =>!string.IsNullOrWhiteSpace(コル)).ToArray()** 余分なスペースが原因で発生する可能性のある空の列をフィルタリングし、列配列に列を追加します。

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

抽出したテーブルデータをCSVにエクスポートする

さて、PDFファイルから表を抽出する方法を説明したので、抽出したデータで何ができるかを見てみましょう。 エクスポートされた表をCSVファイルとして出力することは、表データを扱い、データ入力などの作業を自動化する便利な方法の1つです。 この例では、シミュレートされたデータ(この場合は1週間の毎日の降雨量)で表を埋め、PDFから表を抽出し、CSVファイルにエクスポートしています。

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);
        var text = pdf.ExtractTextFromPage(0); // Extract text from the first page
        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);
            }
        }
    }
}
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);
        var text = pdf.ExtractTextFromPage(0); // Extract text from the first page
        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

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)
		Dim text = pdf.ExtractTextFromPage(0) ' Extract text from the first page
		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) 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
VB   C#

サンプルPDFファイル

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

出力CSVファイル

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

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

次に、テキストを行と列に分割します。 最後に、この分割処理から結果を返した後、メソッド static void WriteDataToCsv を呼び出します。() 抽出され、分割されたテキストを取得し、StreamWriterを使用して私たちのCSVファイルに書き込みます。

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

PDFの表を扱う場合、いくつかの基本的なベストプラクティスに従うことで、エラーや問題に遭遇する可能性を最小限に抑えることができます。

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

IronPDF ライセンシング

IronPdfは様々な翻訳サービスを提供しています。ライセンスIronPDFのパワフルな機能をライセンス契約前にお試しいただけます。

結論

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

IronPdfを使えば、自動データ入力、文書変換、データ分析などのワークフローを合理化することができます。 IronPDFが提供する柔軟性と高度な機能により、PDFベースの様々なタスクを処理するための価値あるツールとなっています。

< 以前
C# PDFコンバータの作り方
次へ >
C#を使用してASP .NETでHTMLをPDFに変換する方法