Javaでタグ付きPDFを作成する方法

タグ付きPDFファイルは、構造要素を持つPDFファイルです。これらは、補助技術に依存するユーザがコンテンツにアクセスできるようにするために使用されます。[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/spire-pdf-for-java.html)は、Javaアプリケーションで**タグ付きPDFを作成する**ことをサポートしています。この記事では、**テキスト、画像、図形、表などのPDF要素にタグを追加する方法**について説明します。
- **[テキストにタグを追加する](#テキストにタグを追加する)**
- **[画像にタグを追加する](#画像にタグを追加する)**
- **[表にタグを追加する](#表にタグを追加する)**
## 【依存関係の追加】
この方法は、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</artifactId>
        <version>8.12.6</version>
    </dependency>
</dependencies>
```
### 2. 公式サイトよりJarファイルをダウンロード
まず、[Spire.PDF for Java](https://jp.e-iceblue.com/download/spire-pdf-for-java.html)の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。
## テキストにタグを追加する
無料のSpire.PDF for Javaは、タグ付きテキストを含むPDFを作成するPdfTaggedContentクラスを提供しています。以下は、その詳細な手順です。
- **PdfDocument**クラスオブジェクトを作成します。
- 作成したPDF文書に **PdfDocument.getPages.add()** メソッドでページを追加しています。
- **PdfPageBase.setTabOrder(TabOrder.Structure)** メソッドを用いて、タブオーダーを**Structure**に設定する。
- **PdfTaggedContent**クラスのオブジェクトを作成します。
- **PdfTaggedContent.getStructureTreeRoot().appendChildElement()** メソッドでドキュメントのルートに "document" 要素を追加し、Structure 要素を作成する。
- **PdfStructureElement.appendChildElement()** メソッドを使用して、"document" 要素の下に "paragraph" 要素を追加します。
- **PdfStructureElement.beginMarkedContent()** メソッドを使用して、見出し要素の開始を示す開始タグを追加します。
- **PdfPageBase.getCanvas.drawString()** メソッドを使用して、ページに段落テキストを描画します。
- **PdfStructureElement.endMarkedContent()** メソッドを使用して終了タグを追加し、段落要素がここで終了することを意味するようにします。
- **PdfDocument.saveToFile()** メソッドを使用してドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.interchange.taggedpdf.PdfStandardStructTypes;
import com.spire.pdf.interchange.taggedpdf.PdfStructureElement;
import com.spire.pdf.interchange.taggedpdf.PdfTaggedContent;

import java.awt.*;

public class createTaggedPDF {

    public static void main(String[] args) throws Exception {

        //PDFドキュメントを作成する
        PdfDocument doc = new PdfDocument();

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

        //タブオーダーを設定する
        page.setTabOrder(TabOrder.Structure);

        //PdfTaggedContentクラスのインスタンスを作成する
        PdfTaggedContent taggedContent = new PdfTaggedContent(doc);

        //ドキュメントのタイトルと言語を設定する
        taggedContent.setLanguage("ja-JP");
        taggedContent.setTitle("タグ付きPDF");

        //フォントを設定する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI",Font.PLAIN,12), true);
        PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));

        //Structure要素を作成する
        PdfStructureElement article = taggedContent.getStructureTreeRoot().appendChildElement(PdfStandardStructTypes.Document);
        PdfStructureElement paragraph1 = article.appendChildElement(PdfStandardStructTypes.Paragraph);
        PdfStructureElement span1 = paragraph1.appendChildElement(PdfStandardStructTypes.Span);
        article.setTitle("テキストのタグ");

        //タグ付き段落を追加する
        span1.beginMarkedContent(doc.getPages().get(0));
        PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Justify);
        page.getCanvas().drawString("PDFドキュメントの1段落目", font, brush, new Rectangle(40, 80, 480, 80), format);
        paragraph1.setTitle("1つ目のテキストのタグ");
        span1.endMarkedContent(doc.getPages().get(0));

        //タグ付き段落をもう一つ追加する
        PdfStructureElement paragraph2 = article.appendChildElement(PdfStandardStructTypes.Paragraph);
        paragraph2.beginMarkedContent(doc.getPages().get(0));
        page.getCanvas().drawString("PDFドキュメントの2段落目",font, brush, new Rectangle(40, 160, 480, 60), format);
        paragraph2.endMarkedContent(doc.getPages().get(0));
        paragraph2.setTitle("2つ目のテキストのタグ");

        //ドキュメントを保存する
        String result = "タグ付きPDF.pdf";
        doc.saveToFile(result);
        doc.close();
    }
}
```
**【出力されるPDFファイル】**
![テキストにタグを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090371/9a457eb5-8719-7619-e769-b33a30106b4c.png)
 
## 画像にタグを追加する
Spire.PDF for javaが提供するPdfTaggedContentインスタンスを使用することで、PDF文書内の画像にタグを追加することができます。
- **PdfDocument**クラスのオブジェクトを作成します。
- 作成したPDF文書に **PdfDocument.getPages.add()** メソッドでページを追加しています。
- **PdfPageBase.setTabOrder(TabOrder.Structure)** メソッドを使用して、タブオーダーをStructureに設定します。
- **PdfTaggedContent**インスタンスのオブジェクトを作成します。
- **PdfTaggedContent.getStructureTreeRoot().appendChildElement()** メソッドを使用して、ドキュメントのルートに "document" 要素を追加し、Structure 要素を作成します。
- **PdfStructureElement.appendChildElement()** メソッドを用いて、"document" 要素の下に "figure" 要素を追加する。
- **PdfStructureElement.beginMarkedContent()** メソッドを使用して、見出し要素の開始を示す開始タグを追加する。
- **PdfPageBase.getCanvas.drawImage()** メソッドを使用して、ページ上に画像を描画します。
- **PdfStructureElement.endMarkedContent()** メソッドで終了タグを追加し、画像要素がここで終了することを意味するようにします。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.interchange.taggedpdf.PdfStandardStructTypes;
import com.spire.pdf.interchange.taggedpdf.PdfStructureElement;
import com.spire.pdf.interchange.taggedpdf.PdfTaggedContent;

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


public class createTaggedPDFImage {

    public static void main(String[] args) throws Exception {

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

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

        //タブオーダーを設定する
        page.setTabOrder(TabOrder.Structure);

        //PdfTaggedContentクラスのインスタンスを作成する
        PdfTaggedContent taggedContent = new PdfTaggedContent(doc);

        //ドキュメントのタイトルと言語を設定する
        taggedContent.setLanguage("ja-JP");
        taggedContent.setTitle("タグ付きPDF");

        //Structure要素を作成する
        PdfStructureElement article = taggedContent.getStructureTreeRoot().appendChildElement(PdfStandardStructTypes.Document);
        PdfStructureElement figure = article.appendChildElement(PdfStandardStructTypes.Figure);
        article.setTitle("画像のタグ");

        //タグ付き画像の追加
        figure.setAlt("代替テキスト");
        figure.beginMarkedContent(doc.getPages().get(0), null);
        PdfImage image = PdfImage.fromFile("Computer.png");
        Dimension2D dimension2D = new Dimension();
        dimension2D.setSize( 200,200);
        page.getCanvas().drawImage(image, new Point2D.Float(40, 80),dimension2D);
        figure.endMarkedContent(doc.getPages().get(0));
        figure.setTitle("画像にタグを付ける");

        //ドキュメントを保存する
        String result = "タグ付きPDF.pdf";
        doc.saveToFile(result);
        doc.close();
    }
}
```
**【出力されるPDFファイル】**
![画像にタグを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090371/5f3865ff-f736-9d04-c6d1-aa2ae561d27f.png)

## 表にタグを追加する
Spire.PDF for javaは、PDFファイル内のテーブルにタグを追加することもサポートしています。ここで詳細な手順は次のとおりです。
- **PdfDocument**クラスオブジェクトを作成します。
- **PdfDocument.getPages.add()** メソッドを使用して作成されたPDF文書にページを追加します。
- **PdfPageBase.setTabOrder(TabOrder.Structure)** メソッドを使用して、タブオーダーをStructureに設定します。
- **PdfTaggedContent**クラスのオブジェクトを作成します。
- **PdfTaggedContent.getStructureTreeRoot().appendChildElement()** メソッドを使用して、ドキュメントのルートに "document" 要素を追加して構造体要素を作成します。
- **PdfStructureElement.appendChildElement()** メソッドを用いて、"document" 要素の下に "table" 要素を追加します。
- **PdfStructureElement.beginMarkedContent()** メソッドを使用して、見出し要素の先頭を示す開始タグを追加します。
- **PdfTable.draw(page, new Point2D.Float(x, y))** メソッドを用いて、PDFページに表を描画します。
- **PdfStructureElement.endMarkedContent()** メソッドを使用して終了タグを追加し、表要素がここで終了することを意味するようにします。
- **PdfDocument.saveToFile()** メソッドでドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.bookmarks.PdfTextStyle;
import com.spire.pdf.graphics.*;
import com.spire.pdf.interchange.taggedpdf.PdfStandardStructTypes;
import com.spire.pdf.interchange.taggedpdf.PdfStructureElement;
import com.spire.pdf.interchange.taggedpdf.PdfTaggedContent;
import com.spire.pdf.tables.PdfColumn;
import com.spire.pdf.tables.PdfHeaderSource;
import com.spire.pdf.tables.PdfTable;

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

public class createTaggedPDFTable {

    public static void main(String[] args) throws Exception {

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

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

        //タブオーダーを設定する
        doc.getPages().get(0).setTabOrder(TabOrder.Structure);

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

        //ドキュメントのタイトルと言語を設定する
        taggedContent.setLanguage("ja-JP");
        taggedContent.setTitle("タグ付きPDF");

        //フォントとブラシを作成する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI",Font.PLAIN,14), true);
        PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Yu Mincho",Font.PLAIN,12), true);
        PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));

        //Structure要素を作成する
        PdfStructureElement article = taggedContent.getStructureTreeRoot().appendChildElement(PdfStandardStructTypes.Document);
        PdfStructureElement figure = article.appendChildElement(PdfStandardStructTypes.Table);
        figure.setTitle("表にタグを追加する");

        //表にタグを追加する
        figure.beginMarkedContent(doc.getPages().get(0), null);

        //PDFページに表を追加し、そのデータを設定する
        PdfTable table = new PdfTable();
        table.getStyle().setBorderPen(new PdfPen(brush, 0.5f));
        table.getStyle().getHeaderStyle().setStringFormat(new PdfStringFormat(PdfTextAlignment.Center));
        table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
        table.getStyle().setHeaderRowCount(1);
        table.getStyle().setShowHeader(true);
        table.getStyle().setCellPadding(2);
        table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
        table.getStyle().setHeaderRowCount(1);
        table.getStyle().setShowHeader(true);
        table.getStyle().getDefaultStyle().setFont(font1);
        table.getStyle().getHeaderStyle().setFont(font);

        String[] data = {"名前;年齢;役職名;メモ",
                "John;23;プログラマー; ",
                "Katty;21;財務担当者; ",
                "Coco;25;プログラマー;インターン",
                "Kyle;27;プログラマー; "
        };
        String[][] dataSource = new String[data.length][];
        for (int i = 0; i < data.length; i++) {
            dataSource[i] = data[i].split("[;]", -1);
        }

        table.setDataSource(dataSource);
        for(int i = 0; i < table.getColumns().getCount();i++)
        {
            PdfColumn column= table.getColumns().get(i);
            column.setStringFormat(new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle));
        }

        //ページに表を描画する
        table.draw(page, new Point2D.Float(0, 150));

        figure.endMarkedContent(page);

        //ドキュメントを保存する
        String result = "タグ付きPDF.pdf";
        doc.saveToFile(result);
        doc.close();
    }
}
```
**【出力されるPDFファイル】**
![表にタグを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090371/e6611c81-579b-259b-6909-7a6f1837e57f.png)

> **この記事では、タグを使ったPDFファイルの作成方法について紹介します。また、Spire.PDF for JavaでPDFドキュメントを操作するための多くの機能があります。あなたはこのツールに関する任意の質問がある場合は、ヘルプのための[Spire.PDF Forum](https://www.e-iceblue.com/forum/spire-pdf-f7.html)に移動することができます。**