C#使用iText获取PDF的trailer数据的代码示例

 更新时间:2025年09月24日 10:06:11   作者:Humbunklung  
开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所以本文将详细介绍C#使用iText获取PDF的trailer数据的方法步骤,需要的朋友可以参考下

引言

开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了。

实际上,使用 iText 获取 PDF 的 trailer 数据是一个稍微底层一些的操作,但完全可以实现。trailer 是 PDF 文件结构的核心部分,它告诉解析器如何找到文件的关键部分,比如交叉引用表 (xref)、文档信息字典 (/Info) 和文档根对象 (/Root)。

在 iText 中,这个操作被很好地封装了。本文将详细说明能从 trailer 中获得什么信息。

iText 核心概念

  • 高级抽象 vs. 底层访问: iText 提供了高级的类,如 PdfDocumentInfoPdfCatalog,来方便地访问 trailer 指向的内容。例如,pdfDocument.GetDocumentInfo() 会自动找到 trailer 中的 /Info 条目并解析它。
  • 直接访问: 同时,iText 也允许你直接获取 trailer 本身,它是一个 PdfDictionary 对象。这对于需要检查非标准字段或进行底层分析的程序员来说非常有用。

C# 代码示例

这个示例将演示如何打开一个 PDF 文件,并同时使用高级方法和底层方法来检查 trailer 相关的数据。

步骤 1: 确保已安装 iText

请在你的项目中通过 NuGet 包管理器安装 itext

Install-Package itext

步骤 2: C# 代码

using System;
using System.IO;
using iText.Kernel.Pdf;

