使用C#代码在 PDF 中创建目录

目录在提升文档的可读性和可导航性方面起着至关重要的作用。它为读者提供了文档结构的清晰概览,使他们能够快速定位并访问感兴趣的特定章节或信息。对于较长的文档(例如报告、书籍或学术论文)而言,这一点尤为重要,因为读者可能需要多次返回特定的章节或部分进行查阅。

本文将介绍如何使用 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 目录时,可以按照以下步骤进行:

  1. 初始化 PdfDocument 类的实例。

  2. 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文档。

  3. 通过 PdfDocument.Pages.Count 属性获取文档的页数。

  4. 使用 PdfDocument.Pages.Insert(0) 方法在文档开头插入一个新页面作为目录页。

  5. 使用 PdfPageBase.Canvas.DrawString() 方法在该页面上绘制目录标题、目录内容和页码。

  6. 通过 PdfActionAnnotation 类创建跳转动作,并使用 PdfNewPage.Annotations.Add() 方法将这些动作添加到页面中。

  7. 使用 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 天的试用许可证。

相关推荐
优化控制仿真模型5 小时前
高等数学-同济大学-第八版-教材+习题答案
经验分享·pdf
其实秋天的枫7 小时前
【大英赛】2009-2026年大英赛ABCD类历年真题、样卷、听力音频及答案PDF电子版
经验分享·pdf
DeskUI~~9 小时前
倚天剑术36--为您的PDF添加相框
pdf
优化控制仿真模型11 小时前
2026年初中中考英语大纲词汇表1600个电子版PDF(含单词音频和默写本)
经验分享·pdf
其实秋天的枫11 小时前
【大英赛】全国大学生英语竞赛C类历年真题、样卷、听力音频及答案解析电子版PDF(2012-2026年)
经验分享·pdf
看山还是山,看水还是。11 小时前
消控室五方对讲接听操作流程
经验分享·笔记·搜索引擎·pdf·百度云·印象笔记·有道云笔记
Dontla12 小时前
PDF嵌入介绍(嵌入字体、嵌入图片、嵌入附件)Adobe Acrobat Reader查看是否嵌入
pdf·adobe acrobat reader
开开心心就好12 小时前
禁止指定软件运行的小工具仅1M
人工智能·pdf·音视频·语音识别·big data·媒体·consul
其实秋天的枫13 小时前
护士执业资格考试历年真题及答案解析电子版PDF(2011-2025年)
经验分享·pdf
不知名的老吴13 小时前
高效PDF利器:PDF-XChange 10.1即用版分享
pdf