【PDF操作】C#使用iTextSharp获取PDF文件的书签信息

文章目录


一、新建项目,引用iTextSharp.dll

新建Winform项目,并且下载iTextSharp.dll,并在项目中引用。

二、获取PDF的书签

csharp 复制代码
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;

// 递归函数,用于获取指定书签下的所有子书签并保持结构
List<Dictionary<string, object>> GetAllSubBookmarks(List<Dictionary<string, object>> bookmarks, string parentTitle)
{
    List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();

    foreach (var bookmark in bookmarks)
    {
        string title = (string)bookmark["Title"];

        if (title == parentTitle)
        {
            if (bookmark.ContainsKey("Kids"))
            {
                List<Dictionary<string, object>> kids = (List<Dictionary<string, object>>)bookmark["Kids"];
                foreach (var subBookmark in kids)
                {
                    Dictionary<string, object> subBookmarkWithChildren = new Dictionary<string, object>();
                    subBookmarkWithChildren["Title"] = subBookmark["Title"];
                    subBookmarkWithChildren["Page"] = subBookmark["Page"];
                    subBookmarkWithChildren["Kids"] = GetAllSubBookmarks(kids, (string)subBookmark["Title"]);

                    result.Add(subBookmarkWithChildren);
                }
            }
        }
    }

    return result;
}

// 加载PDF文件
PdfReader reader = new PdfReader("your_pdf_file_path.pdf");

// 获取PDF的目录信息
List<Dictionary<string, object>> bookmarks = SimpleBookmark.GetBookmark(reader);

// 获取第一个书签下的所有子书签并保持结构
string parentTitle = (string)bookmarks[0]["Title"];
List<Dictionary<string, object>> allSubBookmarks = GetAllSubBookmarks(bookmarks, parentTitle);

// 输出所有子书签
foreach (var subBookmark in allSubBookmarks)
{
    Console.WriteLine("Sub-Title: " + subBookmark["Title"] + ", Page: " + subBookmark["Page"]);
    if (subBookmark.ContainsKey("Kids"))
    {
        foreach (var childBookmark in (List<Dictionary<string, object>>)subBookmark["Kids"])
        {
            Console.WriteLine("  Child Title: " + childBookmark["Title"] + ", Page: " + childBookmark["Page"]);
        }
    }
}

// 关闭PDF阅读器
reader.Close();
  1. 定义递归函数 GetAllSubBookmarks :

    • 这个函数通过递归方式获取指定书签下的所有子书签并保持结构。它接受两个参数:书签列表和父书签的标题。
    • 函数首先创建一个空的结果列表 result 用于存储子书签信息。
    • 然后遍历书签列表中的每个书签,如果书签的标题与指定的父标题匹配,则继续处理该书签。
    • 如果该书签包含子书签(即有 "Kids" 键),则递归调用 GetAllSubBookmarks 函数来获取子书签,并将子书签信息添加到当前书签的子书签列表中。
    • 最后,将当前书签及其子书签信息添加到结果列表中,并最终返回结果列表。
  2. 加载PDF文件和获取目录信息:

    • 使用 PdfReader 类加载指定的PDF文件。
    • 使用 SimpleBookmark.GetBookmark(reader) 方法获取PDF文件的目录信息,并将其存储在 bookmarks 列表中。
  3. 获取第一个书签下的所有子书签:

    • 从目录信息中获取第一个书签的标题,然后调用 GetAllSubBookmarks 函数来获取该书签下的所有子书签,并将结果存储在 allSubBookmarks 列表中。
  4. 输出所有子书签:

    • 遍历 allSubBookmarks 列表,输出每个子书签的标题和页码信息。
    • 如果子书签包含子书签(即有 "Kids" 键),则继续遍历并输出每个子书签的标题和页码信息。
  5. 关闭PDF阅读器:

    • 使用 reader.Close() 方法关闭PDF文件阅读器。
相关推荐
衫水4 小时前
在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)
人工智能·windows·语言模型
记得多喝水o6 小时前
PDF密码破除工具
pdf
绿荫阿广10 小时前
互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库控制舵机并多方法播放表情
c#·.net
dntktop11 小时前
Fort Firewall:全方位守护网络安全
运维·windows
engchina11 小时前
在 Windows 11 中设置 WSL2 Ubuntu 的 `networkingMode=mirrored` 详细教程
linux·windows·ubuntu
时光追逐者12 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
microsoft·c#·.net·.netcore·微软技术
KpLn_HJL13 小时前
leetcode - 126. Word Ladder II
leetcode·c#·word
Dr.勿忘14 小时前
C#常考随笔1:const和readonly有什么区别?
开发语言·前端·unity·面试·c#·游戏引擎
zyl91015 小时前
发布 VectorTraits v3.1(支持 .NET 9.0,支持 原生AOT)
c#·.net·simd
m0_7482544717 小时前
如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
windows·node.js