top / index / prev / next / target / source

2009-12-09 diary: Java: iText を用いた フォーム PDF ファイルをもちいて PDF ファイルを作成するサンプル

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

old-v2

Java: iText を用いた フォーム PDF ファイルをもちいて PDF ファイルを作成するサンプル

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

Java: iText を用いた フォーム PDF ファイルをもちいて PDF ファイルを作成するサンプル

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

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

//*
 * iText: フォーム PDF ファイルをもちいた PDF 作成サンプル
 * Copyright (C) 2009 伊賀敏樹
 * 作成日: 2009/12/09
 */

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.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

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

    public static void main(final String[] args) throws Exception {
        // フォームとなる PDF ファイルの読み込み。
        final PdfReader form = new PdfReader("form.pdf");

        final BufferedOutputStream outStream = new BufferedOutputStream(
                new FileOutputStream("sample2.pdf"));

        try {
            new WritePdfWithFormSample().writePdf(form, outStream);

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

    void writePdf(final PdfReader form, final OutputStream outStream)
            throws Exception {
        // 注意: 単一フォームのみに対応。
        final Document document = new Document(form.getPageSizeWithRotation(1));
        final PdfWriter writer = PdfWriter.getInstance(document, outStream);

        document.open();

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

            applyForm(form, writer);

            writePage(writer);
        }

        document.close();

        writer.close();
    }

    void applyForm(final PdfReader form, final PdfWriter writer) {
        final PdfImportedPage importedPage = writer.getImportedPage(form, 1);

        final PdfContentByte cb = writer.getDirectContent();
        cb.saveState();
        cb.addTemplate(importedPage, 0, 0);
        cb.restoreState();
    }

    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.setColorFill(Color.RED);
                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.RED);
            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.RED);
            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 のページにコピーされることを確認できました。

関連する日記


この日記について