2017-08-16 8 views
0

ColumnTextを使用してテキストを垂直に整列する方法はありますか?私はiTextSharpを使用していますColumnTextを使用してiText(iTextSharp)テキストを垂直に整列する方法はありますか?

Chunk c = new Chunk(text, this.detailFont); 
Phrase myText = new Phrase(c); 
ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM); 
ct.Go(); 

私のテキストは、指定したボックスの最上部に表示されます。私は箱の底に揃えてください。

as it is     as it should be 
|---------------|  |---------------| 
| some text | ---> |    | 
|    |  | some text | 
|---------------|  |---------------| 
+1

'ColumnText'がトップダウン満たされています。ただし、エミュレーションモードで 'ColumnText'を塗りつぶし、塗りつぶされた領域の高さを読み込み、それに応じて' ColumnText'に長方形を塗りつぶします。 – mkl

答えて

0

ソリューション:

Chunk c = new Chunk(text, this.detailFont); 
Phrase myText = new Phrase(c); 
ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM); 
ct.Go(true); 
if (ct.LinesWritten == 1) 
{ 
    ury = ury - (this.rowheight); 
} 
ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM); 
ct.Go(); 

ct.Go(true) - どうやら "真" は、ここでColumnTextは "シミュレーション" モードで作成されていることを示します。私は自分の質問へのコメントが掲載される前にこのモードを知らなかった。

if (ct.LinesWritten == 1)は、書き込まれた行の数をチェックします。 1行しか書かれていない場合は、私の四角形の右上の角のサイズを縮小します。

ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM);この行をもう一度呼び出すと、ury(右上隅)の位置が変更され、ボックスが小さくなります。

ct.Go() - これを2回目に呼び出すと、2番目の呼び出しがシミュレーションモードでなく、データをドキュメントに書き込むように、「真の」パラメータを渡すことはありません。

1

答えはです。birwinは機能していません。 ColumnTextのアライメントは水平アラインメントのみを受け入れます。これは、まで働いています。ColumnTextテキストはテキストモードです。 を呼び出すと、ColumnText.AddElementColumnTextがCompositModeに切り替わり、配置が無効になります。

あなたが本当にColumnText垂直配向したいなら、あなたはコンテンツを揃えており、ColumnTextに追加する必要があり、コンテンツを作成する必要があります。 およびセル垂直アライメントが効果を持つ正しいオブジェクト。

まず、1つの列と1つのセルを持つテーブルを作成する必要があります。そして、セルのサイズを列のテキストサイズと同じに設定します。 そして第二に、このテーブルはここColumntText

に追加する必要がありますが、私のコードです:

 // create doc 
     var pdfDoc = new Document(PageSize.A4); 
     var pdfWriter = PdfWriter.GetInstance(pdfDoc, new FileStream(Path.Combine(Path.GetTempPath(), "test.pdf"), FileMode.Create)); 

     pdfDoc.Open(); 

     var canvas = pdfWriter.DirectContent; 
     canvas.SaveState(); 
     canvas.Rectangle(100, 100, 100, 100); 
     canvas.SetRgbColorFill(255, 128, 128); 
     canvas.Fill(); 
     canvas.RestoreState(); 

     // create font 
     BaseFont bfTimes = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false); 
     Font times = new Font(bfTimes, (float)10, Font.ITALIC, new BaseColor((int)232434)); 

     Phrase myText = new Phrase(new Chunk("Hello World", times)); 
     ColumnText ct = new ColumnText(canvas); 

     /* wrong birwin code : 
     ct.SetSimpleColumn(myText, 100, 100, 200, 200, ct.Leading, Element.ALIGN_BOTTOM); 
     */ 

     // new working code: crreate a table 
     PdfPTable table = new PdfPTable(1); 
     table.SetWidths(new[] { 1 }); 
     table.WidthPercentage = 100; 
     table.AddCell(new PdfPCell(myText) 
     { 
      HorizontalAlignment = Element.ALIGN_RIGHT, 
      VerticalAlignment = Element.ALIGN_BOTTOM, 
      FixedHeight = 100 
     }); 
     ct.SetSimpleColumn(100, 100, 200, 200); 
     ct.AddElement(table); 
     ct.Go(); 

     pdfDoc.Close(); 
+0

ありがとう、これは完全に動作します!セルの周りに実線の境界線が表示されないようにするには、 'Border = 0'をPdfPCellの初期化に追加します。 –

関連する問題