透かしなしで本番環境でテストしてください。
必要な場所で動作します。
30日間、完全に機能する製品をご利用いただけます。
数分で稼働させることができます。
製品トライアル期間中にサポートエンジニアリングチームへの完全アクセス
多くの業界では、PDFファイルは、レポート、請求書、データ表などの構造化されたドキュメントを共有するための一般的なフォーマットです。 しかし、PDFからデータを抽出するのは、特に表に関しては、PDFフォーマットの性質上、難しい場合があります。 構造化データ形式とは異なり、PDFはデータ抽出ではなく、主にプレゼンテーションのために設計されています。
しかし、IronPDF、強力なC# PDF .NETライブラリを使用すれば、PDFからテーブルのような構造化されたデータを簡単に抽出し、.NETアプリケーションで処理することができます。 この記事ではIronPdfを使ってPDFファイルから表形式のデータを抽出する方法をステップバイステップで説明します。
テーブルは、在庫管理、データ入力、雨量などのデータの記録など、データを構造化して表示する便利な方法です。したがって、PDF文書から表や表データを抽出する必要がある理由もたくさんあるでしょう。 最も一般的な使用例には、次のようなものがあります:
PDFファイル形式は、テーブルのような構造化された形式でデータを保存するネイティブの機能を提供しません。 今日の例で使用するテーブルは、HTMLで作成された後、PDF形式に変換されました。 テーブルはテキストとラインとしてレンダリングされるため、テーブルデータを抽出するには、IronOCR のようなOCRソフトウェアを使用しない限り、内容の解析と解釈が必要になることがよくあります。
IronPDFがこのタスクにどのように取り組めるかを検討する前に、まずPDF抽出を処理できるオンラインツールを検討してみましょう。 オンライン PDF ツールを使用して PDF 文書から表を抽出するには、以下の手順に従ってください:
無料のオンラインPDF抽出ツールに移動する
表を含むPDFのアップロード
今日は、オンラインPDFツールの例としてDocsumoを使用します。 Docsumoは、無料のPDF表抽出ツールを提供するオンラインPDF文書AIです。
ファイルをアップロード」ボタンをクリックして、PDFファイルをアップロードしてください。 ツールは直ちにPDFの処理を開始します。
DocsumoがPDFの処理を終えると、抽出された表が表示されます。 その後、行の追加や削除など、テーブル構造の調整を行うことができます。 ここでは、別のPDF、XLS、JSON、またはテキストとして表をダウンロードできます。
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)
この例では、PdfDocument クラスを使用してPDFドキュメントを読み込み、その後 ExtractAllText() メソッドを使用してドキュメント内のすべてのテキストを抽出し、最終的にテキストをコンソール上に表示しています。
PDFからテキストを抽出した後、表はプレーンテキストの一連の行と列として表示されます。 このテキストを改行 (\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
この例では、前回と同じ手順でPDF文書を読み込み、テキストを抽出しました。 次に、text.Split('\n')を使用して、抽出されたテキストを改行に基づいて行に分割し、その結果をlines配列に保存します。 次に、line.Split('\t')を使用してタブ文字'\t'を区切り文字として行を列にさらに分割するために、配列内の行をループするためにforeachループが使用されます。 カラム配列の次の部分、Where(col => !string.IsNullOrWhiteSpace(col)).ToArray()は、余分なスペースにより生じる可能性のある空のカラムをフィルターし、その後カラムをカラム配列に追加します。
最後に、基本的な行と列の構造化を使用して、コンソール出力ウィンドウにテキストを書き込みます。
さて、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
ご覧のように、PDFの表をCSVにエクスポートすることに成功しました。まず、表を含むPDFを読み込み、新しいCSVファイルのパスを作成しました。 その後、var tableData = ExtractTableDataFromPdf(pdfPath) 行を使用してテーブルを抽出しました。これはExtractTableDataFromPdf() メソッドと呼ばれます。 このメソッドは、テーブルが存在するPDFページのすべてのテキストを抽出し、それをtext変数に格納します。
次に、テキストを行と列に分割します。 最後に、この分割プロセスから結果を返した後、抽出された分割済みのテキストを取得して、StreamWriterを使用してCSVファイルに書き込むstatic void WriteDataToCsv()メソッドを呼び出します。
PDFの表を扱う場合、いくつかの基本的なベストプラクティスに従うことで、エラーや問題に遭遇する可能性を最小限に抑えることができます。
IronPDF は異なるライセンスを提供しており、ライセンスを購入する前に、IronPDF の強力な機能をすべて自分で試すことができます。
IronPDF を使用してPDFからテーブルを抽出することは、データ抽出を自動化し、分析を容易にし、文書をよりアクセスしやすい形式に変換する強力な方法です。 IronPDFは単純な表でも複雑で不規則なフォーマットでも、表データを効率的に抽出し処理するために必要なツールを提供します。
IronPdfを使えば、自動データ入力、文書変換、データ分析などのワークフローを合理化することができます。 IronPDFが提供する柔軟性と高度な機能により、PDFベースの様々なタスクを処理するための価値あるツールとなっています。