From eb338daa90afd569e1b86c058bb88a89fab6a557 Mon Sep 17 00:00:00 2001 From: Aron Budea Date: Fri, 5 Dec 2025 15:28:56 +1030 Subject: [PATCH] tdf#169825 AutoLayout can be incorrectly exported to PPTX ...as vertTitleAndTxOverChart, if ODP layout was AUTOLAYOUT_NOTES, causing corruption. PPTX export code directly matched LO's AutoLayout IDs to PPTX layout types (OOXML spec: 19.7.15 ST_SlideLayoutType (Slide Layout Type)) without conversion, as some don't have direct match, and need to be matched to blank layouts. This could result in PPTXes that can't be opened in PowerPoint. It could also result in PPTXes with wrong layout types when using LO's own vertical layouts. The files could still be opened in PP in this case. In addition, import code imported vertical PPTX layouts with wrong IDs, matching them to notes and handout autolayouts. Part of the mentioned behavior happened since bff76421e234df7246a7f49c71a11432f86e09d1. Change-Id: Iba7a50795979c22bc566aa2cd6ea4d82f7f9477e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195049 Tested-by: Jenkins Reviewed-by: Mike Kaganski Reviewed-by: Aron Budea --- oox/source/ppt/slidepersist.cxx | 12 ++- sd/qa/unit/data/odp/tdf169825_layout_type.odp | Bin 0 -> 19923 bytes .../data/pptx/tdf169825_vertical_layouts.pptx | Bin 0 -> 31377 bytes sd/qa/unit/export-tests-ooxml4.cxx | 89 ++++++++++++++++++ sd/source/filter/eppt/epptbase.hxx | 1 - sd/source/filter/eppt/epptooxml.hxx | 3 +- sd/source/filter/eppt/pptx-epptooxml.cxx | 43 +++++---- 7 files changed, 123 insertions(+), 25 deletions(-) create mode 100644 sd/qa/unit/data/odp/tdf169825_layout_type.odp create mode 100644 sd/qa/unit/data/pptx/tdf169825_vertical_layouts.pptx diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index 847ab5f2ab97..5ec9913e80a8 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -88,6 +88,8 @@ SlidePersist::~SlidePersist() { } +// the list 'const PPTXLayoutInfo aLayoutInfo[...]' used in PowerPointExport +// likely needs to be updated after any changes here sal_Int16 SlidePersist::getLayoutFromValueToken() const { sal_Int16 nLayout = 20; // 20 == blank (so many magic numbers :-( the description at com.sun.star.presentation.DrawPage.Layout does not help) @@ -97,7 +99,7 @@ sal_Int16 SlidePersist::getLayoutFromValueToken() const case XML_chart: nLayout = 2; break; case XML_chartAndTx: nLayout = 7; break; case XML_clipArtAndTx: nLayout = 9; break; - case XML_clipArtAndVertTx: nLayout = 24; break; + case XML_clipArtAndVertTx: nLayout = 30; break; case XML_fourObj: nLayout = 18; break; case XML_obj: nLayout = 11; break; case XML_objAndTx: nLayout = 13; break; @@ -112,15 +114,15 @@ sal_Int16 SlidePersist::getLayoutFromValueToken() const case XML_twoObjOverTx: nLayout = 16; break; case XML_tx: nLayout = 1; break; case XML_txAndChart: nLayout = 4; break; - case XML_txAndClipArt: nLayout = 6; break; + case XML_txAndClipArt: case XML_txAndMedia: nLayout = 6; break; case XML_txAndObj: nLayout = 10; break; case XML_objAndTwoObj: case XML_txAndTwoObj: nLayout = 12; break; case XML_txOverObj: nLayout = 17; break; - case XML_vertTitleAndTx: nLayout = 22; break; - case XML_vertTitleAndTxOverChart: nLayout = 21; break; - case XML_vertTx: nLayout = 23; break; + case XML_vertTitleAndTx: nLayout = 28; break; + case XML_vertTitleAndTxOverChart: nLayout = 27; break; + case XML_vertTx: nLayout = 29; break; case XML_objOnly: nLayout = 32; break; case XML_twoTxTwoObj: diff --git a/sd/qa/unit/data/odp/tdf169825_layout_type.odp b/sd/qa/unit/data/odp/tdf169825_layout_type.odp new file mode 100644 index 0000000000000000000000000000000000000000..aa9dda3742626bb93bc4a0dd8846ce0413f7a61a GIT binary patch literal 19923 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

