【Java】PDFBoxでTiff画像をPDFに埋め込む

PDFBoxを触っていくうちに何となくJavaの書き方がわかってきたか?

背景

そこにTiff画像がある、これをPDFにしたいのだ。というニーズに答えたい。

課題

このサイトに従ってPNG画像をPDF化できたので、Tiffも同じようにできるかと思ったらできなかった。

原因

よくわからんけど、ここを見て、「いま扱ってるFITTファイルがT4/T6圧縮ではなかったんだな」と思っている。

対策

PDImageXObject.createFromFileの代わりにLosslessFactory.createFromImageを使って画像オブジェクトを生成した。

package jp.samplepkg;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class Sample01 {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        try {
            // 空のドキュメントオブジェクトを作成します
            PDDocument document = new PDDocument();

            // 新しいページのオブジェクトを作成します
            PDPage page = new PDPage();
            document.addPage(page);

            // 画像オブジェクトを作成する
            BufferedImage img = ImageIO.read(new File("/Path/to/Image/image.tiff"));
            PDImageXObject image = LosslessFactory.createFromImage(document, img);

            // 出力用のストリームを開いて画像を描写する
            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            contentStream.drawImage(image, 50, 50, image.getWidth(), image.getHeight());

            // ストリームを閉じる
            contentStream.close();

            // ドキュメントを保存します
            document.save("sample.pdf");
            document.close();
          }
          catch (IOException e) {
            e.printStackTrace();
          }
    }
}

参考サイト