2010-03-31 28 views

Respuesta

13

Si tiene el código fuente iTextSharp, añada lo siguiente a PdfContentByte clase:

/// <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); 
     }   

El siguiente paso es implment IPdfPCellEvent interfaz:

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 
    } 

A continuación, redondear lo que cada vez esquinas se quiere producir la mesa redonda de elección:

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); 

Si te gusta la respuesta ... dale un voto :)

+0

Eso es ideal para celdas individuales, pero ¿qué pasa con toda la tabla? ¿Cómo podría implementar los eventos TableCell para lograr esto? –

+1

Agregar otra tabla con una celda que contiene mi tabla de destino funciona. Gracias de nuevo por su respuesta MK. –

+1

Me complace que haya encontrado la respuesta, otro enfoque sería redondeando una esquina de cada celda de la esquina de la mesa (TopLeft, TopRight, BottomLeft y BottomRight). –

2

Supongo que si quieres una mesa con esquinas redondeadas, estás buscando un formato llamativo (o al menos bonito) en tu mesa. Si ese es el caso, recomendaría desactivar todos los bordes en su tabla iTextSharp y usar una imagen gráfica como fondo en su página. A continuación, puede hacer que el fondo gráfico sea lo más intrincado y elegante que desee (sombreado, degradados, esquinas redondeadas, etc.) con muy pocos problemas. Luego, simplemente alinea tu mesa con la imagen de fondo.

Si su formato de datos cambiará a menudo, no querrá utilizar este enfoque.

5

No hay forma de crear un iTextSharp PdfPTable con esquinas redondeadas, pero lo que podría hacer es dibujar un borde de tabla con esquinas redondeadas usando el método PdfContentByte.RoundRectangle().

He aquí un fragmento que muestra esto:

Document doc = new Document(); 
using (FileStream fs = new FileStream("RoundRectangle Demo.pdf", FileMode.Create)) { 
PdfWriter writer = PdfWriter.GetInstance(doc, fs); 
    doc.Open(); 
    PdfContentByte cb = writer.DirectContent; 

    // Bottom left coordinates x & y, followed by width, height and radius of corners. 
    cb.RoundRectangle(100f, 500f, 200f, 200f, 2f); 
    cb.Stroke(); 

    doc.Close(); 
} 

Este fragmento es una versión condensada de código que encontré en el artículo iTextSharp - Drawing shapes and Graphics en www.mikesdotnetting.com. Si todavía no lo ha hecho, querrá echarle un vistazo a sus otros artículos.

+1

Eso funcionó muy bien. ¿Sabes cómo podría encontrar la posición de la mesa para poder dibujar con precisión las esquinas redondeadas? –

+0

Respuesta más simple posible – hdoghmen