iTextSharp PdfPCell将图像对齐到单元格的底部

时间:2017-04-04 08:05:26

标签: c# .net itext

我试图将图像对齐到单元格的右下角。 我基本上创建了一个每行有两个单元格的表。单元格包含文本和图像,我希望将其与单元格的右下角对齐。请参考图片

这是我的代码

 PdfPTable table = new PdfPTable(2);
 table.TotalWidth = 400f;
 table.LockedWidth = true;

 float[] widths = new float[] { 1.5f, 1.5f };
 table.SetWidths(widths);
 table.HorizontalAlignment = 0;

 table.SpacingBefore = 50f;
 table.SpacingAfter = 30f;

 iTextSharp.text.Image logoImage = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("~/Images/MyImage.png"));
 logoImage.ScaleAbsolute(40, 40);
 logoImage.Alignment = iTextSharp.text.Image.ALIGN_BOTTOM;
 logoImage.Alignment = iTextSharp.text.Image.RIGHT_ALIGN;

 foreach (EmployeeModel employee in employees)
 {
    PdfPCell cell = new PdfPCell();
    cell.FixedHeight = 140f;

    cell.PaddingLeft = 30f;
    cell.PaddingRight = 10f;
    cell.PaddingTop = 20f;
    cell.PaddingBottom = 5f;

    Paragraph p = new Paragraph(GetLabelCellText(Employee), NormalFont);
    p.Alignment = Element.ALIGN_LEFT;
    p.Alignment = Element.ALIGN_TOP;
    cell.AddElement(p);

    cell.AddElement(logoImage);

    table.AddCell(cell);
 }

如何将图像放在每个单元格的右下角(当然不影响文本的位置)。

1 个答案:

答案 0 :(得分:0)

问题有点模棱两可,因为您创建了一个包含两列的Table,但添加单元格而未验证employees集合的元素数是偶数,如果不是throw ....

假设您确实希望 单元格中的文本,可能是获取所需布局的最简单方法是实施IPdfPCellEvent

public class BottomRightImage : IPdfPCellEvent
{
    public Image Image { get; set;  }

    public void CellLayout(
        PdfPCell cell, 
        Rectangle position, 
        PdfContentByte[] canvases)
    {
        if (Image == null) throw new InvalidOperationException("image is null");

        PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
        Image.SetAbsolutePosition(
            position.Right - Image.ScaledWidth - cell.PaddingRight, 
            position.Bottom + cell.PaddingBottom
        );
        canvas.AddImage(Image);
    }
}

然后在CellEvent上设置PdfPCell属性。这是一个简单的工作示例:

using (var stream = new MemoryStream())
{
    using (var document = new Document())
    {
        PdfWriter.GetInstance(document, stream);
        document.Open();
        var table = new PdfPTable(2)
        {
            HorizontalAlignment = Element.ALIGN_LEFT,
            TotalWidth = 400f,
            LockedWidth = true                        
        };

        var image = Image.GetInstance(imagePath);
        image.ScaleAbsolute(40, 40);
        var cellEvent = new BottomRightImage() { Image = image };

        var testString =
@"first name: {0}
last name: {0}
ID no: {0}";
        for (int i = 0; i < 2; ++i)
        {
            var cell = new PdfPCell()
            {
                FixedHeight = 140f,
                PaddingLeft = 30f,
                PaddingRight = 10f,
                PaddingTop = 20f,
                PaddingBottom = 5f
            };
            cell.CellEvent = cellEvent;

            var p = new Paragraph(string.Format(testString, i))
            {
                Alignment = Element.ALIGN_TOP | Element.ALIGN_LEFT
            };
            cell.AddElement(p);
            table.AddCell(cell);
        }
        document.Add(table);
    }
    File.WriteAllBytes(outputFile, stream.ToArray());
}

PDF输出:

enter image description here

全黑方形图像用于显示PdfPCell填充被考虑在内。