(This answer is based on the premise you are using XSL-FO, deduced from the presence of the apache-fop tag)
If you use a different fo:page-sequence
for each section of content, you are guaranteed that each one will begin at the beginning of a new page, even if the previous page would still have available space:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
...
</fo:layout-master-set>
<fo:page-sequence master-reference="pages">
... C1 ...
</fo:page-sequence>
<fo:page-sequence master-reference="pages">
... C2 ...
</fo:page-sequence>
<fo:page-sequence master-reference="pages">
... C3 ...
</fo:page-sequence>
</fo:root>
You can also use the properties break-before="page"
or break-after="page"
on fo:block
elements to force page breaks, but I think the previous solution is more elegant.