If you have the source code for iTextSharp, add the following to the PdfContentByte class:
/// <summary> /// Enumuration for defining corners you want rounded. /// </summary> [Flags()] public enum Corners {None = 0,All=15,Top=3,Bottom=12, TopLeft = 1, TopRight=2, BottomLeft=4, BottomRight=8}; /// <summary> /// Adds a round rectangle to the current path, with rounded conrners as specified by roundCorners. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="w"></param> /// <param name="h"></param> /// <param name="r"></param> /// <param name="roundCorners"></param> public void RoundRectangle(float x, float y, float w, float h, float r,Corners roundCorners) { if (w < 0) { x += w; w = -w; } if (h < 0) { y += h; h = -h; } if (r < 0) r = -r; float b = 0.4477f; if((roundCorners & Corners.BottomLeft) == Corners.BottomLeft) MoveTo(x + r, y); else MoveTo(x, y); if ((roundCorners & Corners.BottomRight) == Corners.BottomRight) { LineTo(x + w - r, y); CurveTo(x + w - r * b, y, x + w, y + r * b, x + w, y + r); } else LineTo(x + w, y); if ((roundCorners & Corners.TopRight ) == Corners.TopRight) { LineTo(x + w, y + h - r); CurveTo(x + w, y + h - r * b, x + w - r * b, y + h, x + w - r, y + h); } else LineTo(x + w, y + h); if ((roundCorners & Corners.TopLeft) == Corners.TopLeft) { LineTo(x + r, y + h); CurveTo(x + r * b, y + h, x, y + h - r * b, x, y + h - r); } else LineTo(x , y + h); if ((roundCorners & Corners.BottomLeft) == Corners.BottomLeft) { LineTo(x, y + r); CurveTo(x, y + r * b, x + r * b, y, x + r, y); }else LineTo(x, y); }
The next step is the IPdfPCellEvent interface:
public class myCellEvent : IPdfPCellEvent { #region members PdfContentByte.Corners _roundedCorners; float _roundness; #endregion #region ctor public myCellEvent() :this( PdfContentByte.Corners.All,2f) { } public myCellEvent(PdfContentByte.Corners roundedCorners) : this(roundedCorners, 2f) { } public myCellEvent(PdfContentByte.Corners roundedCorners,float roundness) { _roundedCorners = roundedCorners; _roundness = roundness; } #endregion #region IPdfPCellEvent Members public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { PdfContentByte cb = canvases[PdfPTable.LINECANVAS]; cb.RoundRectangle(position.Left, position.Bottom, position.Right - position.Left, position.Top - position.Bottom, this._roundness, this._roundedCorners); cb.SetColorStroke(new BaseColor(System.Drawing.Color.Black)); cb.SetColorFill(new BaseColor(System.Drawing.Color.Beige)); cb.FillStroke(); cb.Stroke(); } #endregion }
Then you go around any corners you want to create a rounded selection table:
PdfPTable table = new PdfPTable(1); PdfPCell cell = new PdfPCell(new Phrase(10, atext, f2)); cell.Border = 0; cell.Padding = 5f; cell.CellEvent = new myCellEvent(PdfContentByte.Corners.Top,2f); table.AddCell(cell);
If you like the answer ... give it a vote :)