StandardReport.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using QuestPDF.Drawing;
  2. using QuestPDF.Fluent;
  3. using QuestPDF.Helpers;
  4. using QuestPDF.Infrastructure;
  5. namespace QuestPDF.ReportSample.Layouts
  6. {
  7. public class StandardReport : IDocument
  8. {
  9. private ReportModel Model { get; }
  10. public StandardReport(ReportModel model)
  11. {
  12. Model = model;
  13. }
  14. public DocumentMetadata GetMetadata()
  15. {
  16. return new DocumentMetadata()
  17. {
  18. Title = Model.Title,
  19. Size = PageSizes.A4
  20. };
  21. }
  22. public void Compose(IContainer container)
  23. {
  24. container
  25. .PaddingVertical(40)
  26. .PaddingHorizontal(50)
  27. .Page(page =>
  28. {
  29. page.Header().Element(ComposeHeader);
  30. page.Content().Element(ComposeContent);
  31. page.Footer().AlignCenter().PageNumber("Page {number}");
  32. });
  33. }
  34. private void ComposeHeader(IContainer container)
  35. {
  36. container.Stack(stack =>
  37. {
  38. stack.Item().Row(row =>
  39. {
  40. row.Spacing(50);
  41. row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
  42. row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
  43. });
  44. stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
  45. stack.Item().ShowOnce().Grid(grid =>
  46. {
  47. grid.Columns(2);
  48. grid.Spacing(5);
  49. foreach (var field in Model.HeaderFields)
  50. {
  51. grid.Item().Stack(row =>
  52. {
  53. row.Item().AlignLeft().Text(field.Label, Typography.Normal.SemiBold());
  54. row.Item().Text(field.Value, Typography.Normal);
  55. });
  56. }
  57. });
  58. });
  59. }
  60. void ComposeContent(IContainer container)
  61. {
  62. container.PaddingVertical(20).Stack(stack =>
  63. {
  64. stack.Spacing(20);
  65. stack.Item().Component(new TableOfContentsTemplate(Model.Sections));
  66. foreach (var section in Model.Sections)
  67. stack.Item().Location(section.Title).Component(new SectionTemplate(section));
  68. stack.Item().PageBreak();
  69. stack.Item().Location("Photos");
  70. foreach (var photo in Model.Photos)
  71. stack.Item().Component(new PhotoTemplate(photo));
  72. });
  73. }
  74. }
  75. }