【问题标题】:How to tag table header cells as TH instead of TD in iText7?如何在 iText7 中将表格标题单元格标记为 TH 而不是 TD?
【发布时间】:2017-09-01 07:55:16
【问题描述】:

我需要在 iText7 中创建一个 PDF/UA 兼容的文档。最重要的要求是标记所有内容。启用标记后(通过调用PdfDocument.SetTagged() 方法)添加到文档中的大多数元素都会获得正确的标记。

问题在于表格标题单元格的标记。根据 ISO 32000-1:2008,表格标题单元格必须标记为 TH,表格数据单元格必须标记为 TD(14.8.4.2.4.表格元素,表格 337)。

iText 允许使用Table.AddHeaderCell()Table.AddCell() 方法区分标题单元格和常规单元格。此机制为行组正确创建 THhead 和 TBody 标记。不幸的是,单元格本身总是被标记为 TD。

这是生成表格的示例代码:

//var pdfDoc = new PdfDocument(...)

pdfDoc.SetTagged();

var doc = new Document(pdfDoc);

var table = new Table(2);
table.AddHeaderCell("Header 0");
table.AddHeaderCell("Header 1");
table.AddCell("Data 0");
table.AddCell("Data 1");

doc.Add(table);
doc.Close();

这是我们得到的标记结构示例:

<Table>
    <THead>
        <TR>
            <TD>              //must be TH!
                <P>
                    "Header 0"
            <TD>
                <P>
                    "Header 1"
    <TBody>
        <TR>
            <TD>              //TD is correct here
                <P>
                    "Data 0"
            <TD>
                <P>
                    "Data 1"

在使用AddHeaderCell()方法时是否可以让iText生成TH标签?

我正在使用 iText 7.0.0 for .NET(社区版)

【问题讨论】:

  • 只想确认7.0.4版本。 (此时最新)显示相同的行为

标签: itext7


【解决方案1】:

编辑:最初的答案是在 pdfHTML 而不是 iText7 的上下文中错误地给出的。

将 TH 标签标记为 TD 是当前实现的副作用,该实现将 TH 以与 TD 相同的方式处理。

对于 iText7

在将标题单元格添加到表格之前,将它们的角色设置为 TH:

cell.setRole(PdfName.TH);

对于 pdfHTML

虽然可以在转换后和将它们添加到文档之前访问元素,但您需要遍历 iText 元素树以查找和识别表格及其标题单元格。使用 CustomTagWorker 更容易覆盖标签的转换行为。以下代码取自the accessibility example。有关自定义 tagworker 的入门知识,请查看 configuration blog-post

首先创建一个继承自 TdTagWorker 的自定义 tagworker,但会在返回元素结果之前覆盖角色:

public class TableHeaderTagWorker extends TdTagWorker {
    public TableHeaderTagWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
    }

    @Override
    public IPropertyContainer getElementResult() {
        Cell cell =(Cell) super.getElementResult();
        cell.setRole(PdfName.TH);
        return super.getElementResult();
    }
}

创建一个CustomTagWorkerFactory,将此TagWorker 映射到TH-tag

public class AccessibilityTagWorkerFactory extends DefaultTagWorkerFactory {

    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        //This can probably replaced with a regex or string pattern
        if(tag.name().equals("h1")){
            return new HeaderTagWorker(tag, context,1);
        }
        if(tag.name().equals("h2")){
            return new HeaderTagWorker(tag, context,2);
        }
        if(tag.name().equals("h3")){
            return new HeaderTagWorker(tag, context,3);
        }
        if(tag.name().equals("h4")){
            return new HeaderTagWorker(tag, context,4);
        }
        if(tag.name().equals("h5")){
            return new HeaderTagWorker(tag, context,5);
        }
        if(tag.name().equals("h6")){
            return new HeaderTagWorker(tag, context,6);
        }

        if(tag.name().equals("th")){
            return new TableHeaderTagWorker(tag,context);
        }

        return null;
    }
}

并设置 ConvertorProperties 以使用此自定义工厂:

ConverterProperties props = new ConverterProperties();
DefaultTagWorkerFactory tagWorkerFactory = new AccessibilityTagWorkerFactory();
props.setTagWorkerFactory(tagWorkerFactory);
HtmlConverter.convertToPdf(new FileInputStream(src), pdfDoc, props);
pdfDoc.close();

【讨论】:

  • 此外,此行为将在更高版本的 pdfHTML 中修复,因此不再需要此操作
  • 感谢您的详细解答!请注意,我正在尝试使用 Table.AddHeaderCell() 等方法直接构建文档数据,而不是通过将 HTML 文档转换为 PDF。此外,我现在使用的是社区版,它不包括 pdfHTML。您是否暗示要对生成的 PDF 进行正确标记,我必须将数据转换为 HTML,然后将 pdfHTML 应用于它?
  • 您能否评论一下 pdfHTML 与问题的关系?
  • 啊,我的错,我最初在 pdfHTML 的上下文中解决了这个问题,所以我一定有这个想法。在 iText 中执行它实际上更容易,您只需要在 TagWorker 中执行将角色设置为 TH 的 sn-p。我将编辑我的答案。
【解决方案2】:

请注意,这在 iText 7.1 中有所改变。您不能再直接调用 setRole() 函数,您必须通过辅助功能属性。此外,可访问性属性中的 setRole() 函数只接受字符串。所以现在,应该是:

cell.getAccessibilityProperties().setRole(PdfName.TH.toString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多