我正在尝试使用PDFsharp和MigraDoc从许多其他文件创建PDF报告文件。
基本上工作流程如下:
现在,我可以轻松地连接文档并在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书签
我确信问题在于我对MigraDoc和/或PDFsharp的理解。
一等奖是仅使用PDFsharp添加TOC。我很感激能帮助你找到正确的方向。
答案 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的第二个参数是目标页面。