top / index / prev / next / target / source

2009-12-08 diary: Java: iText を用いた PDF ファイルを新規作成するサンプル

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: iText を用いた PDF ファイルを新規作成するサンプル

iText を使って PDF ファイルを新規作成するサンプルです。このサンプルは、任意座標に文字や線を出力することを目的としています。

Java: iText を用いた PDF ファイルを新規作成するサンプル

iText を使って PDF ファイルを新規作成するサンプルです。このサンプルは、任意座標に文字や線を出力することを目的としています。

確認に利用した動作環境。

import java.awt.Color; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.OutputStream;

import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfWriter;

public class WritePdfSample { public static final int MARGIN_X = 20; public static final int MARGIN_Y = 20;

public static void main(final String[] args) throws Exception {
    final BufferedOutputStream outStream = new BufferedOutputStream(
            new FileOutputStream("sample.pdf"));

    try {
        new WritePdfSample().writePdf(outStream);

        outStream.flush();
    } finally {
        outStream.close();
    }
}

void writePdf(final OutputStream outStream) throws Exception {
    final Document document = new Document(PageSize.A4.rotate(), 50, 50,
            50, 50);
    final PdfWriter writer = PdfWriter.getInstance(document, outStream);

    document.open();

    for (int page = 1; page <= 2; page++) {
        if (page != 1) {
            document.newPage();
        }
        writePage(writer);
    }

    document.close();

    writer.close();
}

void writePage(final PdfWriter writer) throws Exception {
    final BaseFont bf = BaseFont.createFont(
            "c:\\windows\\fonts\\msgothic.ttc,1", BaseFont.IDENTITY_H,
            BaseFont.EMBEDDED);

    for (int x = 0; x < 10; x++) {
        for (int y = 0; y < 10; y++) {
            final PdfContentByte cb = writer.getDirectContent();
            cb.saveState();

            cb.beginText();
            cb.moveText(MARGIN_X + x * 100, MARGIN_Y + y * 100);
            cb.setFontAndSize(bf, 10);
            cb.showText("" + x + ", " + y);
            cb.endText();

            cb.restoreState();
        }
    }

    for (int x = 0; x < 10; x++) {
        final PdfContentByte cb = writer.getDirectContent();
        cb.saveState();

        cb.setColorStroke(Color.BLACK);
        cb.setLineDash(3, 3, 0);
        cb.moveTo(MARGIN_X + x * 100, MARGIN_Y + 0);
        cb.lineTo(MARGIN_X + x * 100, MARGIN_Y + 500);
        cb.stroke();

        cb.restoreState();
    }

    for (int y = 0; y < 10; y++) {
        final PdfContentByte cb = writer.getDirectContent();
        cb.saveState();

        cb.setColorStroke(Color.BLACK);
        cb.setLineDash(3, 3, 0);
        cb.moveTo(MARGIN_X + 0, MARGIN_Y + y * 100);
        cb.lineTo(MARGIN_X + 800, MARGIN_Y + y * 100);
        cb.stroke();

        cb.restoreState();
    }
}

} ```

次は、既存 PDF ファイルをフォームとして、PDF 更新作成の方法を調べます。

関連する日記

iText のライセンスが GNU LGPL から Affero GNU Public License に変更された?

ところで、iText を調べていたところ、iText のバージョンが 2.1.7 から 5.0.0 へと変更された際に、ライセンスが GNU LGPL から Affero GNU Public License に変更されているように見えました。SourceForge.net 上の記述やソースコード・ヘッダーのライセンス記載から、そのように読み取られます。私は GNU LGPL ファンなので、GNU AGPL に変わるのは少し残念です。


この日記について