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?