如何使用PDFsharp + MigraDoc将书签动态链接到目录

时间:2019-05-20 16:23:13

标签: c# pdfsharp migradoc tableofcontents

我正在尝试使用MigraDoc和PDFsharp创建目录,我已经很接近了,但是我目前遇到的问题是目录中的所有链接都将我带到目录的第一页PDF。我正在尝试将它们链接到各自的页面。 PDFSharp书签可以正常工作,但是当尝试基于合并的PDF创建目录时,则无法正常工作。

static void TableOfContents(PdfDocument document)
{
    // Puts the Table of contents on the second page
    PdfPage page = document.Pages[1];
    XGraphics gfx = XGraphics.FromPdfPage(page);
    gfx.MUH = PdfFontEncoding.Unicode;

    // Create MigraDoc document + Setup styles
    Document doc = new Document();
    Styles.DefineStyles(doc);

    // Add header
    Section section = doc.AddSection();
    Paragraph paragraph = section.AddParagraph("Table of Contents");
    paragraph.Format.Font.Size = 14;
    paragraph.Format.Font.Bold = true;
    paragraph.Format.SpaceAfter = 24;
    paragraph.Format.OutlineLevel = OutlineLevel.Level1;


    // Add links - these are the PdfSharp outlines/bookmarks
    // added previously when concatinating the pages
    foreach (var bookmark in document.Outlines)
    {
        paragraph = section.AddParagraph();
        paragraph.Style = "TOC";
        paragraph.AddBookmark(bookmark.Title);
        Hyperlink hyperlink = paragraph.AddHyperlink(bookmark.Title);
        hyperlink.AddText($"{bookmark.Title}\t");
        hyperlink.AddPageRefField(bookmark.Title);
    }

    // Render document
    DocumentRenderer docRenderer = new DocumentRenderer(doc);
    docRenderer.PrepareDocument();
    docRenderer.RenderPage(gfx, 1);
    gfx.Dispose();
}

理想情况下,我希望它返回文件名(正在执行)和页码(仅返回第一页)。这是当前输出的内容。

目录
此处的文件名.................................. 1
此处的文件名.................................. 1
此处的文件名.................................. 1
此处的文件名......................... 1

2 个答案:

答案 0 :(得分:0)

您调用hyperlink.AddPageRefField来设置引用,但据我所知,永远不要通过调用MigraDoc的AddBookmark方法为引用目标创建MigraDoc书签。

MigraDoc书签不同于PDF文件书签。

答案 1 :(得分:0)

据我了解,超链接和书签对于文档应该是唯一的。 否则,将链接到包含书签的第一段。

我只是简单地使用增加的数字来制作简单的报告。

 private void DefineTOCLine(int level, string text, Paragraph linkTo)
 {
     var tocIndex = (tocindex++).ToString(CultureInfo.InvariantCulture);

     var paragraph = tocsection.AddParagraph();
     paragraph.Style = level == 1 ? "TOC1" : "TOC2";
     var hyperlink = paragraph.AddHyperlink(tocIndex);
     hyperlink.AddText(text + "\t");
     hyperlink.AddPageRefField(tocIndex);

     linkTo.AddBookmark(tocIndex);
 }