svx/source/sdr/contact/viewobjectcontact.cxx |  105 +++++++++++++++------------
 1 file changed, 60 insertions(+), 45 deletions(-)

New commits:
commit 81ef84648515965bf67afaced946227d0f63a71e
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Wed Nov 30 16:40:27 2022 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Thu Dec 1 17:04:58 2022 +0100

    (related: tdf#135192) svx: PDF/UA export: tag background as Artifact
    
     ISO 14289-1:2014, Clause: 7.1, Test number: 3
     Content shall be marked as Artifact or tagged as real content
    
    This needs to have an effect on ViewObjectContactOfSdrPage etc.
    but let's put it in ViewObjectContact and hope anything that's not
    SdrObject can be tagged as Artifact.
    
    Also VclMetafileProcessor2D::processStructureTagPrimitive2D() has a very
    peculiar habit of ignoring any obvious way to create an Artifact,
    which should perhaps be fixed?
    
    Change-Id: I8d22c36a8e31692d3ee24af692026e02b8faa70a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143502
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    Tested-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/svx/source/sdr/contact/viewobjectcontact.cxx 
b/svx/source/sdr/contact/viewobjectcontact.cxx
index 9d88819a9fe2..39421a9542e2 100644
--- a/svx/source/sdr/contact/viewobjectcontact.cxx
+++ b/svx/source/sdr/contact/viewobjectcontact.cxx
@@ -385,59 +385,74 @@ drawinglayer::primitive2d::Primitive2DContainer const & 
ViewObjectContact::getPr
 
     // Check if we need to embed to a StructureTagPrimitive2D, too. This
     // was done at ImplRenderPaintProc::createRedirectedPrimitive2DSequence 
before
-    if(!xNewPrimitiveSequence.empty() && nullptr != pSdrObj && 
GetObjectContact().isExportTaggedPDF())
+    if (!xNewPrimitiveSequence.empty() && 
GetObjectContact().isExportTaggedPDF())
     {
-        vcl::PDFWriter::StructElement 
eElement(vcl::PDFWriter::NonStructElement);
-        const SdrInventor nInventor(pSdrObj->GetObjInventor());
-        const SdrObjKind nIdentifier(pSdrObj->GetObjIdentifier());
-        const bool bIsTextObj(nullptr != DynCastSdrTextObj(pSdrObj));
-
-        // Note: SwFlyDrawObj/SwVirtFlyDrawObj have SdrInventor::Swg - these
-        // are *not* handled here because not all of them are painted
-        // completely with primitives, so a tag here does not encapsulate them.
-        // The tag must be created by SwTaggedPDFHelper until this is fixed.
-        if ( nInventor == SdrInventor::Default )
+        if (nullptr != pSdrObj)
         {
-            if ( nIdentifier == SdrObjKind::Group )
-                eElement = vcl::PDFWriter::Section;
-            else if (nIdentifier == SdrObjKind::Table)
-                eElement = vcl::PDFWriter::Table;
-            else if ( nIdentifier == SdrObjKind::TitleText )
-                eElement = vcl::PDFWriter::Heading;
-            else if ( nIdentifier == SdrObjKind::OutlineText )
-                eElement = vcl::PDFWriter::Division;
-            else if ( !bIsTextObj || !static_cast<const 
SdrTextObj&>(*pSdrObj).HasText() )
-                eElement = vcl::PDFWriter::Figure;
-            else
-                eElement = vcl::PDFWriter::Division;
-        }
-
-        if(vcl::PDFWriter::NonStructElement != eElement)
-        {
-            SdrPage* pSdrPage(pSdrObj->getSdrPageFromSdrObject());
+            vcl::PDFWriter::StructElement 
eElement(vcl::PDFWriter::NonStructElement);
+            const SdrInventor nInventor(pSdrObj->GetObjInventor());
+            const SdrObjKind nIdentifier(pSdrObj->GetObjIdentifier());
+            const bool bIsTextObj(nullptr != DynCastSdrTextObj(pSdrObj));
+
+            // Note: SwFlyDrawObj/SwVirtFlyDrawObj have SdrInventor::Swg - 
these
+            // are *not* handled here because not all of them are painted
+            // completely with primitives, so a tag here does not encapsulate 
them.
+            // The tag must be created by SwTaggedPDFHelper until this is 
fixed.
+            if ( nInventor == SdrInventor::Default )
+            {
+                if ( nIdentifier == SdrObjKind::Group )
+                    eElement = vcl::PDFWriter::Section;
+                else if (nIdentifier == SdrObjKind::Table)
+                    eElement = vcl::PDFWriter::Table;
+                else if ( nIdentifier == SdrObjKind::TitleText )
+                    eElement = vcl::PDFWriter::Heading;
+                else if ( nIdentifier == SdrObjKind::OutlineText )
+                    eElement = vcl::PDFWriter::Division;
+                else if ( !bIsTextObj || !static_cast<const 
SdrTextObj&>(*pSdrObj).HasText() )
+                    eElement = vcl::PDFWriter::Figure;
+                else
+                    eElement = vcl::PDFWriter::Division;
+            }
 
-            if(pSdrPage)
+            if(vcl::PDFWriter::NonStructElement != eElement)
             {
-                const bool bBackground(pSdrPage->IsMasterPage());
-                const bool bImage(SdrObjKind::Graphic == 
pSdrObj->GetObjIdentifier());
-                // note: there must be output device here, in PDF export
-                sal_Int32 nAnchorId(-1);
-                if (auto const pUserCall = pSdrObj->GetUserCall())
+                SdrPage* pSdrPage(pSdrObj->getSdrPageFromSdrObject());
+
+                if(pSdrPage)
                 {
-                    nAnchorId = pUserCall->GetPDFAnchorStructureElementId(
-                        *pSdrObj, *GetObjectContact().TryToGetOutputDevice());
+                    const bool bBackground(pSdrPage->IsMasterPage());
+                    const bool bImage(SdrObjKind::Graphic == 
pSdrObj->GetObjIdentifier());
+                    // note: there must be output device here, in PDF export
+                    sal_Int32 nAnchorId(-1);
+                    if (auto const pUserCall = pSdrObj->GetUserCall())
+                    {
+                        nAnchorId = pUserCall->GetPDFAnchorStructureElementId(
+                            *pSdrObj, 
*GetObjectContact().TryToGetOutputDevice());
+                    }
+
+                    drawinglayer::primitive2d::Primitive2DReference xReference(
+                        new drawinglayer::primitive2d::StructureTagPrimitive2D(
+                            eElement,
+                            bBackground,
+                            bImage,
+                            std::move(xNewPrimitiveSequence),
+                            nAnchorId));
+                    xNewPrimitiveSequence = 
drawinglayer::primitive2d::Primitive2DContainer { xReference };
                 }
-
-                drawinglayer::primitive2d::Primitive2DReference xReference(
-                    new drawinglayer::primitive2d::StructureTagPrimitive2D(
-                        eElement,
-                        bBackground,
-                        bImage,
-                        std::move(xNewPrimitiveSequence),
-                        nAnchorId));
-                xNewPrimitiveSequence = 
drawinglayer::primitive2d::Primitive2DContainer { xReference };
             }
         }
+        else
+        {
+            // page backgrounds etc should be tagged as artifacts:
+            xNewPrimitiveSequence = 
drawinglayer::primitive2d::Primitive2DContainer {
+                    new drawinglayer::primitive2d::StructureTagPrimitive2D(
+                        // lies to force silly VclMetafileProcessor2D to emit 
NonStructElement
+                        vcl::PDFWriter::Division,
+                        true,
+                        true,
+                        std::move(xNewPrimitiveSequence))
+                };
+        }
     }
 
     // Local up-to-date checks. New list different from local one?

Reply via email to