将MigraDoc目录添加到PDFsharp PDF

时间:2016-04-28 07:18:20

标签: c# pdfsharp migradoc

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

基本上工作流程如下:

  1. 用户上传两个或多个要连接的文档
  2. 用户选择他们想要包含在TOC中的页面
  3. 将文档连接在一起并生成目录
  4. 现在,我可以轻松地连接文档并在PDFsharp中添加书签/大纲。我遇到问题的地方是使用MigraDoc创建引用PDFsharp创建的书签/大纲作为超链接目标的TOC。

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

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

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

    // 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添加TOC。我很感激能帮助你找到正确的方向。

1 个答案:

答案 0 :(得分:0)

MigraDoc是一个独立的世界 - 它使用PDFsharp创建PDF文件,但无法访问使用PDFsharp创建的PDF文件内部(如您的情况中的书签)。

一种方法:使用PDFsharp创建TOC(如您所建议的那样)。

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

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

使用第一种方法,您必须自己进行格式化并插入页码,但您可以更好地控制最终的PDF。

哪种“最佳”方法?取决于您的TOC所需的格式化程度。使用第二种方法,TOC可以有两个或更多页面,MigraDoc将自动处理,TOC中的条目可以有两行或更多行,MigraDoc也会自动处理。但我认为需要添加大纲来修改大纲(例如,在页面的某处绘制带有大纲文字的非常小的白色文本)。

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

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

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