drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx | 5 + svx/source/table/viewcontactoftableobj.cxx | 8 ++ vcl/qa/cppunit/pdfexport/pdfexport.cxx | 41 ++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-)
New commits: commit 0bc96b8805f2cfa2278729a9f3e56a350ddd69ad Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Nov 30 15:06:02 2022 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Thu Dec 1 17:01:42 2022 +0100 tdf#135192 drawinglayer,svx: PDF/UA export: also tag TH for SdrTableObj There isn't really an indication of anything being a header row, but the table template application has a flag to apply special formatting to the first row, so let's use that as indication that it's a header row Change-Id: Ic361c84d9a1a4e91109d6f9d2cd626c9633b311f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143500 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx index 393fbfee9cfc..3b3f27ba302c 100644 --- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx @@ -2460,6 +2460,11 @@ void VclMetafileProcessor2D::processStructureTagPrimitive2D( default: break; } + if (rTagElement == vcl::PDFWriter::TableHeader) + { + mpPDFExtOutDevData->SetStructureAttribute(vcl::PDFWriter::Scope, + vcl::PDFWriter::Column); + } } // background object else diff --git a/svx/source/table/viewcontactoftableobj.cxx b/svx/source/table/viewcontactoftableobj.cxx index df271a3e2404..da11d1741789 100644 --- a/svx/source/table/viewcontactoftableobj.cxx +++ b/svx/source/table/viewcontactoftableobj.cxx @@ -354,9 +354,15 @@ namespace sdr::contact } if (pPage) { + // heuristic: if there's a special formatting on + // first row, assume that it's a header row + auto const eType( + aCellPos.mnRow == 0 && rTableObj.getTableStyleSettings().mbUseFirstRow + ? vcl::PDFWriter::TableHeader + : vcl::PDFWriter::TableData); cell = drawinglayer::primitive2d::Primitive2DContainer { new drawinglayer::primitive2d::StructureTagPrimitive2D( - vcl::PDFWriter::TableData, + eType, pPage->IsMasterPage(), false, std::move(cell)) }; diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index 8756dc9b5d77..ea8f83e6ba8f 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -3461,7 +3461,46 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf135192) auto pS3 = dynamic_cast< vcl::filter::PDFNameElement*>( pObject3->Lookup("S")); - if (pS3 && pS3->GetValue() == "TD") + if (nTR == 0 && pS3 && pS3->GetValue() == "TH") + { + int nOTable(0); + auto pAttrs = dynamic_cast< + vcl::filter::PDFArrayElement*>( + pObject3->Lookup("A")); + CPPUNIT_ASSERT(pAttrs != nullptr); + for (const auto& rAttrRef : + pAttrs->GetElements()) + { + auto pARef = dynamic_cast< + vcl::filter::PDFReferenceElement*>( + rAttrRef); + CPPUNIT_ASSERT(pARef != nullptr); + auto pAttr = pARef->LookupObject(); + CPPUNIT_ASSERT(pAttr != nullptr); + auto pAttrDict = pAttr->GetDictionary(); + CPPUNIT_ASSERT(pAttrDict != nullptr); + auto pOwner = dynamic_cast< + vcl::filter::PDFNameElement*>( + pAttrDict->LookupElement("O")); + CPPUNIT_ASSERT(pOwner != nullptr); + if (pOwner->GetValue() == "Table") + { + auto pScope = dynamic_cast< + vcl::filter::PDFNameElement*>( + pAttrDict->LookupElement( + "Scope")); + CPPUNIT_ASSERT(pScope != nullptr); + CPPUNIT_ASSERT_EQUAL( + OString("Column"), + pScope->GetValue()); + ++nOTable; + } + } + CPPUNIT_ASSERT_EQUAL(int(1), nOTable); + ++nTD; + } + else if (nTR != 0 && pS3 + && pS3->GetValue() == "TD") { ++nTD; }