我正在尝试使用MigraDoc和PDFsharp创建目录,我已经很接近了,但是我目前遇到的问题是目录中的所有链接都将我带到目录的第一页PDF。我正在尝试将它们链接到各自的页面。 PDFSharp书签可以正常工作,但是当尝试基于合并的PDF创建目录时,则无法正常工作。
static void TableOfContents(PdfDocument document)
{
// Puts the Table of contents on the second page
PdfPage page = document.Pages[1];
XGraphics gfx = XGraphics.FromPdfPage(page);
gfx.MUH = PdfFontEncoding.Unicode;
// Create MigraDoc document + Setup styles
Document doc = new Document();
Styles.DefineStyles(doc);
// Add header
Section section = doc.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 document.Outlines)
{
paragraph = section.AddParagraph();
paragraph.Style = "TOC";
paragraph.AddBookmark(bookmark.Title);
Hyperlink hyperlink = paragraph.AddHyperlink(bookmark.Title);
hyperlink.AddText($"{bookmark.Title}\t");
hyperlink.AddPageRefField(bookmark.Title);
}
// Render document
DocumentRenderer docRenderer = new DocumentRenderer(doc);
docRenderer.PrepareDocument();
docRenderer.RenderPage(gfx, 1);
gfx.Dispose();
}
理想情况下,我希望它返回文件名(正在执行)和页码(仅返回第一页)。这是当前输出的内容。
目录
此处的文件名.................................. 1
此处的文件名.................................. 1
此处的文件名.................................. 1
此处的文件名......................... 1
答案 0 :(得分:0)
您调用hyperlink.AddPageRefField
来设置引用,但据我所知,永远不要通过调用MigraDoc的AddBookmark
方法为引用目标创建MigraDoc书签。
MigraDoc书签不同于PDF文件书签。
答案 1 :(得分:0)
据我了解,超链接和书签对于文档应该是唯一的。 否则,将链接到包含书签的第一段。
我只是简单地使用增加的数字来制作简单的报告。
private void DefineTOCLine(int level, string text, Paragraph linkTo)
{
var tocIndex = (tocindex++).ToString(CultureInfo.InvariantCulture);
var paragraph = tocsection.AddParagraph();
paragraph.Style = level == 1 ? "TOC1" : "TOC2";
var hyperlink = paragraph.AddHyperlink(tocIndex);
hyperlink.AddText(text + "\t");
hyperlink.AddPageRefField(tocIndex);
linkTo.AddBookmark(tocIndex);
}