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

基本上,工作流程如下:


用户上传2个或更多文档以进行连接
用户选择要包含在目录中的页面
将文档串联在一起并生成目录


现在,我可以轻松地串联文档并在PDFsharp中添加书签/轮廓。我遇到问题的地方是使用MigraDoc创建目录时,该目录引用了PDFsharp创建的书签/大纲作为超链接的目标。

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

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


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

// 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代码添加了“目录”页面,但无法识别PDFsharp书签。

TOC的屏幕截图:
尽管开始时添加了TOC页面(尽管在末尾列出了TOC书签),但是我无法链接到PDFsharp书签
c# - 将MigraDoc目录添加到PDFsharp PDF-LMLPHP

我确信问题出在我对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的方法,您将添加带有以下代码的链接:

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


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

关于c# - 将MigraDoc目录添加到PDFsharp PDF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36907871/

10-11 01:27