2016-10-04 7 views
0

У меня есть вопрос о TOC. Как создать TOC С помощью отступов и нумерации?Создание отступов и нумерация в таблице содержания (itextsharp)

Теперь у меня TOC без него (только список). Я создаю его, используя Chunk и Paragraph. Что я должен использовать для создания TOC? Может быть, мне следует использовать List и добавить в документ или нет?

Здесь я создаю TOC:

private int CreateTOC(XmlNode xmlNode, Document doc, PdfWriter writer, int number) 
    { 
     var toc = ev.GetTOC(); 
     KeyValuePair<string, int> value; 

     Chunk dottedLine = new Chunk(new iTextSharp.text.pdf.draw.DottedLineSeparator()); 

     for (int i = 0; i < xmlNode.ChildNodes.Count; i++) 
     { 
      var text = xmlNode.ChildNodes[i].Attributes["text"].Value; 
      value = toc[text]; 
      var dest = value.Key; 
      var page = value.Value; 

      var c = new Chunk((i+1).ToString()+ ". " + text, font); 
      c.SetAction(PdfAction.GotoLocalPage(dest, false)); 

      var p = new Paragraph(c); 
      p.Add(dottedLine); 

      c = new Chunk(page.ToString(), font); 
      c.SetAction(PdfAction.GotoLocalPage(dest, false)); 
      p.Add(c); 
      doc.Add(p); 


      CreateTOC(xmlNode.ChildNodes[i], doc, writer, i+1); 
     } 
     return writer.PageNumber; 
    } 

И я получаю список со ссылками на главы в содержании. Но мне нужно следующее:

1. chapter1-------------------1page 
    1.1 subchupter1-------------2page 
    1.2 subchupter2-------------2page 
    1.3 subchupter3-------------3page 
2. chupter2-------------------4page 
    2.1 subchupter4-------------4page 
    2.3 subchupter4-------------4page 
    2.3.1 subsubchupter------5page 
    ... 
    ... 
    ... 

Как я могу это исправить?

Спасибо!

+0

Почему вы не используете 'setIndentationLeft()' в абзаце для создания отступа? (Или свойство 'IndentationLeft', если вы используете iTextSharp, см. Http://stackoverflow.com/questions/29599797) –

ответ

2

Ввести уровень и умножить этот уровень на значение отступа. Используйте это значение в качестве значения для IndentationLeft:

private int CreateTOC(XmlNode xmlNode, Document doc, PdfWriter writer, int number, int level) { 
    var toc = ev.GetTOC(); 
    KeyValuePair<string, int> value; 

    Chunk dottedLine = new Chunk(new iTextSharp.text.pdf.draw.DottedLineSeparator()); 

    for (int i = 0; i < xmlNode.ChildNodes.Count; i++) 
    { 
     var text = xmlNode.ChildNodes[i].Attributes["text"].Value; 
     value = toc[text]; 
     var dest = value.Key; 
     var page = value.Value; 

     var c = new Chunk((i+1).ToString()+ ". " + text, font); 
     c.SetAction(PdfAction.GotoLocalPage(dest, false)); 

     var p = new Paragraph(c); 
     p.IndentationLeft = 10 * level; 
     p.Add(dottedLine); 

     c = new Chunk(page.ToString(), font); 
     c.SetAction(PdfAction.GotoLocalPage(dest, false)); 
     p.Add(c); 
     doc.Add(p); 


     CreateTOC(xmlNode.ChildNodes[i], doc, writer, i+1, level + 1); 
    } 
    return writer.PageNumber; 
} 

Использование 0 для level при первом вызове CreateToc().

+0

Wow. Здорово! > Почему бы тебе не использовать ... Я не нашел. Спасибо! – Naomiss

 Смежные вопросы

  • Нет связанных вопросов^_^