diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2023-03-16 19:48:31 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2023-03-25 19:42:03 +0000 |
commit | 11959d05b3df3a2b7670da2df1cc914b22eabae4 (patch) | |
tree | 4f2d905fa680f0b4cfa05257eaceaafe26ff8e5d /svx | |
parent | 1c92038e2e4fdc556ec4ca1e00eff3ae355b683f (diff) |
vcl,drawinglayer,svx,sw,sd: PDF/UA export: Annot StructElem for SdrMediaObj
veraPDF complains:
Specification: ISO 14289-1:2014, Clause: 7.18.1, Test number: 1
An annotation, excluding annotations of subtype Widget, Popup or
Link, shall be nested within an Annot tag
This is very similar to Link annotations, that is to say, extremely
complicated to get it thought the convoluted PDF export code, with
additional complication that the StructElem is produced by drawinglayer
and the page annotation by sw.
Put another map into PDFExtOutDevData where sw code puts stuff for the
SdrObject that drawinglayer can find.
The test had the problem that PDFObjectParser::parse() could not handle:
<</Nums[
0 [ 6 0 R ]
1 6 0 R
]>>
Fix dropping the "1".
Change-Id: If5bf7c552e26ebb7e631030b8aaecd4281e77acc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149314
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx | 1 | ||||
-rw-r--r-- | svx/source/sdr/contact/objectcontact.cxx | 5 | ||||
-rw-r--r-- | svx/source/sdr/contact/objectcontactofobjlistpainter.cxx | 11 | ||||
-rw-r--r-- | svx/source/sdr/contact/objectcontactofpageview.cxx | 11 | ||||
-rw-r--r-- | svx/source/sdr/contact/viewobjectcontact.cxx | 14 | ||||
-rw-r--r-- | svx/source/sdr/contact/viewobjectcontactofpageobj.cxx | 4 |
6 files changed, 45 insertions, 1 deletions
diff --git a/svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx b/svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx index af72593adef2..c977e04a9f69 100644 --- a/svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx +++ b/svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx @@ -78,6 +78,7 @@ public: // pdf export? Default is false virtual bool isOutputToPDFFile() const override; virtual bool isExportTaggedPDF() const override; + virtual ::vcl::PDFExtOutDevData const* GetPDFExtOutDevData() const override; virtual OutputDevice* TryToGetOutputDevice() const override; }; diff --git a/svx/source/sdr/contact/objectcontact.cxx b/svx/source/sdr/contact/objectcontact.cxx index d135a2a29336..4555068ccf01 100644 --- a/svx/source/sdr/contact/objectcontact.cxx +++ b/svx/source/sdr/contact/objectcontact.cxx @@ -176,6 +176,11 @@ bool ObjectContact::isExportTaggedPDF() const return false; } +::vcl::PDFExtOutDevData const* ObjectContact::GetPDFExtOutDevData() const +{ + return nullptr; +} + // gray display mode bool ObjectContact::isDrawModeGray() const { diff --git a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx index b4727ce30b12..d20b1426e63b 100644 --- a/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx +++ b/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx @@ -152,6 +152,17 @@ bool ObjectContactOfObjListPainter::isExportTaggedPDF() const return false; } +::vcl::PDFExtOutDevData const* ObjectContactOfObjListPainter::GetPDFExtOutDevData() const +{ + if (!isOutputToPDFFile()) + { + return nullptr; + } + vcl::PDFExtOutDevData *const pPDFExtOutDevData( + dynamic_cast<vcl::PDFExtOutDevData*>(mrTargetOutputDevice.GetExtOutDevData())); + return pPDFExtOutDevData; +} + OutputDevice* ObjectContactOfObjListPainter::TryToGetOutputDevice() const { return &mrTargetOutputDevice; diff --git a/svx/source/sdr/contact/objectcontactofpageview.cxx b/svx/source/sdr/contact/objectcontactofpageview.cxx index 9d47bab76dd2..26c295472e0b 100644 --- a/svx/source/sdr/contact/objectcontactofpageview.cxx +++ b/svx/source/sdr/contact/objectcontactofpageview.cxx @@ -392,6 +392,17 @@ namespace sdr::contact return false; } + ::vcl::PDFExtOutDevData const* ObjectContactOfPageView::GetPDFExtOutDevData() const + { + if (!isOutputToPDFFile()) + { + return nullptr; + } + vcl::PDFExtOutDevData* pPDFExtOutDevData(dynamic_cast<vcl::PDFExtOutDevData*>( + mrPageWindow.GetPaintWindow().GetOutputDevice().GetExtOutDevData())); + return pPDFExtOutDevData; + } + // gray display mode bool ObjectContactOfPageView::isDrawModeGray() const { diff --git a/svx/source/sdr/contact/viewobjectcontact.cxx b/svx/source/sdr/contact/viewobjectcontact.cxx index 39421a9542e2..2e2ecfe8f711 100644 --- a/svx/source/sdr/contact/viewobjectcontact.cxx +++ b/svx/source/sdr/contact/viewobjectcontact.cxx @@ -35,6 +35,7 @@ #include <svx/svdpage.hxx> #include <svx/svdotext.hxx> #include <vcl/pdfwriter.hxx> +#include <vcl/pdfextoutdevdata.hxx> using namespace com::sun::star; @@ -404,6 +405,8 @@ drawinglayer::primitive2d::Primitive2DContainer const & ViewObjectContact::getPr eElement = vcl::PDFWriter::Section; else if (nIdentifier == SdrObjKind::Table) eElement = vcl::PDFWriter::Table; + else if (nIdentifier == SdrObjKind::Media) + eElement = vcl::PDFWriter::Annot; else if ( nIdentifier == SdrObjKind::TitleText ) eElement = vcl::PDFWriter::Heading; else if ( nIdentifier == SdrObjKind::OutlineText ) @@ -430,13 +433,22 @@ drawinglayer::primitive2d::Primitive2DContainer const & ViewObjectContact::getPr *pSdrObj, *GetObjectContact().TryToGetOutputDevice()); } + ::std::vector<sal_Int32> annotIds; + if (eElement == vcl::PDFWriter::Annot) + { + auto const pPDFExtOutDevData(GetObjectContact().GetPDFExtOutDevData()); + assert(pPDFExtOutDevData); + annotIds = pPDFExtOutDevData->GetScreenAnnotIds(pSdrObj); + } + drawinglayer::primitive2d::Primitive2DReference xReference( new drawinglayer::primitive2d::StructureTagPrimitive2D( eElement, bBackground, bImage, std::move(xNewPrimitiveSequence), - nAnchorId)); + nAnchorId, + &annotIds)); xNewPrimitiveSequence = drawinglayer::primitive2d::Primitive2DContainer { xReference }; } } diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx index fb60e6b55965..d66d3852791f 100644 --- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx @@ -67,6 +67,8 @@ public: virtual bool isOutputToPrinter() const override; virtual bool isOutputToRecordingMetaFile() const override; virtual bool isOutputToPDFFile() const override; + virtual bool isExportTaggedPDF() const override; + virtual ::vcl::PDFExtOutDevData const* GetPDFExtOutDevData() const override; virtual bool isDrawModeGray() const override; virtual bool isDrawModeHighContrast() const override; virtual SdrPageView* TryToGetSdrPageView() const override; @@ -177,6 +179,8 @@ void PagePrimitiveExtractor::InvalidatePartOfView(const basegfx::B2DRange& rRang bool PagePrimitiveExtractor::isOutputToPrinter() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPrinter(); } bool PagePrimitiveExtractor::isOutputToRecordingMetaFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToRecordingMetaFile(); } bool PagePrimitiveExtractor::isOutputToPDFFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPDFFile(); } +bool PagePrimitiveExtractor::isExportTaggedPDF() const { return mrViewObjectContactOfPageObj.GetObjectContact().isExportTaggedPDF(); } +::vcl::PDFExtOutDevData const* PagePrimitiveExtractor::GetPDFExtOutDevData() const { return mrViewObjectContactOfPageObj.GetObjectContact().GetPDFExtOutDevData(); } bool PagePrimitiveExtractor::isDrawModeGray() const { return mrViewObjectContactOfPageObj.GetObjectContact().isDrawModeGray(); } bool PagePrimitiveExtractor::isDrawModeHighContrast() const { return mrViewObjectContactOfPageObj.GetObjectContact().isDrawModeHighContrast(); } SdrPageView* PagePrimitiveExtractor::TryToGetSdrPageView() const { return mrViewObjectContactOfPageObj.GetObjectContact().TryToGetSdrPageView(); } |