チュートリアル
簡単にライブラリーを使用するためのチュートリアルコレクション
PDF は、データの共有や記録に広く使われる人気のあるドキュメント形式です。特に PDF に含まれる表のデータを抽出する必要がある場面に出くわすことがあります。例えば、請求書の PDF に保存された表の中に有用な情報があり、そのデータを分析や計算に利用したい場合です。本記事では、Spire.PDF for .NET を使用して、PDF の表からデータを抽出し、それをテキストファイルや Excel ワークシートに保存する方法を紹介します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
Spire.PDF for .NET には、PdfTableExtractor.ExtractTable() メソッドがあり、PDF ページ上のすべての表を抽出することができます。このメソッドを使用して PDF ドキュメントから表を抽出した後、PdfTable.GetText() メソッドを使用して表の値を取得し、それをテキストファイルに書き出すことができます。PDF表データをテキストファイルに抽出する手順は以下の通りです:
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;
namespace PDFTableToText
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成し、PDFドキュメントをロード
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Sample.pdf");
// 読み込んだPDFのためのテーブルエクストラクターを初期化
PdfTableExtractor tableExtractor = new PdfTableExtractor(pdf);
// PDFの各ページを繰り返し処理
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 現在のページからテーブルを抽出
PdfTable[] tables = tableExtractor.ExtractTable(pageIndex);
if (tables != null)
{
// 抽出された各テーブルを繰り返し処理
for (int tableIndex = 0; tableIndex < tables.Length; tableIndex++)
{
// StringBuilderオブジェクトを作成
StringBuilder stringBuilder = new StringBuilder();
// テーブルの各行と列を繰り返し処理
for (int rowIndex = 0; rowIndex < tables[tableIndex].GetRowCount(); rowIndex++)
{
for (int columnIndex = 0; columnIndex < tables[tableIndex].GetColumnCount(); columnIndex++)
{
// テーブルのセルテキストを取得し、改行を削除
string cellText = tables[tableIndex].GetText(rowIndex, columnIndex);
string text = cellText.Replace("\n", " ");
// StringBuilderオブジェクトにセルテキストを追加
if (columnIndex < tables[tableIndex].GetColumnCount() - 1)
{
stringBuilder.Append(text + "");
}
else
{
stringBuilder.Append(text);
}
}
// 各テーブル行のために行を切り替え
if (rowIndex < tables[tableIndex].GetRowCount() - 1)
{
stringBuilder.AppendLine();
}
}
// テーブル内容をテキストファイルに書き込み
string outputFilePath = $"output/Page{pageIndex + 1}_Table{tableIndex + 1}.txt";
File.WriteAllText(outputFilePath, stringBuilder.ToString());
}
}
}
}
}
}
PDF 表のセルの値を上記と同様に取得し、Spire.XLS for .NET を使用して Excel ファイルに書き出すことができます。最初に Spire.XLS for .NET をインストールする必要があります:
PM> Install-Package Spire.XLS
PDF 表データを Excel ファイルに抽出する手順は以下の通りです:
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;
using System.Text;
namespace PDFTableToText
{
class Program
{
static void Main(string[] args)
{
// PdfDocumentオブジェクトを作成し、PDFドキュメントをロード
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Sample.pdf");
// Workbookオブジェクトを作成
Workbook workbook = new Workbook();
// デフォルトのワークシートをクリア
workbook.Worksheets.Clear();
// 読み込んだPDFのためのテーブルエクストラクターを初期化
PdfTableExtractor tableExtractor = new PdfTableExtractor(pdf);
// PDFの各ページを繰り返し処理
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 現在のページからテーブルを抽出
PdfTable[] tables = tableExtractor.ExtractTable(pageIndex);
if (tables != null)
{
// ページ上の各抽出されたテーブルを繰り返し処理
for (int tableIndex = 0; tableIndex < tables.Length; tableIndex++)
{
// ワークブックにワークシートを追加
Worksheet sheet = workbook.Worksheets.Add($"Page{pageIndex + 1}-Table{tableIndex + 1}");
// テーブル内の各行と列を繰り返し処理
for (int rowIndex = 0; rowIndex < tables[tableIndex].GetRowCount(); rowIndex++)
{
for (int columnIndex = 0; columnIndex < tables[tableIndex].GetColumnCount(); columnIndex++)
{
// テーブルからセルテキストを取得し、改行を削除
string cellText = tables[tableIndex].GetText(rowIndex, columnIndex);
string text = cellText.Replace("\n", "");
// ワークシートの対応する位置にセルテキストを挿入
sheet.Range[rowIndex + 1, columnIndex + 1].Text = text;
}
}
// テーブルヘッダのフォーマットを設定
sheet.Rows[0].Style.Font.FontName = "Yu Gothic UI";
sheet.Rows[0].Style.Font.Size = 12;
sheet.Rows[0].Style.Font.IsBold = true;
sheet.Rows[0].Style.HorizontalAlignment = HorizontalAlignType.Center;
// データ行のフォーマットを設定
for (int rowIndex = 1; rowIndex < sheet.Rows.Length; rowIndex++)
{
sheet.Rows[rowIndex].Style.Font.FontName = "Yu Gothic UI";
sheet.Rows[0].Style.Font.Size = 12;
sheet.Rows[0].Style.HorizontalAlignment = HorizontalAlignType.Left;
}
// 各列を自動調整
for (int columnIndex = 1; columnIndex <= sheet.Columns.Length; columnIndex++)
{
sheet.AutoFitColumn(columnIndex);
}
}
}
}
// ワークブックを保存
workbook.SaveToFile("PDFTableToExcel.xlsx", Spire.Xls.FileFormat.Version2016);
pdf.Close();
workbook.Dispose();
}
}
}
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。
表は、データを表示するための一般的な方法です。行と列で表示されるデータに、読み手が素早く効率的にアクセスすることができます。表形式で表示されたデータは、通常のテキストよりも読者に深い印象を与えます。また、読者はデータを比較したり、データ間の関係を理解したりすることが容易になります。この記事では、Spire.PDF for .NET を使用して PDF ドキュメントに表を作成する方法について説明します。
Spire.PDF for .NET は、PDF ドキュメントの表を扱うために PdfTable と PdfGrid クラスを提供しています。PdfTable クラスは、書式を少なくした簡単な表を作成するために使用することができます。また、PdfGrid クラスは、複雑な表を作成するために使用することができます。
この2つのクラスの違いは以下のとおりです。
PdfTable | PdfGrid | |
書式 | ||
行 | イベント経由で設定可能、API は未対応。 | API 経由で設定可能。 |
列 | API 経由で設定可能(StringFormat)。 | API 経由で設定可能(StringFormat)。 |
セル | イベント経由で設定可能、API は未対応。 | API 経由で設定可能。 |
その他 | ||
水平方向のセルの結合 | 未対応。 | API経由で設定可能。 |
垂直方向のセルの結合 | イベント経由で設定可能、API は未対応。 | API経由で設定可能。 |
ネストされた表 | イベント経由で設定可能、API は未対応。 | API経由で設定可能。 |
イベント | BeginCellLayout, EndCellLayout, BeginRowLayout, EndRowLayout, BeginPageLayout, EndPageLayout. | BeginPageLayout, EndPageLayout |
以下の2つのセクションでは、PdfTable と PdfGrid クラスを使用して、それぞれ PDF ドキュメントに表を作成する方法について説明します。
まず、Spire.PDF for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。
PM> Install-Package Spire.PDF
以下は、PdfTable クラスを使用して、表を作成する詳細な操作の手順です。
using System;
using System.Data;
using System.Drawing;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Tables;
namespace CreateTable
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentのオブジェクトを作成する
PdfDocument doc = new PdfDocument();
//ページを追加する
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(40));
//PdfTableのオブジェクトを作成する
PdfTable table = new PdfTable();
//表のヘッダーや他のセルのフォントを設定する
table.Style.DefaultStyle.Font = new PdfTrueTypeFont(new Font("Yu Mincho", 12f, FontStyle.Regular), true);
table.Style.HeaderStyle.Font = new PdfTrueTypeFont(new Font("Yu Mincho", 12f, FontStyle.Bold), true);
//DataTableオブジェクトを作成する
DataTable dataTable = new DataTable();
dataTable.Columns.Add("番号");
dataTable.Columns.Add("名前");
dataTable.Columns.Add("部門");
dataTable.Columns.Add("職位");
dataTable.Columns.Add("レベル");
dataTable.Rows.Add(new string[] { "1", "鈴木 賢", "情報部門", "マネージャー", "1" });
dataTable.Rows.Add(new string[] { "3", "中村 佑美", "人事部門", "マネージャー", "1" });
dataTable.Rows.Add(new string[] { "4", "宇田川 希恵", "営業部門", "マネージャー", "1" });
dataTable.Rows.Add(new string[] { "7", "野口 翔", "営業部門", "営業担当者", "2" });
dataTable.Rows.Add(new string[] { "9", "大野 良二", "人事部門", "人事部長", "2" });
dataTable.Rows.Add(new string[] { "11", "川口 美紀", "開発部門", "開発スタッフ", "2" });
//表のデータソースとしてDataTableのオブジェクトを設定する
table.DataSource = dataTable;
//表のヘッダーを表示するように設定します(デフォルトではヘッダーは非表示です)
table.Style.ShowHeader = true;
//表のヘッダー行の文字色と背景色を設定する
table.Style.HeaderStyle.BackgroundBrush = PdfBrushes.Gray;
table.Style.HeaderStyle.TextBrush = PdfBrushes.White;
//表のヘッダー行のテキストアライメントを設定する
table.Style.HeaderStyle.StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
//他のセルのテキストアライメントを設定する
for (int i = 0; i < table.Columns.Count; i++)
{
table.Columns[i].StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
}
//BeginRowLayoutイベントに対応
table.BeginRowLayout += Table_BeginRowLayout;
//ページ上に表を描画する
table.Draw(page, new PointF(0, 30));
//ドキュメントを保存する
doc.SaveToFile("PdfTable.pdf");
}
//イベント処理
private static void Table_BeginRowLayout(object sender, BeginRowLayoutEventArgs args)
{
//行の高さを設定する
args.MinimalHeight = 20f;
//行の背景色を設定する
if (args.RowIndex < 0)
{
return;
}
if (args.RowIndex % 2 == 1)
{
args.CellStyle.BackgroundBrush = PdfBrushes.LightGray;
}
else
{
args.CellStyle.BackgroundBrush = PdfBrushes.White;
}
}
}
}
Imports System
Imports System.Data
Imports System.Drawing
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Tables
Namespace CreateTable
Class Program
Shared Sub Main(ByVal args() As String)
'PdfDocumentのオブジェクトを作成する
Dim doc As PdfDocument = New PdfDocument()
'ページを追加する
Dim page As PdfPageBase = doc.Pages.Add(PdfPageSize.A4, New PdfMargins(40))
'PdfTableのオブジェクトを作成する
Dim table As PdfTable = New PdfTable()
'表のヘッダーや他のセルのフォントを設定する
table.Style.DefaultStyle.Font = New PdfTrueTypeFont(New Font("Yu Mincho", 12.0F, FontStyle.Regular), True)
table.Style.HeaderStyle.Font = New PdfTrueTypeFont(New Font("Yu Mincho", 12.0F, FontStyle.Bold), True)
'DataTableオブジェクトを作成する
Dim dataTable As DataTable = New DataTable()
dataTable.Columns.Add("番号")
dataTable.Columns.Add("名前")
dataTable.Columns.Add("部門")
dataTable.Columns.Add("職位")
dataTable.Columns.Add("レベル")
Dim String() As DataTable.Rows.Add(New
{
"1", "鈴木 賢", "情報部門", "マネージャー", "1"
}
)
Dim String() As DataTable.Rows.Add(New
{
"3", "中村 佑美", "人事部門", "マネージャー", "1"
}
)
Dim String() As DataTable.Rows.Add(New
{
"4", "宇田川 希恵", "営業部門", "マネージャー", "1"
}
)
Dim String() As DataTable.Rows.Add(New
{
"7", "野口 翔", "営業部門", "営業担当者", "2"
}
)
Dim String() As DataTable.Rows.Add(New
{
"9", "大野 良二", "人事部門", "人事部長", "2"
}
)
Dim String() As DataTable.Rows.Add(New
{
"11", "川口 美紀", "開発部門", "開発スタッフ", "2"
}
)
'表のデータソースとしてDataTableのオブジェクトを設定する
table.DataSource = dataTable
'表のヘッダーを表示するように設定します(デフォルトではヘッダーは非表示です)
table.Style.ShowHeader = True
'表のヘッダー行の文字色と背景色を設定する
table.Style.HeaderStyle.BackgroundBrush = PdfBrushes.Gray
table.Style.HeaderStyle.TextBrush = PdfBrushes.White
'表のヘッダー行のテキストアライメントを設定する
table.Style.HeaderStyle.StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
'他のセルのテキストアライメントを設定する
Dim i As Integer
For i = 0 To table.Columns.Count - 1 Step i + 1
table.Columns(i).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
Next
'BeginRowLayoutイベントに対応
table.BeginRowLayout += Table_BeginRowLayout()
'ページ上に表を描画する
table.Draw(page, New PointF(0, 30))
'ドキュメントを保存する
doc.SaveToFile("PdfTable.pdf")
End Sub
'イベント処理
Private Shared Sub Table_BeginRowLayout(ByVal sender As Object, ByVal args As BeginRowLayoutEventArgs)
'行の高さを設定する
args.MinimalHeight = 20.0F
'行の背景色を設定する
If args.RowIndex < 0 Then
Return
End If
If args.RowIndex % 2 = 1 Then
args.CellStyle.BackgroundBrush = PdfBrushes.LightGray
Else
args.CellStyle.BackgroundBrush = PdfBrushes.White
End If
End Sub
End Class
End Namespace
以下は、PdfGrid クラスを使用してテーブルを作成するための詳細な手順です。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Grid;
using System.Drawing;
namespace CreateGrid
{
class Program
{
static void Main(string[] args)
{
//PdfDocumentのオブジェクトを作成する
PdfDocument doc = new PdfDocument();
//ページを追加する
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, new PdfMargins(40));
//PdfGridのオブジェクトを作成する
PdfGrid grid = new PdfGrid();
//セルのパディングを設定する
grid.Style.CellPadding = new PdfPaddings(1, 1, 1, 1);
//フォントを設定する
grid.Style.Font = new PdfTrueTypeFont(new Font("Yu Mincho", 13f, FontStyle.Regular), true);
//行を追加する
PdfGridRow row1 = grid.Rows.Add();
PdfGridRow row2 = grid.Rows.Add();
PdfGridRow row3 = grid.Rows.Add();
PdfGridRow row4 = grid.Rows.Add();
grid.Columns.Add(4);
//列の幅を設定する
foreach (PdfGridColumn col in grid.Columns)
{
col.Width = 110f;
}
//特定のセルにデータを書き込む
row1.Cells[0].Value = "注文・入金状況";
row2.Cells[0].Value = "注文番号";
row2.Cells[1].Value = "日付";
row2.Cells[2].Value = "お客様名";
row2.Cells[3].Value = "支払い完了の有無";
row3.Cells[0].Value = "00223";
row3.Cells[1].Value = "2022/06/02";
row3.Cells[2].Value = "Neighbors Technology";
row3.Cells[3].Value = "支払い完了";
row4.Cells[0].Value = "00224";
row4.Cells[1].Value = "2022/06/03";
row4.Cells[3].Value = "支払い未了";
//水平方向にセルを結合する
row1.Cells[0].ColumnSpan = 4;
//垂直方向にセルを結合する
row3.Cells[2].RowSpan = 2;
//指定したセルのテキストアライメントを設定する
row1.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
row3.Cells[2].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
//指定したセルの背景色を設定する
row1.Cells[0].Style.BackgroundBrush = PdfBrushes.Orange;
row4.Cells[3].Style.BackgroundBrush = PdfBrushes.LightGray;
//枠線の形式を設定する
PdfBorders borders = new PdfBorders();
borders.All = new PdfPen(Color.Orange, 0.8f);
foreach (PdfGridRow pgr in grid.Rows)
{
foreach (PdfGridCell pgc in pgr.Cells)
{
pgc.Style.Borders = borders;
}
}
//ページ上の表を描画する
grid.Draw(page, new PointF(0, 30));
//ドキュメントを保存する
doc.SaveToFile("PdfGrid.pdf");
}
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Grid
Imports System.Drawing
Namespace CreateGrid
Class Program
Shared Sub Main(ByVal args() As String)
'PdfDocumentのオブジェクトを作成する
Dim doc As PdfDocument = New PdfDocument()
'ページを追加する
Dim page As PdfPageBase = doc.Pages.Add(PdfPageSize.A4, New PdfMargins(40))
'PdfGridのオブジェクトを作成する
Dim grid As PdfGrid = New PdfGrid()
'セルのパディングを設定する
grid.Style.CellPadding = New PdfPaddings(1, 1, 1, 1)
'フォントを設定する
grid.Style.Font = New PdfTrueTypeFont(New Font("Yu Mincho", 13.0F, FontStyle.Regular), True)
'行を追加する
Dim row1 As PdfGridRow = grid.Rows.Add()
Dim row2 As PdfGridRow = grid.Rows.Add()
Dim row3 As PdfGridRow = grid.Rows.Add()
Dim row4 As PdfGridRow = grid.Rows.Add()
grid.Columns.Add(4)
'列の幅を設定する
Dim col As PdfGridColumn
For Each col In grid.Columns
col.Width = 110.0F
Next
'特定のセルにデータを書き込む
row1.Cells(0).Value = "注文・入金状況"
row2.Cells(0).Value = "注文番号"
row2.Cells(1).Value = "日付"
row2.Cells(2).Value = "お客様名"
row2.Cells(3).Value = "支払い完了の有無"
row3.Cells(0).Value = "00223"
row3.Cells(1).Value = "2022/06/02"
row3.Cells(2).Value = "Neighbors Technology"
row3.Cells(3).Value = "支払い完了"
row4.Cells(0).Value = "00224"
row4.Cells(1).Value = "2022/06/03"
row4.Cells(3).Value = "支払い未了"
'水平方向にセルを結合する
row1.Cells(0).ColumnSpan = 4
'垂直方向にセルを結合する
row3.Cells(2).RowSpan = 2
'指定したセルのテキストアライメントを設定する
row1.Cells(0).StringFormat = New PdfStringFormat(PdfTextAlignment.Center)
row3.Cells(2).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
'指定したセルの背景色を設定する
row1.Cells(0).Style.BackgroundBrush = PdfBrushes.Orange
row4.Cells(3).Style.BackgroundBrush = PdfBrushes.LightGray
'枠線の形式を設定する
Dim borders As PdfBorders = New PdfBorders()
borders.All = New PdfPen(Color.Orange, 0.8F)
Dim pgr As PdfGridRow
For Each pgr In grid.Rows
Dim pgc As PdfGridCell
For Each pgc In pgr.Cells
pgc.Style.Borders = borders
Next
Next
'ページ上の表を描画する
grid.Draw(page, New PointF(0, 30))
'ドキュメントを保存する
doc.SaveToFile("PdfGrid.pdf")
End Sub
End Class
End Namespace
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。