I'm trying to create accessible pdfs with tables in them using this snippet:
PdfPage page2 = document.Pages.Add();
PdfStructureElement tableStructure = new PdfStructureElement(PdfTagType.Table);
tableStructure.ActualText = "Simple table element";
PdfGrid pdfGrid = new PdfGrid();
pdfGrid.PdfTag = tableStructure;
pdfGrid.Columns.Add(3);
PdfGridRow[] headerRows = pdfGrid.Headers.Add(1);
PdfGridRow headerRow = headerRows[0];
headerRow.Style.Font = pdfFont;
headerRow.Style.TextBrush = new PdfSolidBrush(new PdfColor(89, 89, 93));
headerRow.PdfTag = new PdfStructureElement(PdfTagType.TableRow);
headerRow.Cells[0].Value = "Employee ID";
headerRow.Cells[0].PdfTag = new PdfStructureElement(PdfTagType.TableHeader);
headerRow.Cells[1].Value = "Employee Name";
headerRow.Cells[1].PdfTag = new PdfStructureElement(PdfTagType.TableHeader);
headerRow.Cells[2].Value = "Salary";
headerRow.Cells[2].PdfTag = new PdfStructureElement(PdfTagType.TableHeader);
PdfGridRow row = pdfGrid.Rows.Add();
row.Style.Font = pdfFont;
row.Style.TextBrush = new PdfSolidBrush(new PdfColor(89, 89, 93));
row.PdfTag = new PdfStructureElement(PdfTagType.TableRow);
row.Cells[0].Value = "E01";
row.Cells[0].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell);
row.Cells[1].Value = "Clay";
row.Cells[2].Value = "$1000";
row.Cells[1].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell);
row.Cells[2].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell);
pdfGrid.Draw(page2, new Point(10, 10));
When I validate it using PAC Accessibility Checker I get error: "The table header cell has no associated sub cells". How do I associate those row cells with their header?
Hi Daniel,
Currently we are analyzing on the reported behavior with the provided details on our end and we will share the further details on May 20th,2025.
Regards,
Irfana J.
I found the solution. I needed to set the scope like this
headerRow.Cells[0].PdfTag = new PdfStructureElement(PdfTagType.TableHeader) { Scope = ScopeType.Column };
Hi Daniel,
Yes scope attribute was not added to the table header. To resolve this, the appropriate scope type needs to be specified in the table header. This issue can be addressed using a sample layout.
PdfDocument pdfDocument = new PdfDocument(); pdfDocument.DocumentInformation.Title = "Table"; PdfPage pdfPage = pdfDocument.Pages.Add(); PdfStructureElement element = new PdfStructureElement(PdfTagType.Table); PdfGrid pdfGrid = new PdfGrid(); pdfGrid.PdfTag = element; pdfGrid.Columns.Add(3); pdfGrid.Headers.Add(1); PdfGridRow pdfGridHeader = pdfGrid.Headers[0]; FileStream fontStream = new FileStream(@"D:\Works\Maymonth\May20\arial-unicode-ms-regular.ttf", FileMode.Open, FileAccess.Read); PdfFont font = new PdfTrueTypeFont(fontStream, 14); pdfGridHeader.Style.Font = font; pdfGridHeader.Style.TextBrush = PdfBrushes.Brown; pdfGridHeader.PdfTag = new PdfStructureElement(PdfTagType.TableRow); pdfGridHeader.Cells[0].Value = "Employee ID"; pdfGridHeader.Cells[0].PdfTag = new PdfStructureElement(PdfTagType.TableHeader) { Scope = ScopeType.Column }; pdfGridHeader.Cells[1].Value = "Employee Name"; pdfGridHeader.Cells[1].PdfTag = new PdfStructureElement(PdfTagType.TableHeader) { Scope = ScopeType.Column }; pdfGridHeader.Cells[2].Value = "Salary"; pdfGridHeader.Cells[2].PdfTag = new PdfStructureElement(PdfTagType.TableHeader) { Scope = ScopeType.Column }; PdfGridRow pdfGridRow = pdfGrid.Rows.Add(); pdfGridRow.PdfTag = new PdfStructureElement(PdfTagType.TableRow); pdfGridRow.Cells[0].Value = "E01"; pdfGridRow.Cells[1].Value = "Clay"; pdfGridRow.Cells[2].Value = "$10,000"; pdfGridRow.Cells[0].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell); pdfGridRow.Cells[1].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell); pdfGridRow.Cells[2].PdfTag = new PdfStructureElement(PdfTagType.TableDataCell); pdfGrid.Draw(pdfPage, PointF.Empty); MemoryStream stream = new MemoryStream(); pdfDocument.Save(stream); |
We will also address this on our documentation.
Regards,
Irfana J.