Categories: C#

C# iTextSharpで枠内に収まるようにテキストを出力

iTextSharpでSetSimpleColumnを使って、指定した枠内にテキストを収めたい場合、フォントサイズを小さくするしかありません。

そこで、徐々にフォントサイズを小さくしながら、枠内に収まるようにテキストを描画する方法です。
columnText.Go()で描画するのですが、columnText.Go(true)と引数にtrueを渡すことで、シミュレーションモドになります。で、戻り値をみると、枠内に文字が収まったかどうかがわかります。

もし、戻り値がColumnText.NO_MORE_COLUMNなら、枠外にはみ出ていることになります。
なので、戻り値がColumnText.NO_MORE_COLUMNである間は、フォントサイズを小さくしていくようにします。

ただし、フォントサイズがあまりにも小さいと見えなくなってしまうし、マイナスになると例外を発生するので、1.0f以下にはならないようにします。

以下のサンプルコードは、
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text;
を必要とします。

//A4サイズを横向きで
Document pdfDocument = new Document(PageSize.A4.Rotate(), 0, 0, 0, 0);

//出力先のファイル名
string makePdfFilePath = @"c:PDFtest.pdf";
FileStream fileStream = new FileStream(makePdfFilePath, FileMode.Create);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument, fileStream);

//パスワードで保護する場合
//string password = "pass";
//pdfWriter.SetEncryption(Encoding.ASCII.GetBytes(password), Encoding.ASCII.GetBytes(password),
//    PdfWriter.ALLOW_SCREENREADERS, PdfWriter.STANDARD_ENCRYPTION_128);

//PDFドキュメントを開く
pdfDocument.Open();

//フォント名
string fontName = "MS ゴシック";

//フォントスタイル。 複合するときは、&で。
int fontStyle = iTextSharp.text.Font.BOLD;// &iTextSharp.text.Font.ITALIC;

//フォントカラー
BaseColor baseColor = BaseColor.BLACK;

PdfContentByte pdfContentByte = pdfWriter.DirectContent;

//テンプレートとするPDF
//PdfReader pdfTemplateReader = new PdfReader(@"c:PDFBlankSheet.pdf"); 
//PdfImportedPage pdfTemplatePage = pdfWriter.GetImportedPage(pdfTemplateReader, 1);
//pdfContentByte.AddTemplate(pdfTemplatePage, 0, 0);

//フォントファイルのシステムフォルダを設定
FontFactory.RegisterDirectory(Environment.SystemDirectory.Replace("system32", "fonts"));

//出力するテキスト
string draw_text = "テキスト出力テキスト出力";

//文字間を指定
pdfContentByte.SetCharacterSpacing(0.1f);

//出力する位置
float draw_x = 50;
float draw_y = 50;
float draw_w = 150;
float draw_h = 20;

//四角を出力
//線の色を指定
pdfContentByte.SetRGBColorStroke(255, 0, 0);
//線の幅を指定
pdfContentByte.SetLineWidth(1.0f);
//線の種類(点線)を指定
pdfContentByte.SetLineDash(5.0f, 2.0f);
//範囲
pdfContentByte.Rectangle(draw_x, draw_y, draw_w, draw_h);
//描画
pdfContentByte.Stroke();

//範囲内に収まるようにフォントサイズを小さくしていく
for (float fontSize = 30.0f; fontSize > 0; fontSize--)
{
    //フォントの設定
    iTextSharp.text.Font font =
        FontFactory.GetFont(fontName,
        BaseFont.IDENTITY_H,            //横書き
        BaseFont.NOT_EMBEDDED,          //フォントを組み込まない
        fontSize,
        fontStyle,
        baseColor);

    
    ColumnText columnText = new ColumnText(pdfContentByte);

    //SetSimpleColumnで出力
    columnText.SetSimpleColumn(
        new Phrase(draw_text, font)
        , draw_x
        , draw_y
        , draw_x + draw_w
        , draw_y + draw_h
        , fontSize
        , Element.ALIGN_LEFT    //ちなみに、SetSimpleColumnでは、ALIGN_MIDDLE(縦方向の中寄せ)は使えない
        );

    //テキスト描画シミュレーション
    int result = columnText.Go(true);

    //もし、枠内に収まっていなければ、columnText.Go() の戻り値はColumnText.NO_MORE_COLUMNになる
    if (ColumnText.NO_MORE_COLUMN != result || fontSize 

説明のために、わざとつらつら書いてますが、ところどころ関数化しておくと便利です。

nakaike