PDF ドキュメントには、まれに空白ページが含まれていることがあります。こうしたページは閲覧体験を損なうだけでなく、ファイルサイズを無駄に大きくしたり、印刷時に紙の無駄を生む原因にもなります。
PDF の品質とプロフェッショナリズムを高めるためには、空白ページを検出して削除することが重要です。
この記事では、Python と Spire.PDF for Python、さらに Pillow を利用して、見た目にも正確に空白ページを検出・削除する方法を解説します。
見た目は空白でも実際には不可視要素(透明オブジェクトや白文字など)が含まれているケースにも対応します。
記事の構成
必要なライブラリのインストール
このチュートリアルでは、以下の2つの Python ライブラリを使用します:
- Spire.PDF for Python:PDF の読み込みや空白ページの検出・削除に使用します。
- Pillow:画像処理用ライブラリで、見た目が空白に見えるページを正確に判定するのに役立ちます。
インストールは次のコマンドで簡単に行えます:
pip install Spire.PDF Pillow
PythonでPDFの空白ページを正確に検出・削除する方法
Spire.PDF には、ページが完全に空であるかどうかを確認できる PdfPageBase.IsBlank() メソッドが用意されています。 しかし、ページによっては一見空白に見えても、白文字のテキストや透過画像、透かしなどが含まれている場合があります。 そのため、このメソッドだけでは正確に空白ページを検出できないケースがあります。
より精度を高めるために、この記事では次の2段階の検出方法を採用します:
- PdfPageBase.IsBlank() メソッドで完全に空のページを検出・削除する。
- 空白でないページを画像に変換し、Pillow を使って実際に真っ白なページかどうかを解析する。
注意点: PDF を画像に変換する際、有効なライセンスを適用していないと評価版の透かしが画像に追加されます。 これが検出結果に影響する可能性があるため、テスト時は一時ライセンスの取得をおすすめします。
一時ライセンスは E-iceblue セールスチーム へお問い合わせください。
また、小規模な処理であれば、透かしなしで基本機能を利用できる Free Spire.PDF for Python を使うこともできます。
PythonでPDFの空白ページを検出・削除する手順
以下の手順で空白ページの検出と削除を実装します。
空白画像を判定する関数 is_blank_image() を定義する Pillow を使用して、ページを画像に変換した結果が真っ白(全ピクセルが白)かどうかを判定します。
PDFドキュメントを読み込む PdfDocument.LoadFromFile() メソッドを使って PDF ファイルを読み込みます。
ページを順に確認する 各ページをループ処理で確認し、次の2つの条件をチェックします:
- PdfPageBase.IsBlank() が True の場合は、ページを直接削除します。
- それ以外の場合は、ページを画像化して is_blank_image() 関数で分析します。
処理結果のPDFを保存する PdfDocument.SaveToFile() メソッドを使って、空白ページを削除した新しいPDFを保存します。
サンプルコード:
import io
from spire.pdf import PdfDocument
from PIL import Image
# ライセンスキーの適用
License.SetLicenseKey("License-Key")
# 画像が空白かどうかを確認する関数
def is_blank_image(image):
img = image.convert("RGB")
white_pixel = (255, 255, 255)
return all(pixel == white_pixel for pixel in img.getdata())
# PDFを読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample1111.pdf")
# 削除時のインデックスずれを防ぐため、逆順でページを確認
for i in range(pdf.Pages.Count - 1, -1, -1):
page = pdf.Pages[i]
if page.IsBlank():
pdf.Pages.RemoveAt(i)
else:
with pdf.SaveAsImage(i) as image_data:
image_bytes = image_data.ToArray()
pil_image = Image.open(io.BytesIO(image_bytes))
if is_blank_image(pil_image):
pdf.Pages.RemoveAt(i)
# 結果を保存
pdf.SaveToFile("RemoveBlankPages.pdf")
pdf.Close()
以下は、空白ページ削除後のプレビューです:
よくある質問(FAQ)
Q1:PDFの「空白ページ」とはどのようなものですか?
A:完全に何もないページのほか、白文字や透過オブジェクト、透かしなど見えない要素を含むページも空白ページとみなされます。 このソリューションでは、2段階の検出で両方のケースに対応します。
Q2:Spire.PDFのライセンスがなくても使えますか?
A:はい、ライセンスなしでも動作します。ただし、PDFを画像に変換する際に評価版の透かしが追加されるため、空白ページ検出の精度に影響する可能性があります。 テスト用途の場合は、無料の一時ライセンスを申請するのがおすすめです。
Q3:Spire.PDFはどのPythonバージョンに対応していますか?
A:Spire.PDF for Python は Python 3.7以降 に対応しています。画像解析を行う場合は、Pillow も併せてインストールしてください。
Q4:削除せずに検出だけ行いたい場合は?
A:可能です。pdf.Pages.RemoveAt(i) の行をコメントアウトし、print() や logging で空白ページのリストを出力するだけでOKです。
まとめ
PDF から不要な空白ページを削除することは、可読性の向上やファイルサイズの削減、そしてよりプロフェッショナルな仕上がりに欠かせない工程です。 Spire.PDF for Python と Pillow を組み合わせることで、完全に空のページだけでなく、見た目は空白でも内部に不可視要素を含むページも正確に検出できます。
レポート生成、スキャン文書の整理、印刷前の最終調整など、あらゆるシーンで役立つ実用的な Python ソリューションです。