关于c#:将MigraDoc目录添加到PDFsharp PDF

Add MigraDoc Table of Contents to PDFsharp PDF

我正在尝试使用PDFsharp和MigraDoc从许多其他文件创建PDF报告文件。

基本上,工作流程如下:

  • 用户上传2个或更多文档以进行连接
  • 用户选择他们想要包含在目录中的页面
  • 将文档串联在一起并生成目录
  • 现在,我可以轻松地串联文档并在PDFsharp中添加书签/轮廓。我遇到的问题是使用MigraDoc创建TOC时,该目录引用了PDFsharp创建的书签/轮廓作为超链接的目标。

    在PDFsharp中添加书签/大纲的代码(成功添加了书签):

    1
    2
    // Current document is a PdfDocument and Title is the name of the bookmark
    CurrentDocument.Outlines.Add(title, page, true, PdfOutlineStyle.Bold);

    MigraDoc代码创建TOC页面并将其呈现到当前的PDFsharp文档中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // Create blank page
                PdfPage page = (!hasTitlePage)
                    ? AddPage(null, 0, TOC_BOOKMARK_TITLE) // Add to start
                    : AddPage(null, 1, TOC_BOOKMARK_TITLE); // Add after title page

                // Get Graphics obj
                XGraphics gfx = XGraphics.FromPdfPage(page);
                gfx.MUH = PdfFontEncoding.Unicode;

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

                // Add header
                Section section = document.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 CurrentDocument.Outlines)
                {
                    paragraph = section.AddParagraph();
                    paragraph.Style ="TOC";
                    Hyperlink hyperlink = paragraph.AddHyperlink(bookmark.Title);
                    hyperlink.AddText($"{bookmark.Title}\\t");
                    hyperlink.AddPageRefField(bookmark.Title);
                }

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

                return page;

    注意-MigraDoc代码添加了TOC页面,但无法识别PDFsharp书签。

    TOC的屏幕截图:
    尽管开始时添加了TOC页面(尽管在末尾列出了TOC书签),但是我无法链接到PDFsharp书签
    This is what the TOC looks like

    我确信问题出在我对MigraDoc和/或PDFsharp的理解上。

    一等奖将是仅使用PDFsharp添加目录。我将为您指出正确的方向提供帮助。


    MigraDoc是一个自己的世界-它使用PDFsharp创建PDF文件,但无法访问使用PDFsharp创建的PDF文件的内部内容(例如您的书签)。

    一种方法:使用PDFsharp创建目录(如您所建议)。

    其他方法:使用MigraDoc将现有PDF文件中的页面添加到MigraDoc文档中以创建最终PDF(您可以像添加图像一样从PDF文件中添加页面)。

    使用第二种方法,您可以将MigraDoc的格式化功能用于目录,并且MigraDoc将插入正确的页码,前提是您为每张图像添加了MigraDoc书签(导入的PDF页面)。

    使用第一种方法,您将必须自己进行格式化并插入页码,但是您将对最终PDF拥有更多控制权。

    哪种是"最佳"方法?取决于您的TOC所需的格式化程度。使用第二种方法,TOC可以具有两个或更多页面,而MigraDoc将自动处理该页面,而TOC中的条目可以具有两个或更多行,而MigraDoc也将自动处理该页面。但是我认为需要添加一些轮廓来进行修改(例如,在页面上的某个位置绘制轮廓很小的白色文本)。

    更新:对于仅使用PDFsharp的方法,您将添加带有以下代码的链接:

    1
    2
    PdfRectangle prect = new PdfRectangle(gfx.Transformer.WorldToDefaultPage(rect));
    page.AddDocumentLink(prect, 1);

    AddDocumentLink的第二个参数是目标页面。