sc/qa/extras/scpdfexport.cxx                       |   18 +++++++++
 sc/qa/extras/testdocuments/tdf159066.ods           |binary
 svx/source/sdr/contact/viewcontactofsdrole2obj.cxx |   38 ++++++++++++++-------
 3 files changed, 44 insertions(+), 12 deletions(-)

New commits:
commit 37eb62c995a72fcd01d5f79e8b04fa0578cb822b
Author:     Tibor Nagy <tibor.nagy.ext...@allotropia.de>
AuthorDate: Thu Jan 11 02:45:05 2024 +0100
Commit:     Nagy Tibor <tibor.nagy.ext...@allotropia.de>
CommitDate: Thu Jan 11 14:14:20 2024 +0100

    tdf#159066 sc: fix OLE object alternative text (PDF/UA export)
    
    Change-Id: I0af9cf61cafbe7ba93d08ed22fc11bb173612bfe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161904
    Tested-by: Jenkins
    Reviewed-by: Nagy Tibor <tibor.nagy.ext...@allotropia.de>

diff --git a/sc/qa/extras/scpdfexport.cxx b/sc/qa/extras/scpdfexport.cxx
index ae85dbb9b442..de888c083387 100644
--- a/sc/qa/extras/scpdfexport.cxx
+++ b/sc/qa/extras/scpdfexport.cxx
@@ -65,6 +65,7 @@ public:
     void testExportFitToPage_Tdf103516();
     void testUnoCommands_Tdf120161();
     void testTdf64703_hiddenPageBreak();
+    void testTdf159066();
     void testTdf159065();
     void testTdf123870();
     void testTdf143978();
@@ -78,6 +79,7 @@ public:
     CPPUNIT_TEST(testExportFitToPage_Tdf103516);
     CPPUNIT_TEST(testUnoCommands_Tdf120161);
     CPPUNIT_TEST(testTdf64703_hiddenPageBreak);
+    CPPUNIT_TEST(testTdf159066);
     CPPUNIT_TEST(testTdf159065);
     CPPUNIT_TEST(testTdf123870);
     CPPUNIT_TEST(testTdf143978);
@@ -396,6 +398,22 @@ void ScPDFExportTest::testTdf64703_hiddenPageBreak()
     }
 }
 
+void ScPDFExportTest::testTdf159066()
+{
+    loadFromFile(u"tdf159066.ods");
+    uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
+
+    // A1:E5
+    ScRange range1(0, 0, 0, 4, 4, 0);
+    exportToPDF(xModel, range1);
+
+    bool bFound = false;
+    CPPUNIT_ASSERT(hasTextInPdf("/Alt<", bFound));
+
+    // The OLE object contains alternative text description
+    CPPUNIT_ASSERT_EQUAL(true, bFound);
+}
+
 void ScPDFExportTest::testTdf159065()
 {
     loadFromFile(u"tdf159065.ods");
diff --git a/sc/qa/extras/testdocuments/tdf159066.ods 
b/sc/qa/extras/testdocuments/tdf159066.ods
new file mode 100644
index 000000000000..c8dafee209c3
Binary files /dev/null and b/sc/qa/extras/testdocuments/tdf159066.ods differ
diff --git a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx 
b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
index ab76225e5713..6899bb5407e2 100644
--- a/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
@@ -29,6 +29,7 @@
 #include <sdr/primitive2d/sdrolecontentprimitive2d.hxx>
 #include <basegfx/matrix/b2dhommatrixtools.hxx>
 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
+#include <drawinglayer/primitive2d/objectinfoprimitive2d.hxx>
 #include <svx/charthelper.hxx>
 #include <svtools/embedhlp.hxx>
 
@@ -85,7 +86,7 @@ void 
ViewContactOfSdrOle2Obj::createPrimitive2DSequenceWithParameters(drawinglay
             rItemSet,
             GetOle2Obj().getText(0),
             true));
-    drawinglayer::primitive2d::Primitive2DReference xContent;
+    drawinglayer::primitive2d::Primitive2DContainer xContent;
 
     if(GetOle2Obj().IsChart())
     {
@@ -110,25 +111,38 @@ void 
ViewContactOfSdrOle2Obj::createPrimitive2DSequenceWithParameters(drawinglay
 
             aEmbed.scale(1.0 / fWidth, 1.0 / fHeight);
             aEmbed = aObjectMatrix * aEmbed;
-            xContent = new drawinglayer::primitive2d::TransformPrimitive2D(
-                aEmbed,
-                std::move(aChartSequence));
+            xContent = drawinglayer::primitive2d::Primitive2DContainer{
+                new drawinglayer::primitive2d::TransformPrimitive2D(aEmbed,
+                                                                    
std::move(aChartSequence))
+            };
         }
     }
 
-    if(!xContent.is())
+    if(xContent.empty())
     {
         // #i102063# embed OLE content in an own primitive; this will be able 
to decompose accessing
         // the weak SdrOle2 reference and will also implement getB2DRange() 
for fast BoundRect
         // calculations without OLE Graphic access (which may trigger e.g. 
chart recalculation).
         // It will also take care of HighContrast and ScaleContent
-        xContent = new drawinglayer::primitive2d::SdrOleContentPrimitive2D(
-            GetOle2Obj(),
-            aObjectMatrix,
+        xContent = drawinglayer::primitive2d::Primitive2DContainer{
+            new drawinglayer::primitive2d::SdrOleContentPrimitive2D(
+                GetOle2Obj(), aObjectMatrix,
+
+                // #i104867# add GraphicVersion number to be able to check for
+                // content change in the primitive later
+                GetOle2Obj().getEmbeddedObjectRef().getGraphicVersion())
+        };
+    }
 
-            // #i104867# add GraphicVersion number to be able to check for
-            // content change in the primitive later
-            GetOle2Obj().getEmbeddedObjectRef().getGraphicVersion() );
+    if (!GetOle2Obj().GetName().isEmpty() || !GetOle2Obj().GetTitle().isEmpty()
+        || !GetOle2Obj().GetDescription().isEmpty())
+    {
+        xContent = drawinglayer::primitive2d::Primitive2DContainer{
+            drawinglayer::primitive2d::Primitive2DReference(
+                new drawinglayer::primitive2d::ObjectInfoPrimitive2D(
+                    std::move(xContent), GetOle2Obj().GetName(), 
GetOle2Obj().GetTitle(),
+                    GetOle2Obj().GetDescription()))
+        };
     }
 
     // create primitive. Use Ole2 primitive here. Prepare attribute settings, 
will
@@ -136,7 +150,7 @@ void 
ViewContactOfSdrOle2Obj::createPrimitive2DSequenceWithParameters(drawinglay
     // SdrOle2Primitive2D to create needed invisible elements for HitTest 
and/or BoundRect
     const drawinglayer::primitive2d::Primitive2DReference xReference(
         new drawinglayer::primitive2d::SdrOle2Primitive2D(
-            drawinglayer::primitive2d::Primitive2DContainer { xContent },
+            std::move(xContent),
             aObjectMatrix,
             aAttribute));
 

Reply via email to