目录在提升文档的可读性和可导航性方面起着至关重要的作用。它为读者提供了文档结构的清晰概览,使他们能够快速定位并访问感兴趣的特定章节或信息。对于较长的文档(例如报告、书籍或学术论文)而言,这一点尤为重要,因为读者可能需要多次返回特定的章节或部分进行查阅。
本文将介绍如何使用 Spire.PDF for .NET 在 C# 和 VB.NET 中创建 PDF 文档的目录。
安装 Spire.PDF for .NET
首先,需要将 Spire.PDF for .NET 包中包含的 DLL 文件添加为 .NET 项目的引用。
这些 DLL 文件可以通过以下链接下载,或通过 NuGet 安装。
cs
PM> Install-Package Spire.PDF
在 C# 和 VB.NET 中创建 PDF 目录
目录通常包括目录标题(例如 "Table of Contents")、目录内容、页码,以及可点击跳转到对应页面的交互动作。
使用 Spire.PDF for .NET 创建 PDF 目录时,可以按照以下步骤进行:
-
初始化 PdfDocument 类的实例。
-
使用
PdfDocument.LoadFromFile()方法加载 PDF 文档。 -
通过
PdfDocument.Pages.Count属性获取文档的页数。 -
使用
PdfDocument.Pages.Insert(0)方法在文档开头插入一个新页面作为目录页。 -
使用
PdfPageBase.Canvas.DrawString()方法在该页面上绘制目录标题、目录内容和页码。 -
通过
PdfActionAnnotation类创建跳转动作,并使用PdfNewPage.Annotations.Add()方法将这些动作添加到页面中。 -
使用
PdfDocument.SaveToFile()方法保存生成的结果文档。
示例代码如下:
cs
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.General;
using Spire.Pdf.Graphics;
using System;
using System.Drawing;
namespace TableOfContents
{
internal class Program
{
static void Main(string[] args)
{
//初始化 PdfDocument 类的实例
PdfDocument doc = new PdfDocument();
//加载 PDF 文档
doc.LoadFromFile("Sample.PDF");
//获取文档的页数
int pageCount = doc.Pages.Count;
//在文档开头插入一个新页面作为目录页
PdfPageBase tocPage = doc.Pages.Insert(0);
//在新页面上绘制目录标题
string title = "Table of Contents";
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Arial", 20, FontStyle.Bold));
PdfStringFormat centerAlignment = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
PointF location = new PointF(tocPage.Canvas.ClientSize.Width / 2, titleFont.MeasureString(title).Height + 10);
tocPage.Canvas.DrawString(title, titleFont, PdfBrushes.CornflowerBlue, location, centerAlignment);
//在新页面上绘制目录内容
PdfTrueTypeFont titlesFont = new PdfTrueTypeFont(new Font("Arial", 14));
String[] titles = new String[pageCount];
for (int i = 0; i < titles.Length; i++)
{
titles[i] = string.Format("This is page {0}", i + 1);
}
float y = titleFont.MeasureString(title).Height + 10;
float x = 0;
//在新页面上绘制目标页的页码
for (int i = 1; i <= pageCount; i++)
{
string text = titles[i - 1];
SizeF titleSize = titlesFont.MeasureString(text);
PdfPageBase navigatedPage = doc.Pages[i];
string pageNumText = (i + 1).ToString();
SizeF pageNumTextSize = titlesFont.MeasureString(pageNumText);
tocPage.Canvas.DrawString(text, titlesFont, PdfBrushes.CadetBlue, 0, y);
float dotLocation = titleSize.Width + 2 + x;
float pageNumlocation = tocPage.Canvas.ClientSize.Width - pageNumTextSize.Width;
for (float j = dotLocation; j < pageNumlocation; j++)
{
if (dotLocation >= pageNumlocation)
{
break;
}
tocPage.Canvas.DrawString(".", titlesFont, PdfBrushes.Gray, dotLocation, y);
dotLocation += 3;
}
tocPage.Canvas.DrawString(pageNumText, titlesFont, PdfBrushes.CadetBlue, pageNumlocation, y);
//为目录页中的文本添加可点击的跳转动作
location = new PointF(0, y);
RectangleF titleBounds = new RectangleF(location, new SizeF(tocPage.Canvas.ClientSize.Width, titleSize.Height));
PdfDestination Dest = new PdfDestination(navigatedPage, new PointF(-doc.PageSettings.Margins.Top, -doc.PageSettings.Margins.Left));
PdfActionAnnotation action = new PdfActionAnnotation(titleBounds, new PdfGoToAction(Dest));
action.Border = new PdfAnnotationBorder(0);
(tocPage as PdfNewPage).Annotations.Add(action);
y += titleSize.Height + 10;
}
//保存生成的 PDF 文档
doc.SaveToFile("AddTableOfContents.pdf");
doc.Close();
}
}
}
申请临时许可证
如果您希望去除生成文档中的评估提示信息,或解除功能限制,请申请一份为期 30 天的试用许可证。