private static MeasuredDocumentPage AddPage(Document document, Size size, Rectangle contentArea)
        {
            var page = new MeasuredDocumentPage(document)
            {
                Size        = size,
                ContentArea = contentArea
            };

            page.Index = document.Pages.Count;
            document.Pages.Add(page);
            return(page);
        }
        private static void FitFlex(MeasuredDocumentPage page, LinkedList <Measurement> flexList, ref double height)
        {
            var head = flexList.First;

            while (head != null)
            {
                var result   = TryFitMeasurement(page, head.Value, flexList, true, ref height);
                var previous = head;
                head = head.Next;
                if (result == FitResult.Continue)
                {
                    flexList.Remove(previous);
                }
            }
        }
        private static FitResult TryFitMeasurement(MeasuredDocumentPage page, Measurement measurement, LinkedList <Measurement> flexList, bool flexMode, ref double height)
        {
            var size = measurement.TotalSize + measurement.AccumulatedExtra.TotalSize;

            if (measurement.AccumulatedExtra.Subs.Count > 0)
            {
                height -= 5;
            }

            if (size.Height > height)
            {
                if (measurement.Flexible)
                {
                    if (flexMode)
                    {
                        return(FitResult.Stop);
                    }
                    else
                    {
                        flexList.AddLast(measurement);
                        return(FitResult.Enqueue);
                    }
                }
                else
                {
                    return(FitResult.AddPage);
                }
            }

            if (measurement.Element.Page == null)
            {
                measurement.Element.Page = page;
            }

            height -= size.Height;
            page.Measurements.Add(measurement);

            return(FitResult.Continue);
        }