我有一种比较不那么"hack"的方法。以下是基本步骤:
1)添加一个书签,将该书签字段对象和大纲条目的名称保存到列表中。不设置段落.OutlineLevel(或将其设置为bodytext)。
// Defined previously
List<dynamic> Bookmarks = new List<dynamic>();
// In your bookmarking method, P is a Paragraph already created somewhere
Bookmarks.Add(new { Bookmark = P.AddBookmark("C1"), Name = "Chapter 1", Depth = 0 });
在渲染Migradoc布局之前,准备页面。
pdfwriter.PrepareRenderPages();
3) 建立书签的父级父级(这将是一个段落)和页面的字典(页面将被初始化为-1)
var Pages = Bookmarks.Select(x=> ((BookmarkField)x).Bookmark.Parent.Parent).ToDictionary(x=>x, x=>-1);
4) 现在通过迭代每个页面上的对象,找到匹配项来填写这些页面。
for (int i = 0; i < pdfwriter.PageCount; i++)
foreach (var s in pdfwriter.DocumentRenderer.GetDocumentObjectsFromPage(i).Where(x=> Pages.ContainsKey(x))
Pages[s] = i-1;
5) 现在您已经获得了一个书签父母的父母到页码的字典,通过这个字典,您可以直接将大纲添加到PDFSharp文档中。这也会迭代深度树,因此您可以拥有嵌套的大纲。
foreach(dynamic d in Bookmarks)
{
var o = pdfwriter.PdfDocument.Outlines;
for(int i=0;i<d.Depth;i++)
o = o.Last().Outlines;
BookmarkField BK = d.Bookmark;
int PageNumber = Pages[BK.Parent.Parent];
o.Add(d.Name, pdfwriter.PdfDocument.Pages[PageNumber], true, PdfOutlineStyle.Regular);
}