今日のデータ主導の世界では、PDF ドキュメントから構造化された表形式データをシームレスに抽出することが開発者にとって重要なタスクになっています。GrapeCity Documents for PDF (GcPdf)を使用すると、C# を使用してプログラムでこれらの PDF に隠された情報の宝庫を簡単にロック解除できます。
最も一般的に使用されるドキュメント形式の 1 つである PDF の人気と、そのテーブルに含めることができる膨大な量のデータを考えてみましょう。企業や組織は、財務分析、株価動向、連絡先詳細などを表示するために PDF ドキュメントを使用してきました。ここで、データの蓄積が中心となる長年にわたる四半期報告書を調査することを想像してください。
これらのレポートからデータを取得するのは、最初は簡単 (コピー/ペースト) に思えるかもしれません。ただし、PDF ファイルの構造により、大規模な操作や変更を行わずに、単純なコピー アンド ペーストだけで表形式のデータを取得できることはほとんどありません。
他の多くのドキュメントからコピーして貼り付ける可能性と組み合わせると、長い 1 日 (必要なデータによっては 1 週間以上もかかることもあります!) がかかります。このような要件を効率的に処理するには、このプロセスを自動化できるツールが必要です。C# .NET GcPdf API ライブラリはその仕事に最適なツールです。
この記事は、データ収集に必要な時間を短縮し、データ収集プロセスの精度を向上させたい開発者を対象としています。これらの例は、開発者が PDF ファイル内のテーブルにアクセスし、必要に応じてテーブル データを抽出して CSV ファイルまたは他の形式 (XLSX など) にエクスポートするための GcPdf ツールを理解するのに役立ちます。
PDF ドキュメント内の表に関する重要な情報
テーブルは PDF ファイル形式に非常に似ており、データを表示する最も一般的な方法です。それにもかかわらず、PDF ドキュメントには本質的に表の概念が欠けていることを理解する必要があります。言い換えれば、PDF に表示される表は純粋に視覚的な要素です。
これらの PDF の「表」は、MS Excel や MS Word などのアプリケーションで一般的に見られる表とは異なります。代わりに、テーブル構造と同様に、テキストとグラフィックを特定の位置にレンダリングする役割を担う演算子の組み合わせによって構築されます。
これは、行、列、セルという従来の概念が PDF ファイルにとって異質であり、これらの要素を識別するのに役立つ基本的なコード コンポーネントがないことを意味します。それでは、GcPdf の C# API ライブラリがこれを達成するのにどのように役立つのかを詳しく見てみましょう。
C# を使用して PDF ドキュメントから表形式のデータをプログラムで抽出する方法
- GcPdf を含む .NET Core コンソール アプリケーションを作成する
- データテーブルを含むサンプル PDF をロードする
- テーブル識別パラメータを定義する
- テーブルデータを取得する
- 抽出した PDF 表データを別のファイル形式 (CSV) で保存する
- ボーナス:エクスポートされた PDF 表データを Excel (XLSX) ファイルにフォーマットします
必ずサンプル アプリケーションをダウンロードして 、このブログ投稿で説明されているユースケース シナリオとコード スニペットの詳細な実装を試してください。
GcPdf を含む .NET Core コンソール アプリケーションを作成する
.NET Core コンソール アプリケーションを作成し、[依存関係] を右クリックして、[NuGet パッケージの管理] を選択します。「参照」タブで「GrapeCity.Documents.Pdf」を検索し、「インストール」をクリックします。
インストール時に、「ライセンスへの同意」ダイアログボックスが表示されます。「同意する」をクリックして続行します。
プログラム ファイルで、次の名前空間をインポートします。
using System.Text;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Recognition;
using System.Linq;
データテーブルを含むサンプル PDF をロードする
GcPdfDocument コンストラクターを初期化して、解析する PDF ドキュメントをロードすることにより、新しい PDF ドキュメントを作成します。GcPdfDocument の Load メソッドを呼び出して、データ テーブルを含む元の PDF ドキュメントを読み込みます。
using (var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "zugferd-invoice.pdf")))
{
// Initialize GcPdf
var pdfDoc= new GcPdfDocument();
// Load a PDF document
pdfDoc.Load(fs);
}
この例では、次の PDF を使用します。
テーブル識別パラメータを定義する
RectangleF クラスの新しいインスタンスをインスタンス化し、PDF ドキュメント内のテーブル境界を定義します。
const float DPI = 72;
using (var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "zugferd-invoice.pdf")))
{
// Initialize GcPdf
var pdfDoc= new GcPdfDocument();
// Load a PDF document
pdfDoc.Load(fs);
// The approx table bounds:
var tableBounds = new RectangleF(0, 2.5f * DPI, 8.5f * DPI, 3.75f * DPI);
}
定義されたパラメーター内のテーブルを識別しやすくするために、TableExtractOptionsクラスを使用します。これにより、テーブル形式の特性を考慮してテーブル識別を微調整できます。TableExtractOptions は、列の幅、行の高さ、行または列間の距離などのテーブルの書式設定オプションを指定するパラメーターです。
// TableExtractOptions allow to fine-tune table recognition accounting for
// specifics of the table formatting:
var tableExtrctOpt = new TableExtractOptions();
var GetMinimumDistanceBetweenRows = tableExtrctOpt.GetMinimumDistanceBetweenRows;
// In this particular case, we slightly increase the minimum distance between rows
// to make sure cells with wrapped text are not mistaken for two cells:
tableExtrctOpt.GetMinimumDistanceBetweenRows = (list) =>
{
var res = GetMinimumDistanceBetweenRows(list);
return res * 1.2f;
};
PDFからテーブルデータを取得する
リストを作成して表形式のデータを PDF ページに保存します。
// CSV: list to keep table data from all pages:
var data = new List<List<string>>();
定義されたテーブル境界 (前の手順で定義) を使用して GetTable メソッドを呼び出し、GcPdf が指定された四角形内でテーブルを検索します。
for (int i = 0; i < pdfDoc.Pages.Count; ++i)
{
// Get the table at the specified bounds:
var itable = pdfDoc.Pages[i].GetTable(tableBounds, tableExtrctOpt);
}
ITable.GetCell(rowIndex,colIndex) メソッドを使用して、テーブル内の各セルにアクセスします。Rows.Count プロパティと Cols.Count プロパティを使用して、抽出された表のセルを反復処理します。
for (int i = 0; i < pdfDoc.Pages.Count; ++i)
{
// Get the table at the specified bounds:
var itable = pdfDoc.Pages[i].GetTable(tableBounds, tableExtrctOpt);
if (itable != null)
{
for (int row = 0; row < itable.Rows.Count; ++row)
{
// CSV: add next data row ignoring headers:
if (row > 0)
data.Add(new List<string>());
for (int col = 0; col < itable.Cols.Count; ++col)
{
var cell = itable.GetCell(row, col);
if (cell == null && row > 0)
data.Last().Add("");
else
{
if (cell != null && row > 0)
data.Last().Add($"\"{cell.Text}\"");
}
}
}
}
}
抽出した PDF 表データを別のファイル形式 (CSV) で保存する
この手順では、まず「System.Text.Encoding.CodePages」NuGet パッケージ参照への参照を追加する必要があります。
次に、前の手順で変数から抽出した PDF テーブル データを保存するために、File クラスを使用し、その AppendAllLines メソッドを呼び出します。
for (int i = 0; i < pdfDoc.Pages.Count; ++i)
{
// Get the table at the specified bounds:
var itable = pdfDoc.Pages[i].GetTable(tableBounds, tableExtrctOpt);
if (itable != null)
{
for (int row = 0; row < itable.Rows.Count; ++row)
{
// CSV: add next data row ignoring headers:
if (row > 0)
data.Add(new List<string>());
for (int col = 0; col < itable.Cols.Count; ++col)
{
var cell = itable.GetCell(row, col);
if (cell == null && row > 0)
data.Last().Add("");
else
{
if (cell != null && row > 0)
data.Last().Add($"\"{cell.Text}\"");
}
}
}
}
}
データは CSV ファイルとして利用できるようになります。
オリジナルPDF |
PDFテーブルデータをCSVファイルに抽出 |
ボーナス: エクスポートされた PDF 表データを Excel (XLSX) ファイルにフォーマットします
データは読みやすく操作しやすい形式で提供されていますが、元の形式のまま CSV ファイルとして保存されます。データをより有効に活用し、分析を容易にするために、 GrapeCity Documents for Excel (GcExcel) .NET バージョンと C# を使用して CSV ファイルを Excel (XLSX) ファイルにロードし、抽出されたデータにスタイルと形式を適用します。
GcExcel を使用するには、NuGet パッケージ「GrapeCity.Documents.Excel」をプロジェクトに追加し、その名前空間を追加します。
using GrapeCity.Documents.Excel;
GcExcel ワークブック インスタンスを初期化し、Open メソッドを使用してCSV ファイルをロードします。
var workbook = new GrapeCity.Documents.Excel.Workbook();
workbook.Open($@"{fileName}", OpenFileFormat.Csv);
抽出されたデータの範囲を取得し、セルの範囲をラップし、列に自動サイズ変更を適用し、条件付き背景色のスタイルを適用します。
IWorksheet worksheet = workbook.Worksheets[0];
IRange range = worksheet.Range["A2:E10"];
// wrapping cell content
range.WrapText = true;
// styling column names
worksheet.Range["A1"].EntireRow.Font.Bold = true;
// auto-sizing range
worksheet.Range["A1:E10"].AutoFit();
// aligning cell content
worksheet.Range["A1:E10"].HorizontalAlignment = HorizontalAlignment.Center;
worksheet.Range["A1:E10"].VerticalAlignment = VerticalAlignment.Center;
// applying conditional format on UnitPrice
IColorScale twoColorScaleRule = worksheet.Range["E2:E10"].FormatConditions.AddColorScale(ColorScaleType.TwoColorScale);
twoColorScaleRule.ColorScaleCriteria[0].Type = ConditionValueTypes.LowestValue;
twoColorScaleRule.ColorScaleCriteria[0].FormatColor.Color = Color.FromArgb(255, 229, 229);
twoColorScaleRule.ColorScaleCriteria[1].Type = ConditionValueTypes.HighestValue;
twoColorScaleRule.ColorScaleCriteria[1].FormatColor.Color = Color.FromArgb(255, 20, 20);
Thread.Sleep(1000);
最後に、Save メソッドを使用してブックを Excel ファイルとして保存します。
workbook.Save("ExtractedData_Formatted.xlsx");
ご覧のとおり、C# と GcPdf を使用すると、開発者はプログラムで PDF テーブル データを別のファイル (CSV など) に抽出でき、その後、GcExcel を使用して、データを様式化および書式設定された Excel XLSX ファイルに変換できるため、データ分析では次のことが可能になります。
オリジナルPDF |
PDFテーブルデータをCSVファイルに抽出 |
Excel XLSX ファイルのフォーマット |
GrapeCity の .NET PDF API ライブラリ
この .NET PDF サーバー側 API をデスクトップまたは Web ベースのアプリケーションに統合すると、開発者は PDF を完全に制御できるようになり、メモリ効率が向上し、依存関係がなくドキュメントを迅速に生成できるようになります。