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);
 

Reply via email to