Update exam sprint PDF reports so the repeated page header shows the concrete report type, and the repeated page footer supports optional business contact information on the left with page numbers aligned right.
学习成果报告.潜力展望报告.BusinessInfo:
NamePhoneAddressName Tel:Phone when both values exist.Address when it exists.BusinessInfo is missing or all fields are blank, the entire left business info block is not rendered.Tel: without a phone number.Keep the renderers responsible for report-specific text and business data. Each renderer writes the report type into the existing .header-report-type element and emits an optional .report-footer-business HTML block. DefaultPlaywrightPdfWorker remains transport/layout focused: it extracts .report-header into Chromium's native header template and extracts .report-footer-business into Chromium's native footer template beside the page-number placeholders.
Achievement report content is already modeled, so AchievementReportContent gets an optional nested BusinessInfo value. Outlook report rendering already deserializes the payload contract directly, so the renderer reads OutlookExamSprintReportPayload.businessInfo().
BusinessInfo flows into domain/view rendering.