使用C#代码在PDF中创建目录的方法示例

 更新时间:2025年11月12日 10:25:08   作者:2501_93070778  
目录在提升文档的可读性和可导航性方面起着至关重要的作用,它为读者提供了文档结构的清晰概览,使他们能够快速定位并访问感兴趣的特定章节或信息,本文将介绍如何使用 Spire.PDF for .NET 在 C# 和 VB.NET 中创建 PDF 文档的目录,需要的朋友可以参考下

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

本文将介绍如何使用 Spire.PDF for .NET 在 C# 和 VB.NET 中创建 PDF 文档的目录。

安装 Spire.PDF for .NET

首先,需要将 Spire.PDF for .NET 包中包含的 DLL 文件添加为 .NET 项目的引用。
这些 DLL 文件可以通过以下链接下载,或通过 NuGet 安装。

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() 方法保存生成的结果文档。

示例代码如下:

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();
        }
    }
}

到此这篇关于使用C#代码在PDF中创建目录的方法示例的文章就介绍到这了,更多相关C# PDF创建目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中StringBuilder类的使用总结

    C#中StringBuilder类的使用总结

    本篇文章主要是对C#中StringBuilder类的使用方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 提高C# StringBuilder操作性能优化的方法

    提高C# StringBuilder操作性能优化的方法

    本篇文章主要介绍使用C# StringBuilder 的项目实践,用于减少内存分配,提高字符串操作的性能。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C#过滤sql特殊字符串的方法

    C#过滤sql特殊字符串的方法

    这篇文章介绍了C#过滤sql特殊字符串的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Visual C#类的定义及实现方法实例解析

    Visual C#类的定义及实现方法实例解析

    这篇文章主要介绍了Visual C#类的定义及实现方法实例解析,对于新手来说有不错的借鉴学习价值,需要的朋友可以参考下
    2014-07-07
  • ItemsControl 数据绑定的两种方式

    ItemsControl 数据绑定的两种方式

    这篇文章主要介绍了ItemsControl 数据绑定的两种方式,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • Unity游戏开发之2048游戏的实现

    Unity游戏开发之2048游戏的实现

    2048是一款数字益智游戏,初始数字则是由2+2组成的基数4。在操作方面的不同则表现为一步一格的移动,变成更为爽快的一次到底。相同数字的方况在靠拢、相撞时会相加。本文将通过Unity3D实现这一游戏,需要的可以参考一下
    2022-03-03
  • c#线程同步使用详解示例

    c#线程同步使用详解示例

    这篇文章主要介绍了c#线程同步使用方法,介绍几种常用的C#进行线程同步的方式,需要的朋友可以参考下
    2014-02-02
  • C# 并发控制框架之单线程环境下实现每秒百万级调度

    C# 并发控制框架之单线程环境下实现每秒百万级调度

    本文介绍了一款专为工业自动化及机器视觉开发的C#并发流程控制框架,通过模仿Go语言并发模式设计,支持高频调度及复杂任务处理,已在多个项目中验证其稳定性和可靠性
    2024-10-10
  • 基于WPF实现步骤控件的示例代码

    基于WPF实现步骤控件的示例代码

    这篇文章主要为大家详细介绍了WPF实现简单的步骤控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-01-01
  • 在c#中使用servicestackredis操作redis的实例代码

    在c#中使用servicestackredis操作redis的实例代码

    本篇文章主要介绍了在c#中使用servicestackredis操作redis的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论