2017-08-16 59 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)檢查寫入的行數。如果只寫了一行,我縮小矩形的右上角的大小。

ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM);當我第二次調用此行時,ury(右上角)位置已更改,並且該框較小。

ct.Go() - 我第二次調用它時,我沒有傳遞「true」參數,所以第二個調用不是模擬模式,而是將數據寫入文檔。

1

birwin的答案不起作用。 ColumnText alignment只接受水平對齊。這是一直工作到ColumnText文本處於文本模式。當您撥打ColumnText.AddElementColumnText切換到CompositMode並且對齊無效。

如果你真的想垂直排列在ColumnText那麼你必須創建已對齊的內容,並且必須添加到ColumnText內容。只有單元垂直對齊有效的正確對象。

所以首先我們必須創建一個表格,一列一格。並將單元格的大小設置爲與列文本大小相同。 第二,這個表必須添加到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初始化中。 –