如何使用MigraDoc定义PDF大纲

时间:2015-04-07 01:07:08

标签: c# pdfsharp migradoc

我注意到在使用MigraDoc时,如果我添加一个带有任何标题样式的段落(例如," Heading1"),则会在文档大纲中自动放置一个条目。我的问题是,如何在不显示文档中的文本的情况下在文档大纲中添加条目?以下是我的代码示例:

var document = new Document();
var section = document.AddSection();
// The following line adds an entry to the document outline, but it also
//     adds a line of text to the current section.  How can I add an
//     entry to the document outline without adding any text to the page?
var paragraph = section.AddParagraph("TOC Level 1", "Heading1");

3 个答案:

答案 0 :(得分:1)

我使用了黑客:在白色地面上添加白色文字,字体大小为0.001左右,以获得实际上对用户不可见的轮廓。

要获得完美的解决方案,请混合使用PDFsharp和MigraDoc代码。黑客攻击对我有用,并且更容易实现。

答案 1 :(得分:1)

我在阅读ThomasH的回答后意识到我已经在混合使用PDFSharp和MigraDoc代码了。由于我正在使用PdfDocumentRenderer,因此我能够将自定义大纲添加到该呈现器的PdfDocument属性中。以下是我最终创建自定义大纲的示例:

var document = new Document();
// Populate the MigraDoc document here
...

// Render the document
var renderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always)
{
    Document = document
};
renderer.RenderDocument();

// Create the custom outline
var pdfSharpDoc = renderer.PdfDocument;
var rootEntry = pdfSharpDoc.Outlines.Add(
    "Level 1 Header", pdfSharpDoc.Pages[0]);
rootEntry.Outlines.Add("Level 2 Header", pdfSharpDoc.Pages[1]);

// Etc.

// Save the document
pdfSharpDoc.Save(outputStream);

答案 2 :(得分:1)

我有一种方法可以稍微减少黑客攻击。这是基本方法:

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 });

2)在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)您现在已经获得了Bookmark父母的父母的字典到页码,您可以将这些内容直接添加到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);
}