Browse Source

Fixed: the Column element fails when contains PageBreak

Marcin Ziąbek 1 year ago
parent
commit
a257c778df
2 changed files with 43 additions and 19 deletions
  1. 33 1
      Source/QuestPDF.Examples/ColumnExamples.cs
  2. 10 18
      Source/QuestPDF/Elements/Column.cs

+ 33 - 1
Source/QuestPDF.Examples/ColumnExamples.cs

@@ -128,7 +128,7 @@ namespace QuestPDF.Examples
                                 column.Item().Height(75).Width(100 + i * 5).Background(Colors.Grey.Lighten2);
                                 column.Item().Height(75).Width(100 + i * 5).Background(Colors.Grey.Lighten2);
                         });
                         });
 
 
-                        page.Header().Background(Colors.Grey.Lighten4).Column(column =>
+                        page.Header().Background(Colors.Grey.Lighten2).Column(column =>
                         {
                         {
                             column.Spacing(10);
                             column.Spacing(10);
                             column.Item().Background(Colors.Red.Lighten3).Text("First line");
                             column.Item().Background(Colors.Red.Lighten3).Text("First line");
@@ -138,5 +138,37 @@ namespace QuestPDF.Examples
                     });
                     });
                 });
                 });
         }
         }
+        
+        [Test]
+        public void ColumnWithPageBreak()
+        {
+            RenderingTest
+                .Create()
+                .ProducePdf()
+                .MaxPages(100)
+                .ShowResults()
+                .RenderDocument(document =>
+                {
+                    document.Page(page =>
+                    {
+                        page.Size(PageSizes.A4);
+                        page.Margin(50);
+
+                        page.Content().PaddingVertical(25).Column(column =>
+                        {
+                            column.Spacing(25);
+
+                            foreach (var i in Enumerable.Range(1, 5))
+                            {
+                                foreach (var j in Enumerable.Range(1, i))
+                                    column.Item().Height(75).Width(100 + i * 5).Background(Colors.Grey.Lighten2);
+                                
+                                if (i != 5)
+                                    column.Item().PageBreak();
+                            }
+                        });
+                    });
+                });
+        }
     }
     }
 }
 }

+ 10 - 18
Source/QuestPDF/Elements/Column.cs

@@ -94,10 +94,19 @@ namespace QuestPDF.Elements
                 if (item.IsRendered)
                 if (item.IsRendered)
                     continue;
                     continue;
 
 
-                var measurement = MeasureItem(item);
+                var availableHeight = availableSpace.Height - topOffset;
+
+                var itemSpace = availableHeight > 0
+                    ? new Size(availableSpace.Width, availableHeight)
+                    : Size.Zero;
+                
+                var measurement = item.Measure(itemSpace);
                 
                 
                 if (measurement.Type == SpacePlanType.Wrap)
                 if (measurement.Type == SpacePlanType.Wrap)
                     break;
                     break;
+                
+                if (Size.Equal(itemSpace, Size.Zero) && !Size.Equal(measurement, Size.Zero))
+                    break;
 
 
                 // when the item does not take any space, do not add spacing
                 // when the item does not take any space, do not add spacing
                 if (measurement.Width < Size.Epsilon && measurement.Height < Size.Epsilon)
                 if (measurement.Width < Size.Epsilon && measurement.Height < Size.Epsilon)
@@ -120,23 +129,6 @@ namespace QuestPDF.Elements
             }
             }
 
 
             return commands;
             return commands;
-
-            SpacePlan MeasureItem(ColumnItem item)
-            {
-                var availableHeight = availableSpace.Height - topOffset;
-                
-                if (availableHeight < Size.Epsilon)
-                {
-                    var measurementWithZeroSpace = item.Measure(Size.Zero);
-      
-                    return measurementWithZeroSpace.Type == SpacePlanType.FullRender
-                        ? measurementWithZeroSpace
-                        : SpacePlan.Wrap();
-                }
-                
-                var itemSpace = new Size(availableSpace.Width, availableHeight);
-                return item.Measure(itemSpace);
-            }
         }
         }
     }
     }
 }
 }