include/oox/export/drawingml.hxx | 2 +- oox/source/export/drawingml.cxx | 10 +++++++--- sd/qa/unit/data/pptx/presLeftAlign.pptx |binary sd/qa/unit/export-tests-ooxml4.cxx | 10 ++++++++++ sd/source/filter/eppt/pptx-epptooxml.cxx | 9 ++++++--- 5 files changed, 24 insertions(+), 7 deletions(-)
New commits: commit b4eef7ef75ea4134561f0de45e59fa1fd2843cde Author: Balazs Varga <[email protected]> AuthorDate: Wed Nov 5 15:50:22 2025 +0100 Commit: Balazs Varga <[email protected]> CommitDate: Sat Nov 8 17:28:00 2025 +0100 tdf#169279 sd: fix bad alignment after saving to pptx and opened in mso issue come up after: ef32ba978d7be844440ee0d9c78ad37128b35512 Change-Id: I84169bf644e3269ad8f57dcd5877efd69ba5dacf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193466 Tested-by: Jenkins Reviewed-by: Balazs Varga <[email protected]> diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index b3346a823162..d5fd0e2eaf5d 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -533,7 +533,7 @@ public: static ::Color ColorWithIntensity( sal_uInt32 nColor, sal_uInt32 nIntensity ); - static const char* GetAlignment( css::style::ParagraphAdjust nAlignment ); + static const char* GetAlignment( css::style::ParagraphAdjust nAlignment, bool bPlaceHolder = false ); sax_fastparser::FSHelperPtr CreateOutputStream ( const OUString& sFullStream, diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 08b0f73872a6..cfeaf8f5fdba 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -3438,7 +3438,7 @@ sal_Int32 DrawingML::getBulletMarginIndentation (const Reference< XPropertySet > return 0; } -const char* DrawingML::GetAlignment( style::ParagraphAdjust nAlignment ) +const char* DrawingML::GetAlignment( style::ParagraphAdjust nAlignment, bool bPlaceHolder ) { const char* sAlignment = nullptr; @@ -3453,6 +3453,10 @@ const char* DrawingML::GetAlignment( style::ParagraphAdjust nAlignment ) case style::ParagraphAdjust_BLOCK: sAlignment = "just"; break; + case style::ParagraphAdjust_LEFT: + if (bPlaceHolder) // in case of PPTX placeholder objects, "l" is necessary for MSO + sAlignment = "l"; + break; default: ; } @@ -3590,7 +3594,7 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra 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_algn, GetAlignment( nAlignment, mbPlaceholder ), XML_defTabSz, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaDefaultTabSize)), nParaDefaultTabSize > 0), XML_rtl, sax_fastparser::UseIf(ToPsz10(bRtl), bRtl)); else @@ -3598,7 +3602,7 @@ bool DrawingML::WriteParagraphProperties(const Reference<XTextContent>& rParagra 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_algn, GetAlignment( nAlignment, mbPlaceholder ), XML_defTabSz, sax_fastparser::UseIf(OString::number(oox::drawingml::convertHmmToEmu(nParaDefaultTabSize)), nParaDefaultTabSize > 0), XML_rtl, sax_fastparser::UseIf(ToPsz10(bRtl), bRtl)); diff --git a/sd/qa/unit/data/pptx/presLeftAlign.pptx b/sd/qa/unit/data/pptx/presLeftAlign.pptx new file mode 100644 index 000000000000..7f3ccdb4bad2 Binary files /dev/null and b/sd/qa/unit/data/pptx/presLeftAlign.pptx differ diff --git a/sd/qa/unit/export-tests-ooxml4.cxx b/sd/qa/unit/export-tests-ooxml4.cxx index c56b21e589cc..833653d0c7de 100644 --- a/sd/qa/unit/export-tests-ooxml4.cxx +++ b/sd/qa/unit/export-tests-ooxml4.cxx @@ -1550,6 +1550,16 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTextStylesXML) u"6000"); } +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testTextAlignLeft) +{ + createSdImpressDoc("pptx/presLeftAlign.pptx"); + save(u"Impress Office Open XML"_ustr); + + xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/slide1.xml"_ustr); + + assertXPath(pXmlDocRels, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:p/a:pPr", "algn", u"l"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 3f1ce75935e2..ee8070ef28be 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -2464,9 +2464,12 @@ ShapeExport& PowerPointShapeExport::WritePlaceholderShape(const Reference< XShap } mpFS->endElementNS(XML_p, XML_spPr); - bool bWritePropertiesAsLstStyles = bUsePlaceholderIndex || ePlaceholder == Title - || ePlaceholder == Subtitle || ePlaceholder == Outliner; - WriteTextBox(xShape, XML_p, bWritePropertiesAsLstStyles); + bool bWritePropertiesAsLstStyles + = (mePageType == PageType::MASTER) + && (ePlaceholder == Title || ePlaceholder == Subtitle || ePlaceholder == Outliner); + + WriteTextBox(xShape, XML_p, + bUsePlaceholderIndex || bWritePropertiesAsLstStyles); mpFS->endElementNS(XML_p, XML_sp);
