2017-09-01 40 views
0

我需要在iText7中创建符合PDF/UA的文档。最重要的要求是标记所有内容。启用标记时(通过调用PdfDocument.SetTagged()方法)添加到文档的大多数元素都可以获得正确的标签。如何在iText7中将表格标题单元标记为TH而不是TD?

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

iText允许通过使用Table.AddHeaderCell()Table.AddCell()方法来区分标题单元格和常规单元格。此机制可正确地为行组创建THead和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" 

是否有可能具有iText生成TH代码时AddHeaderCell()方法用来?

我利用iText 7.0.0用于.NET(社区版)

+0

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

回答

4

编辑:最初的回答在mistakingly在pdfHTML的情况下给出的,而不是iText7正确。

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

对于iText7

设置页眉细胞将它们添加到表中之前TH的作用:

cell.setRole(PdfName.TH); 

对于pdfHTML

虽然可以访问元素在转换之后,在将它们添加到文档之前,您需要遍历iText元素的树来查找和标识表格及其标题单元格。使用CustomTagWorker覆盖标签的转换行为更容易。以下代码取自the accessibility example。有关定制tagworkers的入门知识,请查看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映射此TagWorkerTH -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(); 
+0

此外,此行为将在以后的pdfHTML版本中修复,因此不再需要 –

+0

谢谢您的详细解答!请注意,我试图直接使用像Table.AddHeaderCell()等方法来构建文档数据,而不是将HTML文档转换为PDF。此外,我现在正在使用社区版,其中不包括pdfHTML。你是否暗示为生成的PDF做适当的标记?我必须将我的数据转换为HTML,然后将pdfHTML应用于它? –

+0

您能否请您评论pdfHTML与问题的关系? –

相关问题