2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

itext7でPDFを作成する~自由配置:テキスト~

Last updated at Posted at 2019-02-10

#テキストを自由配置しよう
前回までの出力では、Wordのように左上から書き出すだけだった。
PDFでは出力位置を指定して出力することができる。

#早速コード

FreePosString.java
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を利用して指定範囲に線を引いてみる。

出力イメージ
FreePosString.jpg

#(0, 0)は左下。
どうやらitextでは(0, 0)は左下になるようだ。

#書き出しは指定位置+指定高さ。
また指定位置(100, 200)から指定した高さ100の位置からの書き出しになるようだ。

#Paragraphはずれる?
さらにParagraphでは微妙に位置がずれるようだ。
この辺りはTableを使った方がキレイに指定できそうだ。

#はみ出した分は次ページの同位置に出力される
指定枠内に入りきらなかった文字は次ページ以降の同位置に出力された。
はみ出したかどうかを判定する方法なども探っていきたい。

#禁則処理は半角英数のみ?
また文字に「、」や「-」「,」を行頭行末になるよう文字列を調整したが、禁則処理されるのは半角英数のみに見える。旧バージョンではこの設定もできたのだがitext7ではできるのだろうか?
この辺りは今後調査してみたい。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?