P|O+a48#Ms#f6a7(u%Xd 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 Q&@tdO4oof|+8_M&Km2~(aR2}S literal 0 HcmV?d00001 diff --git a/sd/qa/unit/export-tests-ooxml4.cxx b/sd/qa/unit/export-tests-ooxml4.cxx index cb79b15a30b3..2593861453ca 100644 --- a/sd/qa/unit/export-tests-ooxml4.cxx +++ b/sd/qa/unit/export-tests-ooxml4.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -1712,6 +1713,94 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testtdf169496_hidden_graphic) CPPUNIT_FAIL("Names of graphics is incorrect"); } +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testtdf169825_vertical_layouts) +{ + createSdImpressDoc("pptx/tdf169825_vertical_layouts.pptx"); + save(TestFilter::PPTX); + + xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/_rels/slide1.xml.rels"_ustr); + CPPUNIT_ASSERT(pXmlDocRels); + // find layout XML for the slide from the relationship file + OUString sLayoutRelRelative + = getXPath(pXmlDocRels, "/rels:Relationships/rels:Relationship", "Target"); + OUString sLayoutRelAbs = sLayoutRelRelative.replaceFirst("..", "ppt"); + xmlDocUniquePtr pXmlDocLayout = parseExport(sLayoutRelAbs); + CPPUNIT_ASSERT(pXmlDocLayout); + + // without the SlidePersist::getLayoutFromValueToken() part of the patch, + // this and the next layout types would both be exported as blank + assertXPath(pXmlDocLayout, "/p:sldLayout", "type", u"vertTitleAndTx"); + + pXmlDocRels = parseExport(u"ppt/slides/_rels/slide2.xml.rels"_ustr); + CPPUNIT_ASSERT(pXmlDocRels); + sLayoutRelRelative = getXPath(pXmlDocRels, "/rels:Relationships/rels:Relationship", "Target"); + sLayoutRelAbs = sLayoutRelRelative.replaceFirst("..", "ppt"); + pXmlDocLayout = parseExport(sLayoutRelAbs); + CPPUNIT_ASSERT(pXmlDocLayout); + + assertXPath(pXmlDocLayout, "/p:sldLayout", "type", u"vertTx"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testtdf169825_vertical_layouts_from_scratch) +{ + createSdImpressDoc(); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xPages = xDoc->getDrawPages(); + uno::Reference xPage(xPages->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPageSet(xPage, uno::UNO_QUERY_THROW); + xPageSet->setPropertyValue( + "Layout", + uno::Any(static_cast(AutoLayout::AUTOLAYOUT_VTITLE_VCONTENT_OVER_VCONTENT))); + + uno::Reference xPage2(xPages->insertNewByIndex(1), uno::UNO_SET_THROW); + uno::Reference xPageSet2(xPage2, uno::UNO_QUERY_THROW); + xPageSet2->setPropertyValue( + "Layout", uno::Any(static_cast(AutoLayout::AUTOLAYOUT_VTITLE_VCONTENT))); + save(TestFilter::PPTX); + + xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/_rels/slide1.xml.rels"_ustr); + CPPUNIT_ASSERT(pXmlDocRels); + // find layout XML for the slide from the relationship file + OUString sLayoutRelRelative + = getXPath(pXmlDocRels, "/rels:Relationships/rels:Relationship", "Target"); + OUString sLayoutRelAbs = sLayoutRelRelative.replaceFirst("..", "ppt"); + xmlDocUniquePtr pXmlDocLayout = parseExport(sLayoutRelAbs); + CPPUNIT_ASSERT(pXmlDocLayout); + + // without the fix in place this would be exported as "objTx" + assertXPath(pXmlDocLayout, "/p:sldLayout", "type", u"vertTitleAndTxOverChart"); + + pXmlDocRels = parseExport(u"ppt/slides/_rels/slide2.xml.rels"_ustr); + CPPUNIT_ASSERT(pXmlDocRels); + sLayoutRelRelative = getXPath(pXmlDocRels, "/rels:Relationships/rels:Relationship", "Target"); + sLayoutRelAbs = sLayoutRelRelative.replaceFirst("..", "ppt"); + pXmlDocLayout = parseExport(sLayoutRelAbs); + CPPUNIT_ASSERT(pXmlDocLayout); + + // without the fix in place this would be exported as "picTx" + assertXPath(pXmlDocLayout, "/p:sldLayout", "type", u"vertTitleAndTx"); +} + +CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testtdf169825_layout_type) +{ + createSdImpressDoc("odp/tdf169825_layout_type.odp"); + save(TestFilter::PPTX); + + xmlDocUniquePtr pXmlDocRels = parseExport(u"ppt/slides/_rels/slide1.xml.rels"_ustr); + CPPUNIT_ASSERT(pXmlDocRels); + // find layout XML for the slide from the relationship file + OUString sLayoutRelRelative + = getXPath(pXmlDocRels, "/rels:Relationships/rels:Relationship", "Target"); + OUString sLayoutRelAbs = sLayoutRelRelative.replaceFirst("..", "ppt"); + xmlDocUniquePtr pXmlDocLayout = parseExport(sLayoutRelAbs); + CPPUNIT_ASSERT(pXmlDocLayout); + + // without the fix in place this would be exported as "vertTitleAndTxOverChart" + // while in the original ODP this was - still possibly bogus - notes layout + assertXPath(pXmlDocLayout, "/p:sldLayout", "type", u"blank"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/filter/eppt/epptbase.hxx b/sd/source/filter/eppt/epptbase.hxx index a24bd1a5a38c..87d5d386e6cb 100644 --- a/sd/source/filter/eppt/epptbase.hxx +++ b/sd/source/filter/eppt/epptbase.hxx @@ -76,7 +76,6 @@ enum class EppLayout }; #define EPP_LAYOUT_SIZE 25 -#define OOXML_LAYOUT_SIZE 36 struct PHLayout { diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx index 2dea61ff2e6f..55d106be70b5 100644 --- a/sd/source/filter/eppt/epptooxml.hxx +++ b/sd/source/filter/eppt/epptooxml.hxx @@ -23,6 +23,7 @@ #include #include #include +#include #include "epptbase.hxx" using ::sax_fastparser::FSHelperPtr; @@ -147,7 +148,7 @@ private: ::sax_fastparser::FSHelperPtr mPresentationFS; - LayoutInfo mLayoutInfo[OOXML_LAYOUT_SIZE]; + LayoutInfo mLayoutInfo[AUTOLAYOUT_END]; // Pairs of masters and layouts as used by Impress std::vector> maMastersLayouts; // For each Impress master, which master will represent it on the exported file (SAL_MAX_UINT32 if not in an equivalency group) diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 46879dd2151e..0a51893951b4 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -26,6 +26,7 @@ #include "epptooxml.hxx" #include #include +#include #include #include @@ -234,20 +235,25 @@ struct PPTXLayoutInfo } -const PPTXLayoutInfo aLayoutInfo[OOXML_LAYOUT_SIZE] = +// the function 'SlidePersist::getLayoutFromValueToken()' +// likely needs to be updated after any changes here +// unsupported PPTX layouts: txAndMedia, twoColTx, twoTxTwoObj, +// twoObjAndObj, objTx, picTx, secHead, objOnly, objAndTwoObj, +// mediaAndTx, dgm, cust +const PPTXLayoutInfo aLayoutInfo[] = { { 0, "Title Slide", "title" }, { 1, "Title and text", "tx" }, { 2, "Title and chart", "chart" }, { 3, "Title, text on left, text on right", "twoObj" }, { 4, "Title, text on left and chart on right", "txAndChart" }, + { 20, "Blank Slide", "blank" }, { 6, "Title, text on left, clip art on right", "txAndClipArt" }, - { 6, "Title, text on left, media on right", "txAndMedia" }, { 7, "Title, chart on left and text on right", "chartAndTx" }, { 8, "Title and table", "tbl" }, { 9, "Title, clipart on left, text on right", "clipArtAndTx" }, { 10, "Title, text on left, object on right", "txAndObj" }, - { 1, "Title and object", "obj" }, + { 11, "Title and object", "obj" }, { 12, "Title, text on left, two objects on right", "txAndTwoObj" }, { 13, "Title, object on left, text on right", "objAndTx" }, { 14, "Title, object on top, text on bottom", "objOverTx" }, @@ -257,22 +263,23 @@ const PPTXLayoutInfo aLayoutInfo[OOXML_LAYOUT_SIZE] = { 18, "Title and four objects", "fourObj" }, { 19, "Title Only", "titleOnly" }, { 20, "Blank Slide", "blank" }, - { 21, "Vertical title on right, vertical text on top, chart on bottom", "vertTitleAndTxOverChart" }, - { 22, "Vertical title on right, vertical text on left", "vertTitleAndTx" }, - { 23, "Title and vertical text body", "vertTx" }, - { 24, "Title, clip art on left, vertical text on right", "clipArtAndVertTx" }, - { 20, "Title, two objects each with text", "twoTxTwoObj" }, - { 15, "Title, two objects on left, one object on right", "twoObjAndObj" }, - { 20, "Title, object and caption text", "objTx" }, - { 20, "Title, picture, and caption text", "picTx" }, - { 20, "Section header title and subtitle text", "secHead" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" }, + { 27, "Vertical title on right, vertical text on top, chart on bottom", "vertTitleAndTxOverChart" }, + { 28, "Vertical title on right, vertical text on left", "vertTitleAndTx" }, + { 29, "Title and vertical text body", "vertTx" }, + { 30, "Title, clip art on left, vertical text on right", "clipArtAndVertTx" }, + { 20, "Blank Slide", "blank" }, { 32, "Object only", "objOnly" }, - { 12, "Title, one object on left, two objects on right", "objAndTwoObj" }, - { 20, "Title, media on left, text on right", "mediaAndTx" }, - { 34, "Title, 6 Content", "blank" }, // not defined in OOXML => blank - { 2, "Title and diagram", "dgm" }, - { 0, "Custom layout defined by user", "cust" }, + { 20, "Blank Slide", "blank" }, + { 20, "Blank Slide", "blank" } }; +static_assert(std::size(aLayoutInfo) == AUTOLAYOUT_END, + "aLayoutInfo must have a corresponding item for each AUTOLAYOUT"); PowerPointShapeExport::PowerPointShapeExport(FSHelperPtr pFS, ShapeHashMap* pShapeMap, PowerPointExport* pFB) @@ -1962,7 +1969,7 @@ void PowerPointExport::ImplWriteSlideMaster(sal_uInt32 nPageNum, Reference< XPro Reference xNamed(mXDrawPage, UNO_QUERY); if (xNamed.is()) aSlideName = xNamed->getName(); - for (int i = 0; i < OOXML_LAYOUT_SIZE; ++i) + for (int i = 0; i < AUTOLAYOUT_END; ++i) { if (mLayoutInfo[i].mnFileIdArray.size() > nPageNum && mLayoutInfo[i].mnFileIdArray[nPageNum] > 0)