Zastanawiam się, jakie byłoby najlepsze podejście do tworzenia tabel w pliku pdf, który ma zaokrąglone rogi przy użyciu biblioteki iTextSharp 5.x +.Stoły z zaokrąglonymi narożnikami
Odpowiedz
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 :)
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.
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ś.
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. –
Najprostsza możliwa odpowiedź – hdoghmen
- 1. Pasek postępu z zaokrąglonymi narożnikami?
- 2. Utwórz przycisk z zaokrąglonymi narożnikami w android
- 3. Tworzenie sześcianu z zaokrąglonymi narożnikami w Three.js
- 4. Jak wykonać TFrame z zaokrąglonymi narożnikami?
- 5. Pole tekstowe z zaokrąglonymi narożnikami WPF
- 6. Android ImageView z zaokrąglonymi narożnikami nie działa
- 7. obszar Interaktywna obrazów połączonych z zaokrąglonymi narożnikami
- 8. Wykrywanie krawędzi karty z zaokrąglonymi narożnikami
- 9. Programowo programuj listę warstw z zaokrąglonymi narożnikami.
- 10. Formy Xamarin: StackLayout z zaokrąglonymi narożnikami
- 11. cel c - UINavigationBar z zaokrąglonymi narożnikami
- 12. Jak zrobić div z zaokrąglonymi narożnikami?
- 13. Narożnik iOS z zaokrąglonymi narożnikami UIImage z ramką
- 14. Własny FragmentDialog z zaokrąglonymi narożnikami, a nie 100% szerokości ekranu
- 15. Uśpiony iOS z zaokrąglonymi narożnikami i pluskiem w tle
- 16. UIButton z zaokrąglonymi narożnikami za pomocą kwadratu setBackgroundImage
- 17. Android - odkształcalne z zaokrąglonymi narożnikami na górze tylko
- 18. DIV z zaokrąglonymi narożnikami i wewnętrznymi pasami przewijania
- 19. Projektowanie EditText z zaokrąglonymi narożnikami i wewnętrznym cieniem
- 20. Jak narysować trójkąt z zaokrąglonymi narożnikami używając quartz2d/CoreGraphics
- 21. Obramowanie bitmapy z zaokrąglonymi narożnikami w systemie Android
- 22. Tworzenie niestandardowego okna dialogowego z zaokrąglonymi narożnikami w systemie Android
- 23. A UILabel z zaokrąglonymi narożnikami, cieniem i wzorem tła
- 24. Wydajność podczas rysowania ImageView z zaokrąglonymi rogami
- 25. Android - Jak utworzyć widok z zaokrąglonymi narożnikami i tłem w kafelkowym obrazie?
- 26. Jak narysować zaokrąglony prostokąt (prostokąt z zaokrąglonymi narożnikami) za pomocą OpenCV?
- 27. Widok niestandardowego składnika Android z zaokrąglonymi rogami
- 28. Zaokrąglone stoły narożne z LESS
- 29. Stoły ścięte z konsolami szynowymi
- 30. Jak narysować prostokąt z zaokrąglonymi rogami przy użyciu XML?
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ąć. –
Powoduje dodanie kolejnej tabeli z jedną komórką zawierającą moją tabelę docelową. Jeszcze raz dziękuję za odpowiedź MK. –
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). –