Java ライブラリ Apache PDFBox で PDF を操作しよう (第4回:罫線の表示)

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本連載では Java で PDF を操作できる Apache PDFBox について解説します。 前回は画像の埋込み表示について解説しました。 今回は PDF に罫線を表示する方法について解説します。

罫線をひいてみよう

 PDF に帳票を出力する場合などに、罫線をひいて表や下線をあらわしたい場合があります。 ここでは、PDFBox で PDF に罫線を表示する方法について学びます。 まずは簡単なプログラムを提示します。 単純に PDF に一本だけ罫線が表示されるプログラムです。

package sample.pdfbox;

import java.awt.Color;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;

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

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

      // 出力用のストリームを開いて罫線を描写する
      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      contentStream.moveTo(10f, 500f);            // 罫線の始点座標を指定
      contentStream.lineTo(600f, 500f);           // 罫線の終点座標を指定
      contentStream.setStrokingColor(Color.GRAY); // 罫線の色を指定
      contentStream.setLineWidth(1f);             // 罫線の幅を指定
      contentStream.stroke();                     // 罫線を引く
      contentStream.close();

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

PDFBox 出力サンプル  このプログラムを実行すると、line.pdf というファイル名の右図のような PDF が出力されます。(クリックで拡大) ページの中心付近に罫線が表示されているのがわかります。
 罫線を引く場合、まずは罫線の始点と終点を決定します。 それぞれ moveTo メソッドと lineTo メソッドで指定します。 座標はページの左下が (0,0) である点に注意してください。 そして setStrokingColor メソッドで罫線の色を指定しています。 このメソッドを呼び出さない場合は罫線が黒色になります。 更に setLineWidth メソッドで罫線の太さを指定します。 罫線を引くための準備ができたら、stroke メソッドで罫線を引きます。

破線の罫線をひいてみよう

 上の例では実線の罫線をひいてみましたが、線を破線にすることもできます。 次のプログラムは上のプログラムに1行だけ追加して、線を破線に変更しています。

package sample.pdfbox;

import java.awt.Color;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;

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

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

      // 出力用のストリームを開いて罫線を描写する
      PDPageContentStream contentStream = new PDPageContentStream(document, page);
      contentStream.moveTo(10f, 500f);                            // 罫線の始点座標を指定
      contentStream.lineTo(600f, 500f);                           // 罫線の終点座標を指定
      contentStream.setStrokingColor(Color.GRAY);                 // 罫線の色を指定
      contentStream.setLineWidth(1f);                             // 罫線の幅を指定
      contentStream.setLineDashPattern(new float[]{8f, 4f}, 0f); // 線を破線に変更
      contentStream.stroke();                                     // 罫線を引く
      contentStream.close();

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

PDFBox 出力サンプル  このプログラムを実行すると、今度は罫線が破線になって表示されているのがわかります。
 新しく追加した setLineDashPattern メソッドで破線の形を指定しています。 第一引数の float の配列は、線と空白の間隔を表しています。 上の例だと線と空白が 2:1 の割合の間隔で破線が表示されます。 どちらも同じ数字にすれば、線と空白が同じ長さの間隔になります。 第二引数は線の始まり方(指定した破線の間隔のどこから表示を始めるか)です。 第二引数の数字を調整すれば、線の途中から破線を始めることも、空白から破線を始めることもできます。

おわりに

 今回は PDFBox を利用して PDF に罫線をひく方法について解説しました。 上の例では1本だけ線を引きましたが、for 文などの繰返し処理で複数の罫線を引いて表などを作ることもできるのでチャレンジしてみてください。 今回までは、PDFBox の触りの部分について解説してきました。 次回からは、それぞれの機能を更に深く掘り下げて解説していこうと思います。 (現在執筆中)

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca