既存のPDF内のテーブルを操作する
既存のPDFでテーブルを操作する
Aspose.PDF for Python via .NETで最も初期にサポートされた機能の一つがテーブルの操作であり、ゼロから生成されたPDFファイルや既存のPDFファイルにテーブルを追加するための優れたサポートを提供しています。この新しいリリースでは、PDFドキュメントのページに既に存在するシンプルなテーブルを検索および解析する新機能を実装しました。TableAbsorberという新しいクラスがこれらの機能を提供します。TableAbsorberの使用法は既存のTextFragmentAbsorberクラスと非常に似ています。以下のコードスニペットは、特定のテーブルセルの内容を更新する手順を示しています。
import aspose.pdf as ap
# 既存のPDFファイルを読み込む
pdf_document = ap.Document(input_file)
# テーブルを見つけるためのTableAbsorberオブジェクトを作成する
absorber = ap.text.TableAbsorber()
# 最初のページをアブソーバーで訪問する
absorber.visit(pdf_document.pages[1])
# ページ上の最初のテーブル、その最初のセル、およびその中のテキストフラグメントにアクセスする
fragment = absorber.table_list[0].row_list[0].cell_list[0].text_fragments[1]
# セル内の最初のテキストフラグメントのテキストを変更する
fragment.text = "hi world"
pdf_document.save(output_file)
PDFドキュメント内の古いテーブルを新しいものに置き換える
特定のテーブルを見つけて希望のテーブルに置き換える必要がある場合は、TableAbsorberクラスのreplace()メソッドを使用してそれを行うことができます。以下の例は、PDFドキュメント内のテーブルを置き換える機能を示しています:
import aspose.pdf as ap
# 既存のPDFドキュメントをロード
pdf_document = ap.Document(input_file)
# テーブルを見つけるためのTableAbsorberオブジェクトを作成
absorber = ap.text.TableAbsorber()
# 最初のページをアブソーバーで訪問
absorber.visit(pdf_document.pages[1])
# ページ上の最初のテーブルを取得
table = absorber.table_list[0]
# 新しいテーブルを作成
new_table = ap.Table()
new_table.column_widths = "100 100 100"
new_table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 1)
row = new_table.rows.add()
row.cells.add("Col 1")
row.cells.add("Col 2")
row.cells.add("Col 3")
# テーブルを新しいものに置き換える
absorber.replace(pdf_document.pages[1], table, new_table)
# ドキュメントを保存
pdf_document.save(output_file)
現在のページでテーブルが壊れるかどうかを判断する方法
このコードは、テーブルを含むPDFドキュメントを生成し、ページ上の利用可能なスペースを計算し、テーブルにさらに行を追加することでスペースの制約に基づいてページが壊れるかどうかを確認します。結果は出力ファイルに保存されます。
import aspose.pdf as ap
# PDFクラスのオブジェクトをインスタンス化する
pdf = ap.Document()
# PDFドキュメントのセクションコレクションにセクションを追加する
page = pdf.pages.add()
# テーブルオブジェクトをインスタンス化する
table1 = ap.Table()
table1.margin.top = 300
# 指定したセクションの段落コレクションにテーブルを追加する
page.paragraphs.add(table1)
# テーブルの列幅を設定する
table1.column_widths = "100 100 100"
# BorderInfoオブジェクトを使用してデフォルトのセル境界線を設定する
table1.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
# 別のカスタマイズされたBorderInfoオブジェクトを使用してテーブル境界線を設定する
table1.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
# MarginInfoオブジェクトを作成し、左、下、右、上のマージンを設定する
margin = ap.MarginInfo()
margin.top = 5
margin.left = 5
margin.right = 5
margin.bottom = 5
# MarginInfoオブジェクトにデフォルトのセル余白を設定する
table1.default_cell_padding = margin
# カウンタを17に増やすと、テーブルが壊れます
# これ以上このページに収容できないためです
for row_counter in range(0, 17):
# テーブルに行を作成し、その行にセルを作成する
row1 = table1.rows.add()
row1.cells.add("col " + str(row_counter) + ", 1")
row1.cells.add("col " + str(row_counter) + ", 2")
row1.cells.add("col " + str(row_counter) + ", 3")
# ページの高さ情報を取得する
page_height = pdf.page_info.height
# ページの上部と下部のマージン、テーブルの上部マージン、テーブルの高さの
# 合計高さ情報を取得する
total_objects_height = page.page_info.margin.top + page.page_info.margin.bottom + table1.margin.top + \
table1.get_height(None)
# ページ高さ、テーブル高さ、テーブル上部マージン、ページ上部と
# 下部マージン情報を表示する
print("PDFドキュメントの高さ = " + str(pdf.page_info.height) + "\n上部マージン情報 = " + str(page.page_info.margin.top)
+ "\n下部マージン情報 = " + str(page.page_info.margin.bottom) + "\n\nテーブル上部マージン情報 = "
+ str(table1.margin.top) + "\n平均行の高さ = " + str(table1.rows[0].min_row_height) + " \nテーブルの高さ "
+ str(table1.get_height(None)) + "\n ----------------------------------------" + "\n総ページの高さ ="
+ str(page_height) + "\nテーブルを含む累積の高さ =" + str(total_objects_height))
# ページの上部マージン、ページの下部マージン +
# テーブルの上部マージンとテーブルの高さの合計をページの高さから引いたときに
# 10未満であるかどうかを確認する(平均行の高さは10を超える可能性があります)
if (page_height - total_objects_height) <= 10:
# 値が10未満の場合、メッセージを表示します。
# これは、別の行を追加できず、新しい行を追加すると
# テーブルが壊れることを示します。これは行の高さの値に依存します。
print("ページの高さ - オブジェクトの高さ < 10 のため、テーブルが壊れます")
# PDFドキュメントを保存する
pdf.save(output_file)
テーブルに繰り返し列を追加する
Aspose.Pdf.Table クラスでは、テーブルが縦に長すぎて次のページにオーバーフローする場合に行を繰り返す repeating_rows_count を設定できます。しかし、場合によっては、テーブルが幅広すぎて1ページに収まらず、次のページに続ける必要があります。この目的を達成するために、Aspose.Pdf.Table クラスに repeating_columns_count プロパティを実装しました。このプロパティを設定すると、テーブルは列ごとに次のページに分割され、指定された列数が次のページの先頭で繰り返されます。以下のコードスニペットは、repeating_columns_count プロパティの使用例を示しています:
import aspose.pdf as ap
# 新しいドキュメントを作成
doc = ap.Document()
page = doc.pages.add()
# ページ全体を占める外側のテーブルをインスタンス化
outer_table = ap.Table()
outer_table.column_widths = "100%"
outer_table.horizontal_alignment = ap.HorizontalAlignment.LEFT
# 同じページ内で分割される外側のテーブル内にネストされるテーブルオブジェクトをインスタンス化
my_table = ap.Table()
my_table.broken = ap.TableBroken.VERTICAL_IN_SAME_PAGE
my_table.column_adjustment = ap.ColumnAdjustment.AUTO_FIT_TO_CONTENT
# 外側のテーブルをページの段落に追加
# 外側のテーブルに自分のテーブルを追加
page.paragraphs.add(outer_table)
body_row = outer_table.rows.add()
body_cell = body_row.cells.add()
body_cell.paragraphs.add(my_table)
my_table.repeating_columns_count = 5
page.paragraphs.add(my_table)
# ヘッダー行を追加
row = my_table.rows.add()
row.cells.add("header 1")
row.cells.add("header 2")
row.cells.add("header 3")
row.cells.add("header 4")
row.cells.add("header 5")
row.cells.add("header 6")
row.cells.add("header 7")
row.cells.add("header 11")
row.cells.add("header 12")
row.cells.add("header 13")
row.cells.add("header 14")
row.cells.add("header 15")
row.cells.add("header 16")
row.cells.add("header 17")
for row_counter in range(0, 6):
# テーブル内に行を作成し、その後行内にセルを作成
row1 = my_table.rows.add()
row1.cells.add("col " + str(row_counter) + ", 1")
row1.cells.add("col " + str(row_counter) + ", 2")
row1.cells.add("col " + str(row_counter) + ", 3")
row1.cells.add("col " + str(row_counter) + ", 4")
row1.cells.add("col " + str(row_counter) + ", 5")
row1.cells.add("col " + str(row_counter) + ", 6")
row1.cells.add("col " + str(row_counter) + ", 7")
row1.cells.add("col " + str(row_counter) + ", 11")
row1.cells.add("col " + str(row_counter) + ", 12")
row1.cells.add("col " + str(row_counter) + ", 13")
row1.cells.add("col " + str(row_counter) + ", 14")
row1.cells.add("col " + str(row_counter) + ", 15")
row1.cells.add("col " + str(row_counter) + ", 16")
row1.cells.add("col " + str(row_counter) + ", 17")
doc.save(output_file)