C#使用iText獲取PDF的trailer數(shù)據(jù)的代碼示例
引言
開發(fā)程序debug的時候,看到了PDF有個trailer數(shù)據(jù),挺有意思,于是考慮用代碼把它讀出來,那么就用到我們常用的iText框架了。
實際上,使用 iText 獲取 PDF 的 trailer 數(shù)據(jù)是一個稍微底層一些的操作,但完全可以實現(xiàn)。trailer 是 PDF 文件結(jié)構(gòu)的核心部分,它告訴解析器如何找到文件的關(guān)鍵部分,比如交叉引用表 (xref)、文檔信息字典 (/Info) 和文檔根對象 (/Root)。
在 iText 中,這個操作被很好地封裝了。本文將詳細說明能從 trailer 中獲得什么信息。
iText 核心概念
- 高級抽象 vs. 底層訪問: iText 提供了高級的類,如
PdfDocumentInfo和PdfCatalog,來方便地訪問trailer指向的內(nèi)容。例如,pdfDocument.GetDocumentInfo()會自動找到trailer中的/Info條目并解析它。 - 直接訪問: 同時,iText 也允許你直接獲取
trailer本身,它是一個PdfDictionary對象。這對于需要檢查非標準字段或進行底層分析的程序員來說非常有用。
C# 代碼示例
這個示例將演示如何打開一個 PDF 文件,并同時使用高級方法和底層方法來檢查 trailer 相關(guān)的數(shù)據(jù)。
步驟 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 指向的內(nèi)容 (推薦的常規(guī)做法) ---
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); // 值 (可能是數(shù)字、引用等)
Console.WriteLine($"鍵: {key}, 值: {value}, 值的類型: {value.GetType().Name}");
}
// 你也可以直接獲取特定的鍵
Console.WriteLine("\n--- 單獨獲取 Trailer 中的關(guān)鍵值 ---");
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 時發(fā)生錯誤: {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 的輸出
當(dāng)你運行上面的代碼并查看“直接訪問 Trailer 字典”部分的輸出時,你會看到類似下面的內(nèi)容:
鍵: /Size, 值: 25, 值的類型: PdfNumber 鍵: /Root, 值: 23 0 R, 值的類型: PdfIndirectReference 鍵: /Info, 值: 1 0 R, 值的類型: PdfIndirectReference 鍵: /ID, 值: [<0DDB5968...>, <F3C3B2A6...>], 值的類型: PdfArray
這里是對這些關(guān)鍵條目的解釋:
/Size: (類型:PdfNumber) 表示 PDF 文件中對象的總數(shù)(大約值)。/Root: (類型:PdfIndirectReference) 這是一個間接引用,指向文檔的根對象(Catalog字典)。23 0 R的意思是“第 23 號對象,第 0 代”。iText 使用這個引用來找到文檔的所有頁面和其他核心內(nèi)容。pdfDocument.GetCatalog()就是幫你完成了這個查找過程。/Info: (類型:PdfIndirectReference) 同樣是一個間接引用,指向文檔的信息字典(包含作者、標題等元數(shù)據(jù))。1 0 R指向第 1 號對象。pdfDocument.GetDocumentInfo()會自動解析這個引用。/ID: (類型:PdfArray) 這是一個包含兩個字符串的數(shù)組,用于唯一標識該 PDF 文件。第一個字符串在文件創(chuàng)建時生成,并且永不改變。第二個字符串在每次保存文件時都會更新。這對于追蹤文件的版本非常有用。/Prev(可選): 如果文件是增量更新的,這個鍵會指向前一個版本的交叉引用表的位置。/Encrypt(可選): 如果文件被加密,這個鍵會指向加密字典。
總結(jié)
- 常規(guī)需求: 如果我們只是想獲取作者、標題、頁面內(nèi)容等信息,使用 iText 的高級 API(
GetDocumentInfo(),GetCatalog(),GetPage()等)就足夠了,它們在后臺為你處理了trailer的解析。 - 底層分析: 如果你需要檢查
trailer的所有原始條目,或者查找可能存在的非標準字段,或者想驗證 PDF 結(jié)構(gòu),那么使用pdfDocument.GetTrailer()是最直接和強大的方法。
上面的代碼提供了兩種,我們可以根據(jù)具體需求選擇使用。
到此這篇關(guān)于C#使用iText獲取PDF的trailer數(shù)據(jù)的代碼示例的文章就介紹到這了,更多相關(guān)C# iText獲取PDF的trailer數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實現(xiàn)方法
這篇文章主要介紹了C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實現(xiàn)方法,涉及C#基于會話操作登陸網(wǎng)頁及頁面讀取相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
使用C#和Spire.PDF庫實現(xiàn)PDF與OFD格式互轉(zhuǎn)的具體教程
在日常文檔處理工作中,經(jīng)常需要在不同格式之間進行轉(zhuǎn)換,PDF作為一種通用文檔格式已被廣泛使用,而OFD則是我國自主制定的開放版式文檔標準,本文將介紹如何使用C#和Spire.PDF庫實現(xiàn)這兩種格式之間的相互轉(zhuǎn)換,需要的朋友可以參考下2025-09-09

