StandardReport.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using QuestPDF.Fluent;
  2. using QuestPDF.Helpers;
  3. using QuestPDF.Infrastructure;
  4. namespace QuestPDF.ReportSample.Layouts
  5. {
  6. public class StandardReport : IDocument
  7. {
  8. private ReportModel Model { get; }
  9. public StandardReport(ReportModel model)
  10. {
  11. Model = model;
  12. }
  13. public DocumentMetadata GetMetadata()
  14. {
  15. return new DocumentMetadata()
  16. {
  17. Title = Model.Title
  18. };
  19. }
  20. public void Compose(IDocumentContainer container)
  21. {
  22. container
  23. .Page(page =>
  24. {
  25. page.DefaultTextStyle(Typography.Normal);
  26. page.MarginVertical(40);
  27. page.MarginHorizontal(50);
  28. page.Size(PageSizes.A4);
  29. page.Header().Element(ComposeHeader);
  30. page.Content().Element(ComposeContent);
  31. page.Footer().AlignCenter().Text(text =>
  32. {
  33. text.CurrentPageNumber().Format(x => x?.FormatAsRomanNumeral() ?? "-----");
  34. text.Span(" / ");
  35. text.TotalPages().Format(x => x?.FormatAsRomanNumeral() ?? "-----");
  36. });
  37. });
  38. }
  39. private void ComposeHeader(IContainer container)
  40. {
  41. container.Column(column =>
  42. {
  43. column.Item().Row(row =>
  44. {
  45. row.Spacing(50);
  46. row.RelativeItem().PaddingTop(-10).Text(Model.Title).Style(Typography.Title);
  47. row.ConstantItem(90).Hyperlink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
  48. });
  49. column.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
  50. column.Item().ShowOnce().Grid(grid =>
  51. {
  52. grid.Columns(2);
  53. grid.Spacing(5);
  54. foreach (var field in Model.HeaderFields)
  55. {
  56. grid.Item().Text(text =>
  57. {
  58. text.Span($"{field.Label}: ").SemiBold();
  59. text.Span(field.Value);
  60. });
  61. }
  62. });
  63. });
  64. }
  65. void ComposeContent(IContainer container)
  66. {
  67. container.PaddingVertical(20).Column(column =>
  68. {
  69. column.Spacing(20);
  70. column.Item().Component(new TableOfContentsTemplate(Model.Sections));
  71. column.Item().PageBreak();
  72. foreach (var section in Model.Sections)
  73. column.Item().Section(section.Title).Component(new SectionTemplate(section));
  74. column.Item().PageBreak();
  75. column.Item().Section("Photos");
  76. foreach (var photo in Model.Photos)
  77. column.Item().Component(new PhotoTemplate(photo));
  78. });
  79. }
  80. }
  81. }