public class PaginationEngine { // 预计算:将数据行分配到各页 public List<Page> CalculatePages(IReportTemplate tpl, IReportDataSource data, float pageHeight) { var pages = new List<Page>(); float y = 0; var headerH = EstimateHeight(tpl.PageHeader); var footerH = EstimateHeight(tpl.PageFooter); var detailH = EstimateHeight(tpl.Detail); float usableHeight = pageHeight - headerH - footerH;
var currentPage = new Page(); currentPage.Bands.Add(tpl.PageHeader);
foreach (var row in data.GetRows()) { if (y + detailH > usableHeight) { currentPage.Bands.Add(tpl.PageFooter); pages.Add(currentPage); currentPage = new Page(); currentPage.Bands.Add(tpl.PageHeader); y = 0; } currentPage.DetailRows.Add(row); y += detailH; }
// 套打模板:用毫米定义坐标 public class OverprintTemplate { public List<OverprintField> Fields { get; set; } }
public class OverprintField { public string FieldName { get; set; } // 数据字段名 public float X { get; set; } // 毫米 public float Y { get; set; } // 毫米 public float Width { get; set; } // 毫米 public string Format { get; set; } // 格式化字符串 }