Таблицы со скругленными углами

Я задавался вопросом, что будет лучшим подходом для того, чтобы составить таблицы в PDF, которые имеют скругленные углы с помощью iTextSharp 5.x + библиотека.

7
задан Bobrovsky 16 April 2013 в 17:52
поделиться

3 ответа

Если у вас есть исходный код 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);

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

13
ответ дан 6 December 2019 в 08:42
поделиться

Невозможно создать 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. Вы захотите внимательно взглянуть на его другие статьи, если вы еще этого не сделали.

6
ответ дан 6 December 2019 в 08:42
поделиться

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

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

2
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: