Me preguntaba cuál sería el mejor enfoque para crear tablas en un PDF con esquinas redondeadas utilizando la biblioteca iTextSharp 5.x +.Cuadros con esquinas redondeadas
Respuesta
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 :)
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.
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.
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? –
Respuesta más simple posible – hdoghmen
- 1. UIToolbar con esquinas redondeadas
- 2. UIImage con esquinas redondeadas transparentes
- 3. Esquinas redondeadas en UITableView
- 4. Esquinas redondeadas en UIImage
- 5. NSImageView esquinas redondeadas + carrera
- 6. Esquinas redondeadas de MKMapView
- 7. CSS esquinas redondeadas Divs
- 8. CSS esquinas redondeadas
- 9. QLineEdit Esquinas redondeadas?
- 10. UIImage esquinas redondeadas
- 11. ¿Solo dos esquinas redondeadas?
- 12. NSButton con ancho variable, esquinas redondeadas
- 13. ImageView con esquinas redondeadas y sombra interior
- 14. Cómo hacer un div con esquinas redondeadas
- 15. objetivo c - UINavigationBar con esquinas redondeadas
- 16. Crear botón con esquinas redondeadas en Android
- 17. Esquinas redondeadas de fluido con jQuery
- 18. Android ImageView con esquinas redondeadas no funciona
- 19. Esquinas interiores redondeadas con marco interior transparente
- 20. Esquinas redondeadas en XSL-FO
- 21. Esquinas redondeadas en un fieldset
- 22. XML Android esquinas redondeadas recortadas
- 23. Esquinas redondeadas UIView o UIImageView
- 24. esquinas redondeadas en las imágenes
- 25. Imagebutton imagen completa, esquinas redondeadas
- 26. Esquinas más redondeadas con CSS3 o con imágenes?
- 27. Esquinas redondeadas del navegador cruzado (sin imagen)
- 28. Configuración de esquinas redondeadas para svg: imagen
- 29. UITableViewCell esquinas redondeadas y subvistas de clip
- 30. Esquinas redondeadas antialias en Android ImageView
Eso es ideal para celdas individuales, pero ¿qué pasa con toda la tabla? ¿Cómo podría implementar los eventos TableCell para lograr esto? –
Agregar otra tabla con una celda que contiene mi tabla de destino funciona. Gracias de nuevo por su respuesta MK. –
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). –