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;
を必要とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
//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 <= 1.0f) { //再度、columnTextにテキストをセット columnText.SetSimpleColumn( new Phrase(draw_text, font) , draw_x , draw_y , draw_x + draw_w , draw_y + draw_h , fontSize , Element.ALIGN_LEFT ); //テキスト描画 columnText.Go(); break; } } //PDFドキュメントを閉じる。 pdfDocument.Close(); |
説明のために、わざとつらつら書いてますが、ところどころ関数化しておくと便利です。