summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2023-03-16 19:48:31 +0100
committerCaolán McNamara <caolanm@redhat.com>2023-03-25 19:42:03 +0000
commit11959d05b3df3a2b7670da2df1cc914b22eabae4 (patch)
tree4f2d905fa680f0b4cfa05257eaceaafe26ff8e5d /svx
parent1c92038e2e4fdc556ec4ca1e00eff3ae355b683f (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.hxx1
-rw-r--r--svx/source/sdr/contact/objectcontact.cxx5
-rw-r--r--svx/source/sdr/contact/objectcontactofobjlistpainter.cxx11
-rw-r--r--svx/source/sdr/contact/objectcontactofpageview.cxx11
-rw-r--r--svx/source/sdr/contact/viewobjectcontact.cxx14
-rw-r--r--svx/source/sdr/contact/viewobjectcontactofpageobj.cxx4
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(); }