public class PdfTrailerInspector
{
    public static void InspectPdfTrailer(string filePath)
    {
        if (!File.Exists(filePath))
        {
            Console.WriteLine($"错误:文件不存在 '{filePath}'");
            return;
        }

        try
        {
            // 使用 PdfReader 和 PdfDocument 打开 PDF 文件
            using (var pdfReader = new PdfReader(filePath))
            using (var pdfDocument = new PdfDocument(pdfReader))
            {
                Console.WriteLine($"--- 正在分析文件: {Path.GetFileName(filePath)} ---");

                // --- 方法 1: 使用高级 API 访问 Trailer 指向的内容 (推荐的常规做法) ---
                Console.WriteLine("\n=== 通过高级 API 获取 Trailer 指向的信息 ===");
                
                // GetDocumentInfo() 会读取 trailer 的 /Info 字典
                PdfDocumentInfo docInfo = pdfDocument.GetDocumentInfo();
                Console.WriteLine($"信息字典 (来自 /Info): Creator = {docInfo.GetCreator()}, Producer = {docInfo.GetProducer()}");
                
                // GetCatalog() 会读取 trailer 的 /Root 字典,这是文档的入口点
                PdfCatalog catalog = pdfDocument.GetCatalog();
                Console.WriteLine($"文档目录 (来自 /Root): 页面模式 = {catalog.GetPageMode()}, 页面布局 = {catalog.GetPageLayout()}");

                // --- 方法 2: 直接访问和遍历 Trailer 字典本身 (底层操作) ---
                Console.WriteLine("\n=== 直接访问 Trailer 字典的原始键值对 ===");
                
                // 使用 GetTrailer() 直接获取 Trailer 字典对象
                PdfDictionary trailer = pdfDocument.GetTrailer();

                if (trailer != null)
                {
                    // 遍历 Trailer 字典中的所有条目
                    foreach (var key in trailer.KeySet())
                    {
                        PdfObject value = trailer.Get(key); // 值 (可能是数字、引用等)

                        Console.WriteLine($"键: {key}, 值: {value}, 值的类型: {value.GetType().Name}");
                    }

                    // 你也可以直接获取特定的键
                    Console.WriteLine("\n--- 单独获取 Trailer 中的关键值 ---");
                    PdfObject size = trailer.Get(PdfName.Size);
                    PdfObject root = trailer.Get(PdfName.Root);
                    PdfObject info = trailer.Get(PdfName.Info);
                    PdfObject id = trailer.Get(PdfName.ID);

                    Console.WriteLine($"大小 (Size): {size}");
                    Console.WriteLine($"根对象引用 (Root): {root}");
                    Console.WriteLine($"信息字典引用 (Info): {info}");
                    Console.WriteLine($"文件ID (ID): {id}");
                }
                else
                {
                    Console.WriteLine("无法获取 Trailer 字典。");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取 PDF 时发生错误: {ex.Message}");
        }
    }

    public static void Main(string[] args)
    {
        // 请将 "C:\\path\\to\\your\\document.pdf" 替换为你的 PDF 文件路径
        string pdfPath = "C:\\path\\to\\your\\document.pdf"; 
        InspectPdfTrailer(pdfPath);
    }
}

程序运行效果

解读 Trailer 的输出

当你运行上面的代码并查看“直接访问 Trailer 字典”部分的输出时,你会看到类似下面的内容:

键: /Size, 值: 25, 值的类型: PdfNumber
键: /Root, 值: 23 0 R, 值的类型: PdfIndirectReference
键: /Info, 值: 1 0 R, 值的类型: PdfIndirectReference
键: /ID, 值: [<0DDB5968...>, <F3C3B2A6...>], 值的类型: PdfArray

这里是对这些关键条目的解释:

  • /Size: (类型: PdfNumber) 表示 PDF 文件中对象的总数(大约值)。
  • /Root: (类型: PdfIndirectReference) 这是一个间接引用,指向文档的根对象(Catalog 字典)。23 0 R 的意思是“第 23 号对象,第 0 代”。iText 使用这个引用来找到文档的所有页面和其他核心内容。pdfDocument.GetCatalog() 就是帮你完成了这个查找过程。
  • /Info: (类型: PdfIndirectReference) 同样是一个间接引用,指向文档的信息字典(包含作者、标题等元数据)。1 0 R 指向第 1 号对象。pdfDocument.GetDocumentInfo() 会自动解析这个引用。
  • /ID: (类型: PdfArray) 这是一个包含两个字符串的数组,用于唯一标识该 PDF 文件。第一个字符串在文件创建时生成,并且永不改变。第二个字符串在每次保存文件时都会更新。这对于追踪文件的版本非常有用。
  • /Prev (可选): 如果文件是增量更新的,这个键会指向前一个版本的交叉引用表的位置。
  • /Encrypt (可选): 如果文件被加密,这个键会指向加密字典。

总结

  1. 常规需求: 如果我们只是想获取作者、标题、页面内容等信息,使用 iText 的高级 API(GetDocumentInfo(), GetCatalog(), GetPage() 等)就足够了,它们在后台为你处理了 trailer 的解析。
  2. 底层分析: 如果你需要检查 trailer 的所有原始条目,或者查找可能存在的非标准字段,或者想验证 PDF 结构,那么使用 pdfDocument.GetTrailer() 是最直接和强大的方法。

上面的代码提供了两种,我们可以根据具体需求选择使用。

到此这篇关于C#使用iText获取PDF的trailer数据的代码示例的文章就介绍到这了,更多相关C# iText获取PDF的trailer数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# OpenCV实现形状匹配的方法详解

    C# OpenCV实现形状匹配的方法详解

    这篇文章主要为大家详细介绍了如何利用C#+OpenCV实现形状匹配的效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • C#垃圾回收用法(GC)通俗易懂版

    C#垃圾回收用法(GC)通俗易懂版

    这篇文章主要介绍了C#垃圾回收用法(GC),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • C#之lock的使用及说明

    C#之lock的使用及说明

    这篇文章主要介绍了C#之lock的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • C#调用Python脚本的简单示例

    C#调用Python脚本的简单示例

    这篇文章主要为大家详细介绍了C#调用Python脚本的简单示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Unity Shader实现翻书效果

    Unity Shader实现翻书效果

    这篇文章主要为大家详细介绍了Unity Shader实现翻书效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C#后端集成CodeBuddy CLI的完整方案

    C#后端集成CodeBuddy CLI的完整方案

    本文详细介绍了如何在C#后端项目中集成CodeBuddyCLI,实现AI编程助手能力的完整方案,通过分层架构设计和依赖注入,该方案支持多种AIProvider,并提供了流式和非流式两种调用方式,需要的朋友可以参考下
    2026-03-03
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法

    C#使用WebClient登录网站并抓取登录后的网页信息实现方法

    这篇文章主要介绍了C#使用WebClient登录网站并抓取登录后的网页信息实现方法,涉及C#基于会话操作登陆网页及页面读取相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 使用C#和Spire.PDF库实现PDF与OFD格式互转的具体教程

    使用C#和Spire.PDF库实现PDF与OFD格式互转的具体教程

    在日常文档处理工作中,经常需要在不同格式之间进行转换,PDF作为一种通用文档格式已被广泛使用,而OFD则是我国自主制定的开放版式文档标准,本文将介绍如何使用C#和Spire.PDF库实现这两种格式之间的相互转换,需要的朋友可以参考下
    2025-09-09
  • 一篇文章弄懂C#中的async和await

    一篇文章弄懂C#中的async和await

    这篇文章主要给大家介绍了如何通过一篇文章弄懂C#中async和await的相关资料,async和await相信大家应该不陌生,让异步处理变得更友好,本文通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • 深入浅析C#中的var和dynamic

    深入浅析C#中的var和dynamic

    这篇文章给大家介绍了C#中的var和dynamic的相关知识,var和dynamic的本质区别是类型判断的时间不同,前者是编译时,后者是运行时。具体内容详情大家通过本文学习下吧
    2018-05-05

最新评论