0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonを使用して1つのPDFページを複数に分割する

0
Posted at

PDFページの分割は、一般的なドキュメント処理のニーズの一つです。単一ページのコンテンツが多すぎる場合や、段組みレイアウトが含まれる場合、あるいは大判ページをより小さな用紙に適合させる必要がある場合などに、1ページを複数ページに分割することで、ドキュメントの可読性と印刷適合性を大幅に向上させることができます。

Free Spire.PDF for Pythonは、テンプレート描画メカニズムに基づいたページ分割ソリューションを提供しており、Adobe Acrobatなどのサードパーティ製ソフトウェアに依存せずにこの操作を実行できます。

環境準備

Free Spire.PDF for Pythonはpipで直接インストールできます:

pip install Spire.PDF.Free

インストール時にplum-dispatch依存関係が自動的に取得されます。このライブラリはスタンドアロンのPython PDF APIであり、システムに他のPDFツールをインストールする必要はありません。

⚠️ 注意:無料版には10ページのページ数制限があり、PDFドキュメントの作成・読み込み時に、ドキュメントが10ページを超えないことが求められます。

コアAPIと実装原理

Free Spire.PDF for Pythonのページ分割メカニズムは、PdfPageBase.CreateTemplate()PdfTemplate.Draw()メソッドに基づいています。その中核ロジックは、ソースページのコンテンツをテンプレートオブジェクトにレンダリングし、そのテンプレートを新しいPDFドキュメントのページに描画することです。

主要なAPIは次のとおりです:

クラス/メソッド 役割
PdfDocument PDFドキュメントのエントリクラス。読み込み、保存、ページ管理を担当
PdfDocument.LoadFromFile() ソースPDFファイルを読み込む
PdfDocument.Pages.get_Item() インデックスで指定されたページを取得
PdfPageBase.CreateTemplate() ページから再利用可能な描画テンプレートを作成
PdfTemplate.Draw() テンプレートコンテンツをターゲットページに描画
PdfDocument.PageSettings 新しいドキュメントのページサイズと余白を制御

分割する際には、新しいドキュメントのPageSettings.WidthおよびPageSettings.Heightを調整して、ターゲットページのサイズを制御します。テンプレートコンテンツがターゲットページのサイズを超えた場合、ライブラリは自動的に新しいページを作成し、残りのコンテンツの描画を続行します。

水平分割:1ページを上下に2ページに分割する

水平分割(Horizontal Splitting)は、縦方向にコンテンツが長すぎるページを水平方向に分割して上下2つの部分に分ける場合に適しています。たとえば、長いテーブルや長文テキストを連続する2ページに分割します。

以下のコードは、PDFの最初のページを中央から水平に2つのページに分割する方法を示しています:

from spire.pdf import *
from spire.pdf.common import *

# ソースPDFドキュメントを読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

# 最初のページを取得(インデックスは0から始まる)
page = pdf.Pages.get_Item(0)

# 新しいPDFドキュメントを作成
newPdf = PdfDocument()
# 余白を0に設定し、描画時のずれを防ぐ
newPdf.PageSettings.Margins.All = 0.0

# ソースページの幅と高さを取得
width = page.Size.Width
height = page.Size.Height

# 水平分割:幅はそのまま、高さはソースページの半分に設定
newPdf.PageSettings.Width = width
newPdf.PageSettings.Height = height / 2

# 新しいページを追加し、テンプレートコンテンツを描画
newPage = newPdf.Pages.Add()
page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0))

# 分割後のドキュメントを保存
newPdf.SaveToFile("output/HorizontalSplit.pdf")
pdf.Close()
newPdf.Close()

実行ロジック

  1. newPdf.PageSettings.Height = height / 2 でターゲットページの高さをソースページの半分に設定;
  2. page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0)) でソースページの上部から描画開始;
  3. ターゲットページの下部に達すると、残りのコンテンツは自動的に新しいページにオーバーフローします。

最終的に出力されるPDFには、ソースページの上半分と下半分にそれぞれ対応する2つのページが含まれます。
SplitPDFPage.png

垂直分割:1ページを左右に2ページに分割する

垂直分割(Vertical Splitting)は、横方向の幅が大きいページや段組みレイアウトを含むページを垂直方向に分割する場合に適しています。たとえば、A3サイズの新聞レイアウトを2つのA4ページに分割します。

from spire.pdf import *
from spire.pdf.common import *

pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

page = pdf.Pages.get_Item(0)

newPdf = PdfDocument()
newPdf.PageSettings.Margins.All = 0.0

width = page.Size.Width
height = page.Size.Height

# 垂直分割:高さはそのまま、幅はソースページの半分に設定
newPdf.PageSettings.Width = width / 2
newPdf.PageSettings.Height = height

newPage = newPdf.Pages.Add()
page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0))

newPdf.SaveToFile("output/VerticalSplit.pdf")
pdf.Close()
newPdf.Close()

水平分割との違いは、ターゲットページの幅と高さの設定のみです。垂直分割では高さをそのままにし、幅をソースページの半分に設定します。

SplitPDFPageV.png

任意の分割比率およびグリッド分割への拡張

上記の例では二等分分割を示しました。PageSettings.WidthおよびPageSettings.Heightの比率係数を調整することで、任意の比率での分割が可能です:

# 1/3の比率で水平分割(1ページを3ページに分割)
newPdf.PageSettings.Width = width
newPdf.PageSettings.Height = height / 3

# 1/4の比率で垂直分割(1ページを4ページに分割)
newPdf.PageSettings.Width = width / 4
newPdf.PageSettings.Height = height

1ページをグリッド状の複数ページに分割する必要があるシナリオ(例:大きなポスターを2×2の4ページに分割する)では、上記の2つの方法を組み合わせることができます。まず水平分割して中間ドキュメントを作成し、次に中間ドキュメントの各ページに対して垂直分割を実行するか、または逆の順序で実行します。

複数ページドキュメントの一括分割

PDF内の複数のページをそれぞれ分割する必要がある場合は、pdf.Pagesコレクションを反復処理し、各ページに対して同じ分割ロジックを実行するだけです:

from spire.pdf import *
from spire.pdf.common import *

pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

for i in range(pdf.Pages.Count):
    page = pdf.Pages.get_Item(i)
    
    newPdf = PdfDocument()
    newPdf.PageSettings.Margins.All = 0.0
    
    width = page.Size.Width
    height = page.Size.Height
    
    # 必要に応じて水平または垂直分割を選択
    newPdf.PageSettings.Width = width
    newPdf.PageSettings.Height = height / 2
    
    newPage = newPdf.Pages.Add()
    page.CreateTemplate().Draw(newPage, PointF(0.0, 0.0))
    
    newPdf.SaveToFile(f"output/Split_Page_{i+1}.pdf")
    newPdf.Close()

pdf.Close()

まとめ

CreateTemplate() + Draw() によるテンプレート描画メカニズムを利用することで、柔軟で制御可能なPDFページ分割ソリューションを実現できます。開発者はターゲットページのWidthおよびHeightプロパティを調整するだけで、水平、垂直、または任意の比率でのページ分割が可能です。この方法は外部PDFツールに依存せず、実装もシンプルで、レポート分割、大判ページの適合、段組みレイアウトの再構築などのシーンに適しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?