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;
                                                     }

Reply via email to