Как динамически связать закладки с оглавлением, используя PDFsharp + MigraDoc - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь создать оглавление, используя 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 голосов
/ 22 мая 2019

Насколько я понимаю, гиперссылка и закладка должны быть уникальными для документа. В противном случае будет сделана ссылка на первый абзац, содержащий закладку.

Я просто использую число, которое я увеличиваю, для простого отчета, который я делаю.

 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);
 }
0 голосов
/ 22 мая 2019

Вы вызываете hyperlink.AddPageRefField, чтобы установить ссылку, но, насколько я могу судить, вы никогда не создадите закладку MigraDoc для цели ссылки, вызвав метод AddBookmark MigraDoc.

Закладки MigraDoc отличаются от закладок файла PDF.

...