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?

Java で PDF を操作:単一ページ・複数ページ・空白ページの削除

0
Posted at

バックエンド開発やドキュメント自動化システムにおいて、PDF から一部のページを除去するニーズは頻繁に発生します。例えば、表紙の除去、空白ページのクリーンアップ、無効な添付ページのフィルタリングなどです。Java エコシステムには多数の PDF 処理コンポーネントが存在しますが、本記事では Free Spire.PDF for Java の無料版を使用してページ削除機能を実装する方法を、単一ページ・複数ページの削除といった一般的なシナリオに沿って紹介します。

1. 環境設定

Maven 方式

pom.xml にリポジトリと依存関係を追加します。

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.pdf.free</artifactId>
    <version>9.13.0</version>
</dependency>

重要なお知らせ:Free Spire.PDF for Java は、出力結果の処理には 10 ページの制限があります。ページ数が多くないドキュメントでの使用に適しています。

2. 単一ページの削除

ページ削除のコアメソッドは PdfDocument.getPages().removeAt(int index) で、ページインデックス(0 始まり)を指定して特定のページを削除します。

import com.spire.pdf.PdfDocument;

public class DeletePage {
    public static void main(String[] args) {
        // PdfDocument インスタンスを作成
        PdfDocument pdf = new PdfDocument();
        // PDF ドキュメントを読み込み
        pdf.loadFromFile("sample.pdf");
        // 2 ページ目を削除(インデックスは 0 始まり、1 は 2 ページ目を指す)
        pdf.getPages().removeAt(1);
        // ドキュメントを保存
        pdf.saveToFile("output/deletePage.pdf");
        pdf.close();
    }
}

注意事項:ページ番号は 0 からカウントされるため、一般的な「1 ページ目 = 1」と混同しやすいです。操作前に必ずインデックスを確認してください。削除操作は元に戻せないため、処理前に元ファイルをバックアップすることを推奨します。
DeletePDFpage日.png

3. 複数ページの削除

複数ページを一度に削除する場合、必ず後ろから前に向かって削除する必要があります。先頭から順に削除すると、前方のページを削除した後に後続のページインデックスが変動し、誤った削除を引き起こす可能性があります。

import com.spire.pdf.PdfDocument;
import java.util.Arrays;

public class DeleteMultiplePages {
    public static void main(String[] args) {
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("sample.pdf");
        
        // 削除するページインデックス:2、4、6 ページ目(インデックスは 0 始まり)
        int[] pagesToDelete = {1, 3, 5};
        // ソートした後、後ろから前に削除
        Arrays.sort(pagesToDelete);
        for (int i = pagesToDelete.length - 1; i >= 0; i--) {
            pdf.getPages().removeAt(pagesToDelete[i]);
        }
        
        pdf.saveToFile("output/deleteMultiplePages.pdf");
        pdf.close();
    }
}

4. 空白ページの削除

インデックス指定による削除のほか、空白ページを自動検出して除去することも可能です。isBlank() メソッドは、ページが完全に空白(テキスト・画像・グラフィック要素を一切含まない)かどうかを判定します。

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;

public class RemoveBlankPages {
    public static void main(String[] args) {
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("sample.pdf");
        
        // 後ろから前に向けて走査
        for (int i = pdf.getPages().getCount() - 1; i >= 0; i--) {
            PdfPageBase page = pdf.getPages().get(i);
            if (page.isBlank()) {
                pdf.getPages().remove(page);
            }
        }
        
        pdf.saveToFile("output/removeBlankPages.pdf");
        pdf.close();
    }
}

注意:ページに白い画像のみが含まれる場合や極端に薄い内容しかない場合、isBlank() が正しく認識できない可能性があります。その場合は、ページを画像に変換した後、ピクセル分析によって空白かどうかを判定する方法も検討してください。


Java を使用した PDF ページ削除ロジックは非常にシンプルで、核心は次の 3 ステップです。ドキュメントを読み込み、ページ削除を実行し、保存してリソースを解放する。開発時にはインデックスが 0 始まりであること、複数ページ削除では後ろから前に走査すること、リソース解放を確実に行うことの 3 点に注意すれば、安定したページ削除機能を実現でき、日常的な 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?