首页 文章

将MigraDoc目录添加到PDFsharp PDF

提问于
浏览
2

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

Basically the workflow is as follows:

  • 用户上传2个或更多文档以进行连接

  • 用户选择他们想要包含在TOC中的页面

  • 将文档连接在一起并生成目录

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

Code to add bookmark/outline in PDFsharp (successfully adds the bookmarks):

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

MigraDoc code to create the TOC page and render it to the current PDFsharp document:

// 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书签 .

Screenshot of the TOC: TOC页面在开始时添加(尽管最后列出了TOC书签)但我无法链接到PDFsharp书签

我确信问题在于我对MigraDoc和/或PDFsharp的理解 .

一等奖是仅使用PDFsharp添加TOC . 我会感谢你指出正确方向的任何帮助 .

1 回答

  • 0

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

    一种方法:使用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的第二个参数是目标页面 .

相关问题