filter/source/msfilter/svdfppt.cxx | 4 +- oox/source/export/chartexport.cxx | 57 +++++++++++++++++++------------------ oox/source/export/drawingml.cxx | 14 +++++++-- 3 files changed, 45 insertions(+), 30 deletions(-)
New commits: commit 680d341a1bab9eb28dd3980d47577a2f82afd7e2 Author: Karthik <[email protected]> AuthorDate: Thu Oct 9 21:33:23 2025 +0530 Commit: Xisco Fauli <[email protected]> CommitDate: Tue Nov 4 18:06:50 2025 +0100 impress: fix PPT->PPTX margin interoperability issue Saving a PPT file as PPTX could corrupt the output if the left margin was set too high. The margin value must not exceed 51206400 EMUs. ([ISO/IEC 29500-1] 20.1.10.72). The patch sets an upper limit on margin values during both PPT import and PPTX export. Change-Id: I59791059ed4805ec52133cd7926a1e752a18b701 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192121 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> (cherry picked from commit 70f344e6376f572fa85a4c3f74228588ed2a6b63) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193073 Tested-by: Jenkins Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193418 diff --git a/filter/source/msfilter/svdfppt.cxx b/filter/source/msfilter/svdfppt.cxx index 68885fbeae4d..60d3320af05e 100644 --- a/filter/source/msfilter/svdfppt.cxx +++ b/filter/source/msfilter/svdfppt.cxx @@ -6173,10 +6173,12 @@ void PPTParagraphObj::ApplyTo( SfxItemSet& rSet, std::optional< sal_Int16 >& rS SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE ); if ( !nIsBullet2 ) { + // The margin value can't be greater than 51206400 Emu, which is 142240 MM100 ([ISO/IEC 29500-1] 20.1.10.72) + sal_uInt32 nMaxMarginVal = 142240; auto const nAbsLSpace = convertMasterUnitToMm100(_nTextOfs); auto const nFirstLineOffset = nAbsLSpace - convertMasterUnitToMm100(_nBulletOfs); aLRSpaceItem.SetTextFirstLineOffset(SvxIndentValue::twips(-nFirstLineOffset)); - aLRSpaceItem.SetTextLeft(SvxIndentValue::twips(nAbsLSpace)); + aLRSpaceItem.SetTextLeft(SvxIndentValue::twips(nAbsLSpace > nMaxMarginVal ? 0 : nAbsLSpace)); } rSet.Put( aLRSpaceItem ); diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index ba3608dee370..b5bc60c6a9d3 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -3600,6 +3600,13 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra // ST_TextIndentLevelType const sal_Int16 nOutLevel = std::min(nLevel, sal_Int16(8)); + // ST_TextMargin: The margin value can't be greater than 51206400 Emu, which is 142240 MM100 ([ISO/IEC 29500-1] 20.1.10.72) + sal_Int32 nMaxMarginVal = 142240; + if (nParaLeftMargin > nMaxMarginVal) + nParaLeftMargin = 0; + if (nLeftMargin > nMaxMarginVal) + nLeftMargin = 0; + if (nParaLeftMargin) // For Paragraph mpFS->startElementNS( XML_a, nElement, XML_marL, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaLeftMargin)), nParaLeftMargin > 0), commit a2280b0a6364af7bdfd8cf2e15bf382b1fb0c838 Author: Michael Meeks <[email protected]> AuthorDate: Mon Oct 6 14:57:02 2025 +0100 Commit: Xisco Fauli <[email protected]> CommitDate: Tue Nov 4 18:06:43 2025 +0100 oox: crop ST_TextIndentLevelType to maximum value of 8. Signed-off-by: Michael Meeks <[email protected]> Change-Id: I5994b4414a4ef79564a44a8a661498765fd4b125 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191980 Tested-by: Jenkins Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193417 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 1782a11d51c9..ba3608dee370 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -3597,18 +3597,21 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra if (GetProperty(rXPropSet, u"ParaTabStopDefaultDistance"_ustr)) mAny >>= nParaDefaultTabSize; + // ST_TextIndentLevelType + const sal_Int16 nOutLevel = std::min(nLevel, sal_Int16(8)); + if (nParaLeftMargin) // For Paragraph mpFS->startElementNS( XML_a, nElement, - XML_lvl, sax_fastparser::UseIf(OString::number(nLevel), nLevel > 0), XML_marL, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaLeftMargin)), nParaLeftMargin > 0), + XML_lvl, sax_fastparser::UseIf(OString::number(nOutLevel), nOutLevel > 0), XML_indent, sax_fastparser::UseIf(OString::number((bForceZeroIndent && nParaFirstLineIndent == 0) ? 0 : oox::drawingml::convertHmmToEmu(nParaFirstLineIndent)), (bForceZeroIndent || nParaFirstLineIndent != 0)), XML_algn, GetAlignment( nAlignment ), XML_defTabSz, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaDefaultTabSize)), nParaDefaultTabSize > 0), XML_rtl, sax_fastparser::UseIf(ToPsz10(bRtl), bRtl)); else mpFS->startElementNS( XML_a, nElement, - XML_lvl, sax_fastparser::UseIf(OString::number(nLevel), nLevel > 0), XML_marL, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nLeftMargin)), nLeftMargin > 0), + XML_lvl, sax_fastparser::UseIf(OString::number(nOutLevel), nOutLevel > 0), XML_indent, sax_fastparser::UseIf(OString::number(!bForceZeroIndent ? oox::drawingml::convertHmmToEmu(nLineIndentation) : 0), (bForceZeroIndent || ( nLineIndentation != 0))), XML_algn, GetAlignment( nAlignment ), XML_defTabSz, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaDefaultTabSize)), nParaDefaultTabSize > 0), commit d511a09d9bb6276cefc4cef5fd6795b84b382974 Author: Noel Grandin <[email protected]> AuthorDate: Mon Nov 3 13:32:42 2025 +0200 Commit: Xisco Fauli <[email protected]> CommitDate: Tue Nov 4 18:06:36 2025 +0100 mso-test: c:dLbl element wrong order This is using the test document from ttdf92129-5.odt. When importing and exporting to DOCX, we were writing the dLbl before the numFormat element, instead of after it. Change-Id: I541688f2df4f879294ad56182db8eb1df6edf182 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193344 Reviewed-by: Michael Stahl <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> (cherry picked from commit 5f3fca8a18aa697904a0310db22db6dab27fba67) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193383 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> (cherry picked from commit 320a5640dec289cc936b9de51a09760d33432acd) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193389 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index aba13dd9bb6c..f7e9cb75b5b4 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -4718,33 +4718,6 @@ void ChartExport::exportDataLabels( pFS->startElement(FSNS(XML_c, XML_dLbls)); } - bool bLinkedNumFmt = true; - if (GetProperty(xPropSet, u"LinkNumberFormatToSource"_ustr)) - mAny >>= bLinkedNumFmt; - - chart2::DataPointLabel aLabel; - bool bLabelIsNumberFormat = true; - if( xPropSet->getPropertyValue(u"Label"_ustr) >>= aLabel ) - bLabelIsNumberFormat = aLabel.ShowNumber; - - if (GetProperty(xPropSet, bLabelIsNumberFormat ? u"NumberFormat"_ustr : u"PercentageNumberFormat"_ustr)) - { - sal_Int32 nKey = 0; - mAny >>= nKey; - - OUString aNumberFormatString = getNumberFormatCode(nKey); - - if (bIsChartex) { - pFS->singleElement(FSNS(XML_cx, XML_numFmt), - XML_formatCode, aNumberFormatString, - XML_sourceLinked, ToPsz10(bLinkedNumFmt)); - } else { - pFS->singleElement(FSNS(XML_c, XML_numFmt), - XML_formatCode, aNumberFormatString, - XML_sourceLinked, ToPsz10(bLinkedNumFmt)); - } - } - uno::Sequence<sal_Int32> aAttrLabelIndices; xPropSet->getPropertyValue(u"AttributedDataPoints"_ustr) >>= aAttrLabelIndices; @@ -4851,9 +4824,12 @@ void ChartExport::exportDataLabels( } } + bool bLinkedNumFmt = false; if( GetProperty(xLabelPropSet, u"LinkNumberFormatToSource"_ustr) ) mAny >>= bLinkedNumFmt; + chart2::DataPointLabel aLabel; + bool bLabelIsNumberFormat = true; if( xLabelPropSet->getPropertyValue(u"Label"_ustr) >>= aLabel ) bLabelIsNumberFormat = aLabel.ShowNumber; else @@ -4881,6 +4857,33 @@ void ChartExport::exportDataLabels( pFS->endElement(FSNS(XML_c, XML_dLbl)); } + bool bLinkedNumFmt = true; + if (GetProperty(xPropSet, u"LinkNumberFormatToSource"_ustr)) + mAny >>= bLinkedNumFmt; + + chart2::DataPointLabel aLabel; + bool bLabelIsNumberFormat = true; + if( xPropSet->getPropertyValue(u"Label"_ustr) >>= aLabel ) + bLabelIsNumberFormat = aLabel.ShowNumber; + + if (GetProperty(xPropSet, bLabelIsNumberFormat ? u"NumberFormat"_ustr : u"PercentageNumberFormat"_ustr)) + { + sal_Int32 nKey = 0; + mAny >>= nKey; + + OUString aNumberFormatString = getNumberFormatCode(nKey); + + if (bIsChartex) { + pFS->singleElement(FSNS(XML_cx, XML_numFmt), + XML_formatCode, aNumberFormatString, + XML_sourceLinked, ToPsz10(bLinkedNumFmt)); + } else { + pFS->singleElement(FSNS(XML_c, XML_numFmt), + XML_formatCode, aNumberFormatString, + XML_sourceLinked, ToPsz10(bLinkedNumFmt)); + } + } + // Baseline label properties for all labels. writeLabelProperties(pFS, this, xPropSet, aParam, -1, rDLblsRange, bIsChartex);
