【Java】 PDFドキュメントにリストを作成する方法

関連する項目をリストでグループ化すると、情報が読みやすくなります。一般的なリストには、順序付きリスト（番号付きリストなど）、順序なしリスト（箇条書きリストなど）、入れ子リスト（複数レベルのリスト）という3つのタイプがあります。今回は、[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使って、**PDFに番号付きリスト、箇条書きリスト、複数レベルのリストを作成する方法**を紹介します。

- **[番号付きリストを作成する](#番号付きリストを作成する)**
- **[箇条書きリストを作成する](#箇条書きリストを作成する)**
-  **[ネストされたリストを作成する](#ネストされたリストを作成する)**

## 【依存関係の追加】

> **この方法は、無料のFree Spire.PDF for Javaが必要ですので、先にjarファイルをインポートしてください。**

### 1. Maven

Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR ファイルをインポートすることができます。

```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>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```

### 2. 公式サイトよりJarファイルをダウンロード

まず、[Free Spire.PDF for Java](https://jp.e-iceblue.com/download/free-spire-pdf-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。

## 【予備知識】
Free Spire.PDF for Javaは、PDFドキュメント内で順序付きリストと順序なしリストを扱うために、**PdfSortedList** クラスと **PdfUnorderedList** クラスを提供します。次の表は、この記事に関わる重要なクラス、メソッド、およびプロパティを一覧にしています。

|クラス・メソッド|説明|
|----|----|
|PdfDocument クラス|PDF ドキュメントモデルを表す。|
|PdfMargins クラス|PDFドキュメントの左、右、上、下の余白を表します。|
|PdfPageBase クラス|PDF ドキュメントのページを表します。|
|PdfBrush クラス|領域やテキストを塗りつぶすために使用されるブラシを表します。|
|PdfTrueTypeFont クラス|テキストの特定の形式を定義するフォントを表し、フォントの書体、サイズ、スタイル属性が含まれます。|
|PdfSortedList クラス| PDF ドキュメント内の整理されたリストを表します。|
|PdfUnsortedList クラス| PDF ドキュメント内の未整理リストを表します。|
|PdfSortedList.Draw() メソッド| PDF ドキュメントのページ上の指定した位置に整理されたリストを描画します。|
|PdfUnsortedList.Draw() メソッド| PDF ドキュメントのページ上の特定の位置に未整理リストを描画する。|
|PdfOrderedMarker クラス|順序付きリストのマーカーを表します。|
|PdfSortedList.getItems() メソッド|指定されたリストの項目を取得する。|
|PdfListItem クラス|指定されたリストの項目を表します。|
|PdfListItem.setSubList() メソッド|リストの項目にサブリストを追加する。|
|PdfDocument.saveToFile() メソッド| PdfDocument クラスのオブジェクトを PDF ドキュメントに保存します。|

## 番号付きリストを作成する

> **番号付きリストの作成手順は次のとおりです。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfMargins** クラスでマージンを設定する。
- **PdfDocument.getPages().add()** メソッドを使用して、ドキュメントにページを追加する。
- **PdfBrush** クラスのオブジェクトと **PdfTrueTypeFont** クラスのオブジェクトを作成します。
- **PdfSortedList** クラスのインスタンスを作成し、リストの内容、フォント、インデント、ブラシを指定します。
- **PdfSortedList.draw()** メソッドを使用して、ページの指定された位置にリストを描画します。
- **PdfDocument.saveToFile()** メソッドを使用してPDFドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.PdfPageSize;
import com.spire.pdf.graphics.*;
import com.spire.pdf.lists.PdfSortedList;

import java.awt.*;

public class createNumberedList {
    public static void main(String[] args) {

        //PdfDocument クラスのオブジェクトを作成する
        PdfDocument doc = new PdfDocument();

        //余白を設定する
        PdfMargins margins = new PdfMargins(30);

        //ページを追加する
        PdfPageBase page = doc.getPages().add(PdfPageSize.A4, margins);

        //初期座標を指定する
        float x = 0;
        float y = 0;

        //タイトルを描く
        PdfBrush brush = PdfBrushes.getBrown();
        PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Yu Mincho", Font.BOLD, 20));
        String title = "Javaを簡単に学ぶための4つのヒント";
        page.getCanvas().drawString(title, titleFont, brush, x, y);
        y = y + (float) titleFont.measureString(title).getHeight();
        y = y + 5;

        //番号付きリストを描く
        PdfBrush brush1 = PdfBrushes.getBlack();
        PdfTrueTypeFont listFont = new PdfTrueTypeFont(new Font("Yu Mincho", Font.PLAIN, 12));
        String listContent = "基礎から学び始める。\n"
                +"こまめにメモを取る。\n"
                +"小さなプロジェクトに挑戦してみる。\n"
                +"毎日、コーディングの練習をする。";
        PdfSortedList list = new PdfSortedList(listContent);
        list.setFont(listFont);
        list.setIndent(8);
        list.setTextIndent(5);
        list.setBrush(brush1);
        list.draw(page, 0, y);

        //ドキュメントを保存する
        doc.saveToFile("番号付きリスト.pdf");
    }
}
```

### 【出力されるPDFドキュメント】

![番号付きリストを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/78e6ff1e-9a09-6341-c3f5-8649c711c649.png)

## 箇条書きリストを作成する

> **箇条書きリストの作成手順は、以下の通りです。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfMargins** クラスでマージンを設定する。
- **PdfDocument.getPages().add()** メソッドを使用して、ドキュメントにページを追加する。
- **PdfBrush** クラスのオブジェクトと **PdfTrueTypeFont** クラスのオブジェクトを作成します。
- **PdfUnsortedList** クラスのインスタンスを作成し、リストの内容、フォント、インデント、およびブラシを指定します。
- **PdfUnorderedList.draw()** メソッドを用いて、ページの指定された位置にリストを描画します。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.PdfPageSize;
import com.spire.pdf.graphics.*;
import com.spire.pdf.lists.PdfUnorderedList;

import java.awt.*;

public class createBulletedList {

    public static void main(String[] args) {

        //PdfDocument オブジェクトを作成する
        PdfDocument doc = new PdfDocument();

        //余白を設定する
        PdfMargins margin = new PdfMargins(30);

        //ページを追加する
        PdfPageBase page = doc.getPages().add(PdfPageSize.A4, margin);

        //初期座標を指定する
        float x = 0;
        float y = 0;

        //タイトルを描く
        PdfBrush brush = PdfBrushes.getCyan();
        PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Yu Mincho", Font.BOLD, 20));
        String title = "減量に最も向かない果物";
        page.getCanvas().drawString(title, titleFont, brush, x, y);
        y = y + (float) titleFont.measureString(title).getHeight();
        y = y + 5;

        //箇条書きリストを描く
        PdfBrush brush1 = PdfBrushes.getBlack();
        PdfTrueTypeFont listFont = new PdfTrueTypeFont(new Font("Yu Mincho", Font.PLAIN, 12));
        String listContent = "バナナ\n"
                +"ブドウ\n"
                +"ザクロ\n"
                +"林檎\n"
                +"ブルーベリー";
        PdfUnorderedList list = new PdfUnorderedList(listContent);
        list.setFont(listFont);
        list.setIndent(8);
        list.setTextIndent(5);
        list.setBrush(brush1);
        list.draw(page, 0, y);

        //ドキュメントを保存する
        doc.saveToFile("箇条書きリスト.pdf");
    }
}
```

### 【出力されるPDFドキュメント】

![箇条書きリストを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/f701cd57-a6fd-4813-8c34-1c58ee640656.png)

## ネストされたリストを作成する

> **複数レベルのリストを作成する主な手順は次のとおりです。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfMargins** クラスでマージンを設定する。
- **PdfDocument.getPages().add()** メソッドを使用して、ドキュメントにページを追加する。
- **PdfBrush** クラスのオブジェクトと **PdfTrueTypeFont** クラスのオブジェクトを作成します。
- レベル1のリストを作成します。
- 2つのレベル2のリストを作成し、それらを子リストとしてレベル1のリストに追加します。
- レベル3のリストを作成し、子リストとしてレベル2のリストに追加します。
- **PdfSortedList.draw()** メソッドを使用して、リストを描画します。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfNumberStyle;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.PdfPageSize;
import com.spire.pdf.graphics.*;
import com.spire.pdf.lists.PdfListItem;
import com.spire.pdf.lists.PdfOrderedMarker;
import com.spire.pdf.lists.PdfSortedList;

import java.awt.*;
import java.awt.geom.Point2D;

public class createMultiLevelList {

    public static void main(String[] args) {

        //PdfDocument クラスのオブジェクトを作成する
        PdfDocument doc = new PdfDocument();

        //余白を設定する
        PdfMargins margin = new PdfMargins(30);

        //ページを追加する
        PdfPageBase page = doc.getPages().add(PdfPageSize.A4, margin);

        //初期座標を指定する
        float x = 0;
        float y = 0;

        //2つのPdfBrushクラスのオブジェクトを作成する
        PdfBrush blackBrush = PdfBrushes.getBlack();
        PdfBrush purpleBrush = PdfBrushes.getPurple();

        //2つのPdfTrueTypeFontクラスのオブジェクトを作成する
        PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new java.awt.Font("Yu Gothic UI Semibold", Font.BOLD, 20));
        PdfTrueTypeFont listFont = new PdfTrueTypeFont(new java.awt.Font("Yu Mincho Demibold", Font.PLAIN, 12));

        //タイトルを描く
        String title = "複数レベルのリスト";
        page.getCanvas().drawString(title, titleFont, blackBrush, x, y);
        y = y + (float) titleFont.measureString(title).getHeight();
        y = y + 5;

        //整理されたリストの番号スタイルを定義するために使用される、2つの順序付きリストのマーカーを作成する
        PdfOrderedMarker marker1 = new PdfOrderedMarker(PdfNumberStyle.Numeric, listFont);
        PdfOrderedMarker marker2 = new PdfOrderedMarker(PdfNumberStyle.Numeric, listFont);

        //レベル1のリストを作成する
        String parentListContent = "項目 1\n"
                + "項目 2";
        PdfSortedList parentList = new PdfSortedList(parentListContent);
        parentList.setFont(listFont);
        parentList.setIndent(8);
        parentList.setBrush(purpleBrush);
        parentList.setMarker(marker1);

        //レベル2のリストを作成する
        String subListContent_1 = "子項目 1-1\n"
                + "子項目 1-2";
        PdfSortedList subList_1 = new PdfSortedList(subListContent_1);
        subList_1.setIndent(16);
        subList_1.setFont(listFont);
        subList_1.setBrush(purpleBrush);
        subList_1.setMarker(marker2);
        subList_1.setMarkerHierarchy(true);

        //別のレベル2のリストを作成する
        String subListContent_2 = "子項目 2-1\n"
                + "子項目 2-2\n"
                + "子項目 2-3";
        PdfSortedList subList_2 = new PdfSortedList(subListContent_2);
        subList_2.setIndent(16);
        subList_2.setFont(listFont);
        subList_2.setBrush(purpleBrush);
        subList_2.setMarker(marker2);
        subList_2.setMarkerHierarchy(true);

        //レベル3のリストを作成する
        String subSubListContent = "子項目 1-1-1\n"
                + "子項目 1-1-2";
        PdfSortedList subSubList = new PdfSortedList(subSubListContent);
        subSubList.setIndent(24);
        subSubList.setFont(listFont);
        subSubList.setBrush(purpleBrush);
        subSubList.setMarker(marker2);
        subSubList.setMarkerHierarchy(true);

        //最初のレベル2のリストをレベル1のリストの最初の項目の子リストとして設定する
        PdfListItem item_1 = parentList.getItems().get(0);
        item_1.setSubList(subList_1);

        //第2のレベル2のリストをレベル1のリストの第2項目の子リストとして設定する
        PdfListItem item_2 = parentList.getItems().get(1);
        item_2.setSubList(subList_2);

        //レベル3のリストを最初のレベル2のリストの子リストとして設定する
        PdfListItem item_1_1 = subList_1.getItems().get(0);
        item_1_1.setSubList(subSubList);

        //リストを描く
        PdfTextLayout textLayout = new PdfTextLayout();
        textLayout.setBreak(PdfLayoutBreakType.Fit_Page);
        textLayout.setLayout(PdfLayoutType.Paginate);
        parentList.draw(page,new Point2D.Float(x,y),textLayout);

        //ドキュメントを保存する
        doc.saveToFile("複数レベルのリスト.pdf");
    }
}
```

### 【出力されるPDFドキュメント】

![ネストされたリストを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/fae6af53-05e9-db7d-6635-bced472013ba.png)

> **この記事では、PDFドキュメントにリストを作成する方法について説明します。PDFドキュメントでは、リストは非常に便利です。もっと詳しく知りたい方は、[Spire.PDF Forum](https://www.e-iceblue.com/forum/spire-pdf-f7.html)をご覧ください。**