2017-09-01 80 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與問題的關係? –

相關問題