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

 更新时间:2024年04月09日 09:56:59   作者:JosieBook  
C# iTextSharp是一个用于处理PDF文件的源库,它提供了一系列的功能,包括创建PDF文件,以及提取和操作PDF文件中的内容,本文给大家介绍了C#使用iTextSharp获取PDF文件书签信息的操作方法,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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

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

二、获取PDF的书签

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文件阅读器。

三、拓展:

C#使用iTextSharp合并多个PDF

多个PDF的页大小要一致

/// <summary>
/// 合并多个pdf
/// </summary>
/// <param name="fileList">pdf文件路径集合</param>
/// <param name="outPath">最终pdf的输出目录</param>
/// <param name="width">pdf页宽,mm</param>
/// <param name="height">pdf页高,mm</param>
public static void 合并PDF(List<string> fileList, string outPath, float width, float height) {
    width = (float)(width * 2.83462677);//PDF的mm与实际mm有所区别
    height = (float)(height * 2.83462677);
    iTextSharp.text.pdf.PdfReader reader;
    iTextSharp.text.Document document = new iTextSharp.text.Document(new iTextSharp.text.Rectangle(0, 0, width, height), 0, 0, 0, 0);
    using (FileStream fs = new FileStream(outPath, FileMode.Create)) {
        using (iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, fs)) {
            document.Open();
            iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
            iTextSharp.text.pdf.PdfImportedPage newPage;
            for (int i = 0; i < fileList.Count; i++) {
                using (reader = new iTextSharp.text.pdf.PdfReader(fileList[i])) {
                    int iPageNum = reader.NumberOfPages;
                    for (int j = 1; j <= iPageNum; j++) {
                        document.NewPage();
                        newPage = writer.GetImportedPage(reader, j);
                        cb.AddTemplate(newPage, 0, 0);
                    }
                }
            }
            document.Dispose();
        }
    }
}

C#使用itextsharp新建PDF文件

一、下载并引用itextsharp

itextsharp.dll在C#项目中引用。

二、新建PDF文件代码

在当前路径下新建output.pdf文件并写入一些内容

using iTextSharp.text;  
using iTextSharp.text.pdf;  
  
// 创建一个Document对象  
Document doc = new Document();  
  
// 创建PdfWriter对象,将文档内容写入输出流中  
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create));  
  
// 打开文档进行写入操作  
doc.Open();  
  
// 设置字体和字号  
BaseFont bfChinese = BaseFont.CreateFont(BaseFont.COURIER, BaseFont.WINANSI, BaseFont.EMBEDDED);  
Font bfChineseFont = new Font(bfChinese, 14);  
  
// 创建要添加的段落文本  
string rowInfo = "这是一个测试段落";  
Paragraph paragInfo = new Paragraph(rowInfo, bfChineseFont);  

doc.Add(paragInfo ); // 将写入信息加入到文档中
  
// 获取段落所占的宽度  
// float columnWidth = ColumnText.GetColumnWidth(doc.PageSize.Width, doc.Top, doc.Bottom, paragInfo, Element.ALIGN_LEFT);  
// 计算左右页边距之间的距离  
// float marginDistance = columnWidth / 2; // 假设左右页边距相等,所以取宽度的一半作为距离  
// Console.WriteLine("左右页边距之间的距离: " + marginDistance + "像素");  
  
// 关闭文档流和释放资源  
doc.Close();

以上就是C#使用iTextSharp获取PDF文件书签信息的操作方法的详细内容,更多关于C# iTextSharp获取PDF书签信息的资料请关注程序员之家其它相关文章!

相关文章

  • C# 装箱和拆箱的知识回顾

    C# 装箱和拆箱的知识回顾

    本篇文章主要介绍了C#的装箱和拆箱的知识点回顾,对大家的学习和复习具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • C# 线性插值的实现示例

    C# 线性插值的实现示例

    线性插值是针对一维数据的插值方法,本文主要介绍了C# 线性插值的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • C#实现洗牌游戏实例

    C#实现洗牌游戏实例

    这篇文章主要介绍了C#实现洗牌游戏实例,对于数据结构与算法的学习有不错的借鉴参考作用,需要的朋友可以参考下
    2014-08-08
  • C#书写规范

    C#书写规范

    C#书写规范...
    2007-03-03
  • C#调用非托管动态库中的函数方法

    C#调用非托管动态库中的函数方法

    这篇文章主要介绍了C#调用非托管动态库中的函数方法,本文讲解创建一个非托管动态库,然后在C#中调用它,需要的朋友可以参考下
    2015-02-02
  • C#中的预处理器指令详解

    C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等预处理器指令,需要的朋友可以参考下
    2015-01-01
  • C# 爬虫简单教程

    C# 爬虫简单教程

    这篇文章主要介绍了C# 爬虫的简单教程,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#简单访问SQLite数据库的方法(安装,连接,查询等)

    C#简单访问SQLite数据库的方法(安装,连接,查询等)

    这篇文章主要介绍了C#简单访问SQLite数据库的方法,涉及SQLite数据库的下载、安装及使用C#连接、查询SQLIte数据库的相关技巧,需要的朋友可以参考下
    2016-07-07
  • 详解C#读写Excel的几种方法

    详解C#读写Excel的几种方法

    这篇文章主要介绍了详解C#读写Excel的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 理解C#中的枚举(简明易懂)

    理解C#中的枚举(简明易懂)

    这篇文章主要介绍了理解C#中的枚举(简明易懂),本文讲解了枚举的优点、枚举说明、枚举的类型、枚举的使用建议等内容,需要的朋友可以参考下
    2015-05-05

最新评论

?


http://www.vxiaotou.com