Столы с закругленными углами - PullRequest
7 голосов
/ 01 апреля 2010

Мне было интересно, как лучше всего создать таблицы в формате pdf с закругленными углами с использованием библиотеки iTextSharp 5.x +.

Ответы [ 4 ]

13 голосов
/ 28 апреля 2010

Если у вас есть исходный код iTextSharp, добавьте в класс PdfContentByte следующее:

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

Следующий шаг - реализация интерфейса IPdfPCellEvent:

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
    }

Затем вы округляете все углы, которые хотите получить, чтобы получить округлый стол выбора:

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

Если вам нравится ответ ... проголосуйте :))

6 голосов
/ 02 апреля 2010

Нет способа создать iTextSharp PdfPTable с закругленными углами, но вы можете нарисовать границу таблицы с закругленными углами, используя метод PdfContentByte.RoundRectangle().

Вот фрагмент, который демонстрирует это:

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

Этот фрагмент является сжатой версией кода, который я нашел в статье iTextSharp - Рисование фигур и графики на www.mikesdotnetting.com. Возможно, вы захотите поближе познакомиться с его другими статьями, если вы еще этого не сделали.

2 голосов
/ 01 апреля 2010

Я предполагаю, что если вам нужен стол с закругленными углами, вам нужно какое-то броское (или хотя бы симпатичное) форматирование на вашем столе. В таком случае я бы порекомендовал отключить все границы в вашей таблице iTextSharp и использовать графическое изображение в качестве фона на вашей странице. Затем вы можете сделать графический фон настолько сложным и причудливым, насколько хотите (затенение, градиенты, закругленные углы и т. Д.) Без особых проблем. Затем просто выровняйте таблицу с фоновым изображением.

Если ваш формат данных будет часто меняться, вы не захотите использовать этот подход.

0 голосов
/ 23 ноября 2018

Частная функция pdfDIF () As Byte () Dim Celevent As New PdfPCellEvent

 Dim tableImportes As New PdfPTable(1)
 tableImportes.SetTotalWidth({10 * dpixcm})

 Dim cellImportes = New PdfPCell(New Phrase("IMPORTE", COURIER9Bold))            
 cellImportes.BorderWidth = 0
 cellImportes.HorizontalAlignment = Element.ALIGN_CENTER
 cellImportes.CellEvent = celevent
 tableImportes.AddCell(cellImportes)

конечная функция

Открытый класс PdfPCellEvent Реализует IPdfPCellEvent

Public Sub CellLayout(cell As iTextSharp.text.pdf.PdfPCell, position As iTextSharp.text.Rectangle, canvases() As iTextSharp.text.pdf.PdfContentByte) Implements iTextSharp.text.pdf.IPdfPCellEve`enter code here`nt.CellLayout
    Dim cb As PdfContentByte = canvases(PdfPTable.LINECANVAS)
   cb.RoundRectangle(position.Left,position.Bottom,position.Width,position.Height,10)
    cb.SetLineWidth(1)
    cb.SetCMYKColorStrokeF(0.0F, 0.0F, 0.0F, 1.0F)
    cb.Stroke()
End Sub

Конечный класс

...