JavaでPNGをPDFに変換する方法

PDFは、あらゆるソフトウェアやハードウェアに対応できる汎用性の高い形式です。そのため、あらゆる職場で利用されています。画像ファイルをPDFに変換する際、画像のデザインをそのままに変換できるため、見た目は全く変わりません。今回は、[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用して、**PNG（または任意の画像形式）ファイルをPDFドキュメントに変換する方法**を紹介します。

- **[PNGファイルを画質を維持したまま1つのPDFに変換する](#pngファイルを画質を維持したまま1つのpdfに変換する)**
- **[PNGファイルを画質を圧縮してPDFに変換する](#pngファイルを画質を圧縮して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ファイルを依存関係としてプロジェクトにインポートしてください。

## PNGファイルを画質を維持したまま1つのPDFに変換する

> **主な手順は以下の通りです。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.getPageSettings.setMargins()** メソッドを使用して、ページマージンを0に設定する。
- フォルダ内の画像ファイルの抽象パスを取得します。
- 画像をループして特定の画像を取得し、**PdfImage.fromImage()** メソッドを使用して **PdfImage** クラスのオブジェクトにそれを読み込み、画像の幅と高さを取得します。
- **PdfDocument.getPages().add()** メソッドを使用して、画像のサイズに基づいてPDFにページを追加します。
- **PdfPageBase.getCanvas().drawImage()** メソッドを使用して、ページ上の座標 (0, 0) に **PdfImage** クラスのオブジェクトを描画してください。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントをPDFファイルに保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfImage;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class convertPNGToPDF {

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

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

        //余白を0に設定する
        doc.getPageSettings().setMargins(0);

        //ディレクトリのFileオブジェクトを作成する
        File directoryPath = new File("D:/Images");

        //フォルダ内の画像ファイルの抽象パスを取得する
        File filesList[] = directoryPath.listFiles();

        //画像をルー プする
        for (int i = 0; i < filesList.length; i++) {

            //BufferedImageに画像を読み込む
            BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filesList[i].getAbsolutePath()));

            //PdfImage クラスのオブジェクトを作成する
            PdfImage pdfImage = PdfImage.fromImage(bufferedImage);

            //画像の幅と高さを取得する
            int width = pdfImage.getWidth();
            int height = pdfImage.getHeight();

            //画像と同じ大きさのページを追加する
            PdfPageBase page = doc.getPages().add(new Dimension(width, height));

            //ページの(0, 0)に画像を描画する
            page.getCanvas().drawImage(pdfImage, 0, 0, width, height);
        }

        //ファイルに保存する
        doc.saveToFile("PNGからPDFへの変換.pdf");
    }
}
```

### 【結果のPDFファイル】

![PNGファイルを画質を維持したまま一つのPDFに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b8c4b282-40fb-f665-839f-1e784035822c.png)

## PNGファイルを画質を圧縮してPDFに変換する

高画質の画像をPDFに合成する場合、PDFのサイズが大きくなる傾向があります。生成されるPDFドキュメントのサイズを小さくしたい場合は、画質を圧縮しながら結合することができます。

> **以下はその手順です。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.getPageSettings.setMargins()** メソッドを使用して、ページマージンを0に設定する。
- フォルダ内のイメージファイルの抽象パスを取得します。
- 画像をループして特定の画像を取得し、**PdfImage.fromImage()** メソッドを使用して **PdfImage** クラスのオブジェクトにそれを読み込み、画像の幅と高さを取得します。
- **PdfDocument.getPages().add()** メソッドを使用して、画像のサイズに基づいてPDFにページを追加します。
- **PdfPageBase.getCanvas().drawImage(PdfImage image, int compressionQuality, float x, float y, float width, float height)** メソッドを用いて、ページ上の座標 (0, 0) に画像を圧縮品質で描画しています。**compressionQuality** パラメータは1～100の範囲です。1は、画像が元の品質の1%に圧縮されることを意味し、100は、画像が圧縮されないことを意味します。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントをPDFファイルに保存してください。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfImage;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class convertPNGToPDFCompressingQuality {

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

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

        //余白を0に設定する
        doc.getPageSettings().setMargins(0);

        //ディレクトリのFileオブジェクトを作成する
        File directoryPath = new File("D:/Images");

        //フォルダ内の画像ファイルの抽象パスを取得する
        File filesList[] = directoryPath.listFiles();

        //画像をループする
        for (int i = 0; i < filesList.length; i++) {

            //BufferedImageに画像を読み込む
            BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filesList[i].getAbsolutePath()));

            //PdfImage クラスのオブジェクトを作成する
            PdfImage pdfImage = PdfImage.fromImage(bufferedImage);

            //画像の幅と高さを取得する
            int width = pdfImage.getWidth();
            int height = pdfImage.getHeight();

            //画像と同じ大きさのページを追加する
            PdfPageBase page = doc.getPages().add(new Dimension(width, height));

            //ページの(0, 0)に画像を描画する
            page.getCanvas().drawImage(pdfImage,30,0, 0, width, height);
        }

        //ファイルに保存する
        doc.saveToFile("画質の圧縮.pdf");
    }
}
```

### 【結果のPDFファイル】

![PNGファイルを画質を圧縮してPDFに変換する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0662291d-0989-1c3f-199c-dd5f63818e3d.png)

> **この記事では、異なる画質でPNG画像をPDFファイルに変換する方法を学ぶことができます。あなたはまだこの記事を読んだ後、いくつかの問題がある場合は、より多くの情報のための[Spire.PDF Forum](https://www.e-iceblue.com/forum/spire-pdf-f7.html)に移動してください。**