2010-03-31 16 views

Odpowiedz

13

Jeśli masz kod źródłowy iTextSharp, dodać następujące PdfContentByte Klasa:

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

Następnym krokiem jest implment IPdfPCellEvent interfejs:

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 
    } 

Następnie należy zaokrąglić co kiedykolwiek rogi chcesz produkować zaokrąglony stół z wyboru:

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

Jeśli podoba ci się odpowiedź ... daj jej głos :)

+0

To jest świetne dla pojedynczych komórek, ale co z całym stołem? W jaki sposób można zrealizować zdarzenia TableCell, aby to osiągnąć. –

+1

Powoduje dodanie kolejnej tabeli z jedną komórką zawierającą moją tabelę docelową. Jeszcze raz dziękuję za odpowiedź MK. –

+1

Cieszę się, że znalazłeś odpowiedź, inne podejście polegałoby na zaokrągleniu narożnika każdej narożnej komórki tabeli (TopLeft, TopRight, BottomLeft i BottomRight). –

2

Zakładam, że jeśli chcesz mieć stół z zaokrąglonymi rogami, szukasz jakiegoś krzykliwego (lub przynajmniej ładnego) formatowania na swoim stole. W takim przypadku zalecam wyłączenie wszystkich granic w tabeli iTextSharp i użycie obrazu graficznego jako tła na twojej stronie. Możesz wtedy uczynić tło graficzne tak skomplikowanym i fantazyjnym, jak tylko chcesz (cieniowanie, gradienty, zaokrąglone rogi itd.) Z bardzo małymi problemami. Następnie po prostu ustaw swój stół z obrazem tła.

Jeśli format danych będzie się często zmieniać, nie będziesz chciał korzystać z tego podejścia.

5

Nie można utworzyć iTextSharp PdfPTable z zaokrąglonymi narożnikami, ale można zrobić tylko obramowanie stołu z zaokrąglonymi narożnikami przy użyciu metody PdfContentByte.RoundRectangle().

Oto fragment, który demonstruje w ten sposób:

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

Ten fragment jest skrócona wersja kodu znalazłem w artykule iTextSharp - Drawing shapes and Graphics na www.mikesdotnetting.com. Będziesz chciał przyjrzeć się bliżej jego innym artykułom, jeśli jeszcze tego nie zrobiłeś.

+1

To zadziałało świetnie. Czy wiesz, jak mogłem znaleźć położenie stołu, aby móc dokładnie narysować zaokrąglone rogi. –

+0

Najprostsza możliwa odpowiedź – hdoghmen

Powiązane problemy