#テキストを自由配置しよう
前回までの出力では、Wordのように左上から書き出すだけだった。
PDFでは出力位置を指定して出力することができる。
#早速コード
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.ColumnDocumentRenderer;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.Paragraph;
public class FreePosString {
public static void main(String[] args) throws Exception {
PdfDocument pdf = new PdfDocument(new PdfWriter("FreePosString.pdf"));
PageSize ps = PageSize.A4.rotate();
PdfPage page = pdf.addNewPage(ps);
PdfCanvas canvas = new PdfCanvas(page);
// 平成角ゴシック
PdfFont font = PdfFontFactory.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H");
// Initialize document
Document document = new Document(pdf);
// (100, 200)にwidth:50, height:100を指定
Rectangle[] columns = {
new Rectangle(100, 200, 50, 100)
};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
// 赤枠-線幅0.5fで文字書き出し
Border border = new SolidBorder(ColorConstants.RED, 0.5f);
Paragraph p1 = new Paragraph("あいうえ、かきくけこabcdefgh-ijklmn,opqrstuvwxyz")
.setFont(font)
.setFontSize(12)
.setBorder(border)
;
document.add(p1);
// (100, 200)へ線。width:50, height:100の範囲をチェック
canvas.moveTo(0, 0).lineTo(100, 200).lineTo(150, 200).lineTo(150, 300).lineTo(100, 300).stroke();
//Close document
document.close();
}
}
#説明
document.setRenderer(new ColumnDocumentRenderer(document, columns));
で、columnsにRectangleを複数指定する。
今回は簡単のため、位置(100,200)にwidth:50, height:100の1か所のみ指定する。
また、場所をわかりやすくするため、moveToやlineToを利用して指定範囲に線を引いてみる。
#(0, 0)は左下。
どうやらitextでは(0, 0)は左下になるようだ。
#書き出しは指定位置+指定高さ。
また指定位置(100, 200)から指定した高さ100の位置からの書き出しになるようだ。
#Paragraphはずれる?
さらにParagraphでは微妙に位置がずれるようだ。
この辺りはTableを使った方がキレイに指定できそうだ。
#はみ出した分は次ページの同位置に出力される
指定枠内に入りきらなかった文字は次ページ以降の同位置に出力された。
はみ出したかどうかを判定する方法なども探っていきたい。
#禁則処理は半角英数のみ?
また文字に「、」や「-」「,」を行頭行末になるよう文字列を調整したが、禁則処理されるのは半角英数のみに見える。旧バージョンではこの設定もできたのだがitext7ではできるのだろうか?
この辺りは今後調査してみたい。