JavaでPDF内のテキストを検索、ハイライト表示、置換する方法

時には、特定のテキストを取得するために、PDFファイルを検索する必要がありますが、多くの同じ検索結果があるかもしれません。より便利にその位置を確認するために、背景色で検索されたテキストを強調する必要があります。無料の[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)はまた、PDFファイル内で一つずつ新しいテキストで検索されたテキストを交換するためにサポートしています。この資料では、**PDFファイル内のテキストを検索し、強調表示し、置換する方法**を示しています。
- **[PDFファイルのすべてのページでテキストを検索してハイライト表示する](#pdfファイルのすべてのページでテキストを検索してハイライト表示する)**
- **[新しいテキストでPDF文書内のテキストを検索し、置換する](#新しいテキストで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ファイルを依存関係としてプロジェクトにインポートしてください。
## PDFファイルのすべてのページでテキストを検索してハイライト表示する
Free Spire.PDF for Javaは、PDFファイルのすべてのページ上の特定のテキストを検索し、背景色でそれらを強調表示するためにサポートしています。ここでは手順は次のとおりです。
- **PdfDocument**クラスのインスタンスを生成します。
- **PdfDocument.loadFromFile()** メソッドを使用して PDF ドキュメントを読み込みます。
- PDFドキュメント内のページをループして、**PdfPageBase.findText(string).getFinds()** メソッドを使用して、PDF ページ全体から指定テキストを検索し、検索結果を**PdfTextFind**配列に保存します。
- リストをループして **PdfTextFind.highLight(Color color)** メソッドを呼び出し、特定のテキストの出現箇所をすべて色付きで強調します。
- **PdfDocument.saveToFile()** メソッドを使用して、結果ドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.general.find.PdfTextFind;

import java.awt.*;


public class findAndHighlight {

    public static void main(String[] args) throws Exception {
        //PdfDocumentクラスのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //PDF文書の読み込み
        pdf.loadFromFile("Java.pdf");

        PdfTextFind[] result = null;
        for (Object pageObj : pdf.getPages()) {
            PdfPageBase page =(PdfPageBase)pageObj;
            //テキストを検索する
            result = page.findText("Java", false).getFinds();
            for (PdfTextFind find : result) {
                //検索した文字列をハイライト表示する
                find.applyHighLight(Color.green);
            }
        }

        //結果ファイルを保存する
        pdf.saveToFile("テキストのハイライト表示.pdf");
    }
}
```
![PDFファイルのすべてのページでテキストを検索してハイライト表示する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6237b84e-485d-a80b-3a02-f604cf7e9f36.png)

## 新しいテキストでPDF文書内のテキストを検索し、置換する
Free Spire.PDF for Javaは、**PdfPageBase.findText(string)** メソッドにより、PDFページ全体から指定したテキストを検索し、そのフォントとサイズを設定して新しいテキスト文字列を描画して、それらを覆うようにしています。
- **PdfDocument**クラスのオブジェクトを作成し、**PdfDocument.loadFromFile()** メソッドを使用してPDFドキュメントを読み込みます。
- **PdfDocument.getPages().get()** メソッドを使用して最初のページを取得し、PdfPageBase.findText() メソッドを使用してページから選択テキストを検索しています。
- 特定の検索結果の境界を取得し、**PdfPageBase.getCanvas().drawRectangle()** メソッドを使用してその境界の領域を覆うように白い長方形を描画します。
- **PdfPageBase.getCanvas().drawString()** メソッドを用いて、その領域に新しい文字列を描画します。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントを保存します。

**Java**
```Java
import com.spire.ms.System.Collections.Generic.List;
import com.spire.pdf.*;
import com.spire.pdf.general.find.*;
import com.spire.pdf.graphics.*;

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


public class findAndReplace {

    public static void main(String[] args) throws Exception {
        //PdfDocumentクラスのインスタンスを作成する
        PdfDocument doc = new PdfDocument();

        //PDF文書の読み込み
        doc.loadFromFile("Java.pdf");

        //PDFの1ページ目を取得する
        PdfPageBase page = doc.getPages().get(0);

        //ページから特定の文字列を検索する
        PdfTextFindCollection collection = page.findText("JAVA",false);

        //置き換えのための新しいテキストを定義する
        String newText = "JAVA テクノロジとは何ですか。なぜこれが必要なのですか。";

        //特定の使用されているフォントに基づいた PdfTrueTypeFont クラスのオブジェクトを作成する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Mincho Demibold",  Font.PLAIN, 14));
        Dimension2D dimension2D = font.measureString(newText);
        double fontWidth = dimension2D.getWidth();
        double height = dimension2D.getHeight();

        for (Object findObj : collection.getFinds()) {
            PdfTextFind find=(PdfTextFind)findObj;
            List<Rectangle2D> textBounds = find.getTextBounds();

            //旧テキストを覆うように白い四角形を描画する
            Rectangle2D rectangle2D = textBounds.get(0);
            new Rectangle((int)rectangle2D.getX(),(int)rectangle2D.getY(),(int)fontWidth,(int)height);
            page.getCanvas().drawRectangle(PdfBrushes.getWhite(), rectangle2D);

            //旧テキストの位置に新しいテキストを描画する
            page.getCanvas().drawString(newText, font, PdfBrushes.getBlack(), rectangle2D.getX(), rectangle2D.getY() );
        }

        //ドキュメントを保存する
        String result = "検索と置換.pdf";
        doc.saveToFile(result, FileFormat.PDF);
    }
}
```
![新しいテキストでPDF文書内のテキストを検索し、置換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/44351df3-0745-761d-b480-cde96a7928fe.png)

> **この記事では、我々はSpire.PDF for javaを使用して、PDF内のテキストを検索し、ハイライトと置換する方法を示しました。Spire.PDF for Javaを使用すると、我々はまた、そのようなWord、ExcelやPowerPointなどの他のファイル形式にPDFファイルを変換し、PDFファイルを編集するなど、Javaアプリケーションで簡単にPDFファイルを操作することができます。[Spire.PDFのフォーラム](https://www.e-iceblue.com/forum/spire-pdf-f7.html)では、PDFファイルを操作するためのより多くの機能を確認することができます。**