对于大型PDF文件,使用目录可以让文档更容易访问。通常,在PDF文档中目录被放在第一个页面。使用Spire.PDF, 我们可以添加新的空白页到现有的PDF文件中,然后再创建目录。下面我们将通过详细的代码来实现。
C#
//加载PDF示例文档
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("Spire.pdf");
//获取PDF页数
int pageCount = doc.Pages.Count;
//在第一页插入空白页
PdfPageBase tocPage = doc.Pages.Insert(0);
//添加标题,并设置字体、样式和位置
string title = "目录";
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("宋体", 16, FontStyle.Bold),true);
PdfStringFormat centerAlignment = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
PointF location = new PointF(tocPage.Canvas.ClientSize.Width / 2, titleFont.MeasureString(title).Height);
tocPage.Canvas.DrawString(title, titleFont, PdfBrushes.Black, location, centerAlignment);
//设置目录文本内容
PdfTrueTypeFont titlesFont = new PdfTrueTypeFont(new Font("宋体", 10),true);
String[] titles = new String[pageCount];
for (int i = 0; i < titles.Length; i++)
{
titles[i] = string.Format("文件第{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.Black, 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.Black, dotLocation, y);
dotLocation += 2;
}
tocPage.Canvas.DrawString(pageNumText, titlesFont, PdfBrushes.Black, 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;
//保存已添加目录文档
string output = "目录文档.pdf";
doc.SaveToFile(output, FileFormat.PDF);
System.Diagnostics.Process.Start("目录文档.pdf");
}
VB.NET
'加载PDF示例文档
Dim doc As New PdfDocument()
doc.LoadFromFile("Spire.pdf")
'获取PDF页数
Dim pageCount As Integer = doc.Pages.Count
'在第一页插入空白页
Dim tocPage As PdfPageBase = doc.Pages.Insert(0)
'添加标题,并设置字体、样式和位置
Dim title As String = "目录"
Dim titleFont As New PdfTrueTypeFont(New Font("宋体", 16, FontStyle.Bold), True)
Dim centerAlignment As New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
Dim location As New PointF(tocPage.Canvas.ClientSize.Width / 2, titleFont.MeasureString(title).Height)
tocPage.Canvas.DrawString(title, titleFont, PdfBrushes.Black, location, centerAlignment)
'设置目录文本内容
Dim titlesFont As New PdfTrueTypeFont(New Font("宋体", 10), True)
Dim titles As [String]() = New [String](pageCount - 1) {}
For i As Integer = 0 To titles.Length - 1
titles(i) = String.Format("文件第{0}页", i + 1)
Next
Dim y As Single = titleFont.MeasureString(title).Height + 10
Dim x As Single = 0
For i As Integer = 1 To pageCount
Dim text As String = titles(i - 1)
Dim titleSize As SizeF = titlesFont.MeasureString(text)
Dim navigatedPage As PdfPageBase = doc.Pages(i)
Dim pageNumText As String = (i + 1).ToString()
Dim pageNumTextSize As SizeF = titlesFont.MeasureString(pageNumText)
tocPage.Canvas.DrawString(text, titlesFont, PdfBrushes.Black, 0, y)
Dim dotLocation As Single = titleSize.Width + 2 + x
Dim pageNumlocation As Single = tocPage.Canvas.ClientSize.Width - pageNumTextSize.Width
For j As Single = dotLocation To pageNumlocation - 1
If dotLocation >= pageNumlocation Then
Exit For
End If
tocPage.Canvas.DrawString(".", titlesFont, PdfBrushes.Black, dotLocation, y)
dotLocation += 2
Next
tocPage.Canvas.DrawString(pageNumText, titlesFont, PdfBrushes.Black, pageNumlocation, y)
'添加动作
location = New PointF(0, y)
Dim titleBounds As New RectangleF(location, New SizeF(tocPage.Canvas.ClientSize.Width, titleSize.Height))
Dim Dest As New PdfDestination(navigatedPage, New PointF(-doc.PageSettings.Margins.Top, -doc.PageSettings.Margins.Left))
Dim action As New PdfActionAnnotation(titleBounds, New PdfGoToAction(Dest))
action.Border = New PdfAnnotationBorder(0)
TryCast(tocPage, PdfNewPage).Annotations.Add(action)
y += titleSize.Height + 10
'保存已添加目录文档
Dim output As String = "目录文档.pdf"
doc.SaveToFile(output, FileFormat.PDF)
System.Diagnostics.Process.Start("目录文档.pdf")
Next
截图: