繁体   English   中英

将 MigraDoc 目录添加到 PDFsharp PDF

[英]Add MigraDoc Table of Contents to PDFsharp PDF

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

工作流程基本上如下:

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

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

在 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 书签这就是 TOC 的样子

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

一等奖是仅使用 PDFsharp 添加 TOC。 我将不胜感激任何帮助指出正确的方向。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM