StandardReport.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. };
  20. }
  21. public void Compose(IDocumentContainer container)
  22. {
  23. container
  24. // .Page(page =>
  25. // {
  26. // page.MarginVertical(40);
  27. // page.MarginHorizontal(50);
  28. //
  29. // page.ContinuousSize(PageSizes.A4.Width);
  30. //
  31. // page.Header().Element(ComposeHeader);
  32. // page.Content().Element(ComposeContent);
  33. // page.Footer().AlignCenter().PageNumber("Page A {number}");
  34. // })
  35. .Page(page =>
  36. {
  37. page.MarginVertical(40);
  38. page.MarginHorizontal(50);
  39. page.Size(PageSizes.A4);
  40. page.Header().Element(ComposeHeader);
  41. page.Content().Element(ComposeContent);
  42. page.Footer().AlignCenter().PageNumber();
  43. });
  44. }
  45. private void ComposeHeader(IContainer container)
  46. {
  47. container.Stack(stack =>
  48. {
  49. stack.Item().Row(row =>
  50. {
  51. row.Spacing(50);
  52. row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
  53. row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
  54. });
  55. stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
  56. stack.Item().ShowOnce().Grid(grid =>
  57. {
  58. grid.Columns(2);
  59. grid.Spacing(5);
  60. foreach (var field in Model.HeaderFields)
  61. {
  62. grid.Item().Stack(row =>
  63. {
  64. row.Item().AlignLeft().Text(field.Label, Typography.Normal.SemiBold());
  65. row.Item().Text(field.Value, Typography.Normal);
  66. });
  67. }
  68. });
  69. });
  70. }
  71. void ComposeContent(IContainer container)
  72. {
  73. container.PaddingVertical(20).Stack(stack =>
  74. {
  75. stack.Spacing(20);
  76. stack.Item().Component(new TableOfContentsTemplate(Model.Sections));
  77. foreach (var section in Model.Sections)
  78. stack.Item().Location(section.Title).Component(new SectionTemplate(section));
  79. stack.Item().PageBreak();
  80. stack.Item().Location("Photos");
  81. foreach (var photo in Model.Photos)
  82. stack.Item().Component(new PhotoTemplate(photo));
  83. });
  84. }
  85. }
  86. }