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
説明のために、わざとつらつら書いてますが、ところどころ関数化しておくと便利です。
[Collab] Collab…