StandardReport.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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(ComposeHeader);
  30. page.Content(ComposeContent);
  31. page.Footer().AlignCenter().PageNumber("Page {number}");
  32. });
  33. }
  34. private void ComposeHeader(IContainer container)
  35. {
  36. container.Row(row =>
  37. {
  38. row.RelativeColumn().MaxWidth(300).Stack(stack =>
  39. {
  40. stack.Spacing(5);
  41. stack
  42. .Element()
  43. .PaddingBottom(5)
  44. .Text(Model.Title, Typography.Title);
  45. stack.Element().ShowOnce().Stack(table =>
  46. {
  47. table.Spacing(5);
  48. foreach (var field in Model.HeaderFields)
  49. {
  50. table.Element().Row(row =>
  51. {
  52. row.ConstantColumn(50)
  53. .AlignLeft()
  54. .Text($"{field.Label}:", Typography.Normal);
  55. row.RelativeColumn()
  56. .PaddingLeft(10)
  57. .Text(field.Value, Typography.Normal);
  58. });
  59. }
  60. });
  61. });
  62. row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
  63. });
  64. }
  65. void ComposeContent(IContainer container)
  66. {
  67. container.PaddingVertical(20).PageableStack(stack =>
  68. {
  69. stack.Spacing(20);
  70. stack.Element().Component(new TableOfContentsTemplate(Model.Sections));
  71. foreach (var section in Model.Sections)
  72. stack.Element().Location(section.Title).Component(new SectionTemplate(section));
  73. stack.Element().PageBreak();
  74. stack.Element().Location("Photos");
  75. foreach (var photo in Model.Photos)
  76. stack.Element().Component(new PhotoTemplate(photo));
  77. });
  78. }
  79. }
  80. }