sw/qa/extras/ooxmlexport/data/tdf170119_bottomSpacing.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport25.cxx | 8 +++++ sw/source/writerfilter/dmapper/PropertyMap.cxx | 19 +++++++++++++ 3 files changed, 27 insertions(+)
New commits: commit ed5aaa03906807c93fe6847f66f847007777174d Author: Justin Luth <[email protected]> AuthorDate: Wed Dec 24 17:13:44 2025 -0500 Commit: Justin Luth <[email protected]> CommitDate: Sun Dec 28 01:55:16 2025 +0100 tdf#170119 writerfilter: cont-sectPr w/ pgbrk == emulate bottomSpacing Technically this is a 25.2.6 regression from my commit 74c29345a7c179b048c157582a1145e381616e5c tdf#167657 writerfilter: only move sectPr bottomMargin after pageBreak Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188298 It was just lucky before that it worked for that particular instance, and it only worked since 25.2.4... make CppunitTest_sw_ooxmlexport25 \ CPPUNIT_TEST_NAME=testTdf170119_bottomSpacing Change-Id: I9d0ae90087d79887489357eaa00eeabe53bcb58c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196205 Tested-by: Jenkins Reviewed-by: Justin Luth <[email protected]> (cherry picked from commit 582c032aaa4524abf5b5a630400cf7ecdc2acf8a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196247 diff --git a/sw/qa/extras/ooxmlexport/data/tdf170119_bottomSpacing.docx b/sw/qa/extras/ooxmlexport/data/tdf170119_bottomSpacing.docx new file mode 100644 index 000000000000..74e9de4f5272 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf170119_bottomSpacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx index 1dfc47a7c51c..94a07d25bd91 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx @@ -104,6 +104,14 @@ DECLARE_OOXMLEXPORT_TEST(testTdf170003_bottomSpacing, "tdf170003_bottomSpacing.d getProperty<sal_Int32>(getParagraph(1), u"ParaBottomMargin"_ustr)); } +DECLARE_OOXMLEXPORT_TEST(testTdf170119_bottomSpacing, "tdf170119_bottomSpacing.docx") +{ + // Given a document with a page break and a sectPr with a huge bottom spacing + + // Without the fix, page 2 started with a 150pt gap, pushing content to the third page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + DECLARE_OOXMLEXPORT_TEST(testTdf167657_sectPr_bottomSpacing, "tdf167657_sectPr_bottomSpacing.docx") { // given with a continuous break sectPr with no belowSpacing diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx b/sw/source/writerfilter/dmapper/PropertyMap.cxx index 6d7c2d4768fa..9125c36c69ce 100644 --- a/sw/source/writerfilter/dmapper/PropertyMap.cxx +++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx @@ -1560,6 +1560,22 @@ void SectionPropertyMap::EmulateSectPrBelowSpacing(DomainMapper_Impl& rDM_Impl) // to the last paragraph in that section. // This emulation works because below spacing before a page break normally has no relevance. + if (m_nBreakType == NS_ooxml::LN_Value_ST_SectionMark_continuous) + { + // The complication with continuous breaks is that the below spacing of a sectPr + // does NOT directly affect the layout. + // [So (except before a page break) it MUST NOT be applied to the previous para.] + // However, it IS (indirectly) used to reduce the top margin of the following paragraph. + uno::Reference<beans::XPropertySet> const xPSet(m_xStartingRange, uno::UNO_QUERY); + if (!xPSet) + return; // TODO tdf#170119: emulation not possible without a page break + + style::BreakType eBreakType(style::BreakType_NONE); + xPSet->getPropertyValue(u"BreakType"_ustr) >>= eBreakType; + if (eBreakType != style::BreakType_PAGE_BEFORE) + return; // emulation not possible without a page break. + } + // m_xPreStartingRange may have skipped over a table as the last thing before the break! // If so, then the below spacing can be ignored since tables don't have below spacing. // Also, if m_xStartingRange starts with a table (which also doesn't have above spacing) @@ -1690,6 +1706,9 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) setHeaderFooterProperties(rDM_Impl); InheritOrFinalizePageStyles( rDM_Impl ); ApplySectionProperties( xSection, rDM_Impl ); //depends on InheritOrFinalizePageStyles + + EmulateSectPrBelowSpacing(rDM_Impl); + uno::Reference< beans::XPropertySet > xRangeProperties( lcl_GetRangeProperties( m_bIsFirstSection, rDM_Impl, m_xStartingRange ) ); if ( m_bIsFirstSection && !m_sPageStyleName.isEmpty() && xRangeProperties.is() ) {
