【问题标题】:Is there any way to vertically-align iText (iTextSharp) text using ColumnText?有没有办法使用 ColumnText 垂直对齐 iText (iTextSharp) 文本?
【发布时间】:2017-08-16 22:51:03
【问题描述】:

有没有办法使用 ColumnText 垂直对齐文本?我正在使用 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   |
|---------------|        |---------------|

【问题讨论】:

  • A ColumnText 自上而下填充。不过,您可以先在模拟模式下填充ColumnText,读取填充区域的高度,然后用相应向下移动的矩形填充ColumnText

标签: itext


【解决方案1】:

birwin 的答案就是行不通。 ColumnText 对齐方式只接受水平对齐方式。这一直有效,直到 ColumnText 文本处于文本模式。当您调用 ColumnText.AddElement 时,ColumnText 切换到 CompositMode 并且对齐无效。

如果你真的想在 ColumnText 中垂直对齐,那么你必须创建一个具有对齐内容的内容,并且必须添加到 ColumnText。只有 TableCell 是垂直对齐的正确对象。

所以首先我们必须创建一个表格,其中包含一列和一个单元格。并将单元格的大小设置为与列文本大小相同。 其次,必须将此表添加到 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();

【讨论】:

  • 谢谢你,这很好用!如果您不希望在单元格周围显示实心边框,我只会将 Border = 0 添加到 PdfPCell 初始化中。
【解决方案2】:

解决方案:

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) -- 显然这里的“true”表示 ColumnText 是在“模拟”模式下创建的。在发布我的问题的 cmets 之前,我不知道这种模式。

if (ct.LinesWritten == 1) 检查写入的行数。如果只写了一行,我会缩小矩形右上角的大小。

ct.SetSimpleColumn(myText, llx, lly, urx, ury, lineheight, Element.ALIGN_BOTTOM); 当我第二次拨打此行时,ury(右上角)的位置已更改并且框变小了。

ct.Go() - 第二次调用时,我没有传递“true”参数,所以第二次调用不是模拟模式,而是将数据写入文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2011-11-25
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多