純C#實(shí)現(xiàn)智能PDF目錄提取工具PdfTocExtractor
前言
最近在做標(biāo)書(shū)的時(shí)候發(fā)現(xiàn),有些文檔文字量很大,想讓大模型完全解讀不太現(xiàn)實(shí),先不說(shuō) context 長(zhǎng)度夠不夠,首先 token 消耗量就爆炸了
于是想到使用取巧的方式,提取 PDF 的目錄來(lái)進(jìn)行分析,于是說(shuō)干就干,用 C# 寫了一個(gè)工具來(lái)實(shí)現(xiàn)目錄提取,結(jié)果效果還不錯(cuò)
后續(xù)我又繼續(xù)完善這個(gè)工具,增加了語(yǔ)義識(shí)別等功能
繼續(xù)沿用 C# + AOT + GitHub Actions + dotnet tool + nuget 這套流程的開(kāi)發(fā)
項(xiàng)目地址: https://github.com/star-plan/pdf-toc-extractor
為什么是目錄提取
PDF 轉(zhuǎn) word、markdown 等格式的工具太多了
咱不卷這個(gè)賽道
(說(shuō)是這么說(shuō),我最近也做了一個(gè),不排除后續(xù)把 PDF 轉(zhuǎn)文檔的功能集成到這個(gè)項(xiàng)目里)
咱就專注于這個(gè)小眾的需求,把 PDF 目錄提取這個(gè)功能做好
后續(xù)又增加了語(yǔ)義識(shí)別功能,有些 PDF 并沒(méi)有內(nèi)嵌目錄,這時(shí)候就需要從 PDF 的內(nèi)容中分析提取出目錄。
我一開(kāi)始使用了模式匹配,結(jié)果效果很差,后面換成 NLP 的思路,雖然只是用了最簡(jiǎn)單的語(yǔ)義識(shí)別,但效果的提升非??捎^!
可見(jiàn)選對(duì)工具還是很重要的
PdfTocExtractor
PdfTocExtractor 是一個(gè)純 C# AOT 實(shí)現(xiàn)的輕量級(jí)PDF目錄提取工具,用于從PDF文件中提取目錄(TOC)并導(dǎo)出為多種格式。支持Markdown、JSON、XML、純文本等格式,完全擺脫命令行依賴,無(wú)需額外的PDF處理工具,適合在 .NET 項(xiàng)目中內(nèi)嵌、分發(fā)或集成自動(dòng)化流程中使用。
通過(guò)PdfTocExtractor,您可以輕松從PDF文檔中提取書(shū)簽和目錄結(jié)構(gòu),生成清晰的導(dǎo)航文檔。v2.0新增的語(yǔ)義分析功能讓您即使在PDF沒(méi)有嵌入書(shū)簽的情況下,也能通過(guò)基于NLP的智能分析自動(dòng)識(shí)別章節(jié)標(biāo)題,完美適用于文檔處理、內(nèi)容分析和自動(dòng)化工作流。
跨平臺(tái)、零依賴、極速提取,一切盡在 PdfTocExtractor!
功能特點(diǎn)
- 從PDF文件提取書(shū)簽/目錄信息
- 語(yǔ)義分析功能:基于NLP的智能章節(jié)標(biāo)題識(shí)別,適用于無(wú)書(shū)簽PDF
- 支持多種輸出格式:Markdown、JSON、XML、純文本
- 可配置的導(dǎo)出選項(xiàng)(層級(jí)深度、頁(yè)碼格式等)
- 可擴(kuò)展的導(dǎo)出器架構(gòu),支持自定義格式
- 異步操作支持,高性能處理
- 提供命令行工具和NuGet包
- 支持AOT編譯,原生性能無(wú)需.NET運(yùn)行時(shí)
- 跨平臺(tái)支持:Windows、Linux、macOS
- 多種分析模式:默認(rèn)、嚴(yán)格、寬松模式可選
支持的輸出格式
- Markdown (
md,markdown) - 適合文檔和網(wǎng)頁(yè)顯示,支持層級(jí)結(jié)構(gòu) - JSON (
json) - 適合程序處理和API集成,包含完整元數(shù)據(jù) - XML (
xml) - 結(jié)構(gòu)化數(shù)據(jù)交換,標(biāo)準(zhǔn)化格式 - Text (
txt,text) - 純文本格式,簡(jiǎn)潔易讀
使用方法
依然和其他工具一樣
提供了 nuget 庫(kù)和 dotnet tool 命令行工具
可以作為庫(kù)引入使用,也可以在命令行使用
命令行
安裝 CLI 工具
dotnet tool install --global PdfTocExtractor.Cli
命令行使用
# ?? 智能提?。ㄍ扑])- 自動(dòng)選擇最佳方法
pdftoc smart document.pdf -o output.md
# ?? 提取PDF書(shū)簽(傳統(tǒng)方法)
pdftoc extract document.pdf -o output.md
# ?? 語(yǔ)義分析(v2.0新功能 - 適用于無(wú)書(shū)簽的PDF)
pdftoc semantic document.pdf -o output.md
# 指定輸出格式
pdftoc smart document.pdf -o output.json -f json
# 設(shè)置最大層級(jí)深度
pdftoc smart document.pdf -o output.xml --max-depth 3
# 自定義標(biāo)題和頁(yè)碼格式
pdftoc smart document.pdf -o output.txt --title "我的文檔目錄" --page-format "第 {0} 頁(yè)"
# 語(yǔ)義分析 - 嚴(yán)格模式(更精確的標(biāo)題識(shí)別)
pdftoc semantic document.pdf -o output.md --mode strict --confidence 0.7
# 語(yǔ)義分析 - 調(diào)試模式(查看分析過(guò)程)
pdftoc semantic document.pdf -o output.md --debug --verbose
# 結(jié)構(gòu)分析 - 寬松模式(識(shí)別更多潛在標(biāo)題)
pdftoc analyze document.pdf -o output.md --relaxed
# 結(jié)構(gòu)分析 - 自定義參數(shù)
pdftoc analyze document.pdf -o output.md --min-font-size 14 --use-bold --debug
# 智能提取 - 帶結(jié)構(gòu)分析配置
pdftoc smart document.pdf -o output.md --analysis-preset strict --debug-analysis
# 顯示詳細(xì)輸出
pdftoc smart document.pdf -o output.md --verbose
# 診斷PDF文件問(wèn)題
pdftoc diagnose document.pdf
作為庫(kù)使用
安裝核心庫(kù)
dotnet add package PdfTocExtractor
代碼示例
using PdfTocExtractor;
using PdfTocExtractor.Exporters;
using PdfTocExtractor.Models;
// 創(chuàng)建提取器實(shí)例
var extractor = new PdfTocExtractor();
// ?? 智能提?。ㄍ扑])- 自動(dòng)選擇最佳方法
var tocItems = await extractor.ExtractTocSmartAsync("document.pdf");
// ?? 傳統(tǒng)方法:提取PDF書(shū)簽
var bookmarkItems = await extractor.ExtractTocAsync("document.pdf");
// ?? 結(jié)構(gòu)分析:適用于無(wú)書(shū)簽的PDF
var structureItems = await extractor.AnalyzeStructureAsync("document.pdf");
// ?? 結(jié)構(gòu)分析:使用自定義配置
var analysisOptions = new StructureAnalysisOptions
{
MinFontSizeForHeading = 14f,
UseBoldAsIndicator = true,
MaxHeadingLevels = 4,
RequireStandaloneHeadings = true,
DebugMode = false
};
var customStructureItems = await extractor.AnalyzeStructureAsync("document.pdf", analysisOptions);
// ?? 使用預(yù)設(shè)配置
var strictItems = await extractor.AnalyzeStructureAsync("document.pdf", StructureAnalysisOptions.Strict);
var relaxedItems = await extractor.AnalyzeStructureAsync("document.pdf", StructureAnalysisOptions.Relaxed);
// 導(dǎo)出為Markdown
await extractor.ExportToFileAsync(tocItems, "output.md", "markdown");
// 導(dǎo)出為JSON(帶自定義選項(xiàng))
var exportOptions = new ExportOptions
{
MaxDepth = 3,
IncludePageNumbers = true,
CustomTitle = "文檔目錄"
};
await extractor.ExportToFileAsync(tocItems, "output.json", "json", exportOptions);
// 智能提取并直接導(dǎo)出
await extractor.ExtractSmartAndExportAsync("document.pdf", "output.xml",
exportOptions: exportOptions,
structureOptions: StructureAnalysisOptions.Default);
擴(kuò)展性
可以通過(guò)實(shí)現(xiàn) IExporter 接口來(lái)創(chuàng)建自定義導(dǎo)出器:
public class CustomExporter : IExporter
{
public string FormatName => "Custom";
public string FileExtension => "custom";
public string Export(IEnumerable<TocItem> tocItems, ExportOptions? options = null)
{
// 實(shí)現(xiàn)自定義導(dǎo)出邏輯
return "custom format content";
}
public async Task ExportToFileAsync(IEnumerable<TocItem> tocItems, string filePath, ExportOptions? options = null)
{
var content = Export(tocItems, options);
await File.WriteAllTextAsync(filePath, content);
}
}
// 注冊(cè)自定義導(dǎo)出器
extractor.RegisterExporter("custom", new CustomExporter());
技術(shù)實(shí)現(xiàn)
PdfTocExtractor 使用以下技術(shù):
- .NET 9.0 - 現(xiàn)代化的.NET平臺(tái)
- iText 9.2.0 - 強(qiáng)大的PDF處理庫(kù)
- iText7.bouncy-castle-adapter 9.2.0 - 加密PDF支持(必需)
- Newtonsoft.Json 13.0.3 - JSON序列化
- System.CommandLine 2.0.0 - 命令行參數(shù)解析
- AOT編譯支持 - 原生性能,無(wú)需.NET運(yùn)行時(shí)
TODO 計(jì)劃
AI 增強(qiáng)功能
AI 目錄識(shí)別 - 使用機(jī)器學(xué)習(xí)技術(shù)識(shí)別沒(méi)有書(shū)簽/大綱數(shù)據(jù)的PDF文檔目錄結(jié)構(gòu)
- 集成 OCR 技術(shù)識(shí)別掃描版PDF中的目錄頁(yè)面
- 基于文本分析和格式識(shí)別的智能目錄提取
- 支持多語(yǔ)言目錄識(shí)別(中文、英文、日文等)
- 目錄層級(jí)結(jié)構(gòu)智能推斷
- 頁(yè)碼與目錄項(xiàng)的自動(dòng)匹配算法
Web 服務(wù)接口
RESTful API 開(kāi)發(fā) - 提供基于 HTTP 的 Web API 服務(wù)
- PDF 文件上傳接口
- 目錄提取 API 端點(diǎn)
- 多格式導(dǎo)出 API(JSON、XML、Markdown等)
- 批量處理接口
- 任務(wù)狀態(tài)查詢接口
- API 文檔和 Swagger 集成
Web 前端界面
現(xiàn)代化 Web UI - 開(kāi)發(fā)用戶友好的 Web 前端界面
- 拖拽式 PDF 文件上傳
- 實(shí)時(shí)目錄提取進(jìn)度顯示
- 目錄結(jié)構(gòu)可視化預(yù)覽
- 多格式導(dǎo)出選項(xiàng)界面
- 歷史記錄和文件管理
- 響應(yīng)式設(shè)計(jì),支持移動(dòng)端訪問(wèn)
技術(shù)架構(gòu)優(yōu)化
微服務(wù)架構(gòu) - 將功能模塊化為獨(dú)立的微服務(wù)
- PDF 處理服務(wù)
- AI 識(shí)別服務(wù)
- 文件存儲(chǔ)服務(wù)
- 用戶管理服務(wù)
- 容器化部署支持(Docker)
高級(jí)功能
智能分析 - 提供更多文檔分析功能
- 文檔結(jié)構(gòu)分析和統(tǒng)計(jì)
- 目錄質(zhì)量評(píng)估
- 重復(fù)內(nèi)容檢測(cè)
- 文檔相似度比較
- 批量文檔處理和分析報(bào)告
企業(yè)級(jí)功能
安全和權(quán)限 - 企業(yè)級(jí)安全特性
- 用戶認(rèn)證和授權(quán)
- 文件訪問(wèn)權(quán)限控制
- 審計(jì)日志記錄
- 數(shù)據(jù)加密存儲(chǔ)
- API 訪問(wèn)限制和配額管理
小結(jié)
到這里,PdfTocExtractor 的核心能力已經(jīng)完整亮相:不管你的 PDF 有沒(méi)有書(shū)簽,都能一鍵生成結(jié)構(gòu)化目錄;想要命令行批處理還是在代碼里靈活調(diào)用,都不在話下。
在實(shí)際項(xiàng)目中,這個(gè)工具已經(jīng)幫我節(jié)省了大量手動(dòng)整理目錄的時(shí)間,也避免了 OCR 誤識(shí)別、格式混亂等繁瑣問(wèn)題。尤其是新版的 Smart 與 Semantic 雙引擎,既快又準(zhǔn),真香!
當(dāng)然,項(xiàng)目還遠(yuǎn)遠(yuǎn)沒(méi)有到“終點(diǎn)”。后續(xù)的 AI 目錄識(shí)別、Web API、現(xiàn)代化 UI 乃至企業(yè)權(quán)限體系,都在 Roadmap 上等著逐步落地。如果你也對(duì)這些方向感興趣,歡迎 issue / PR / Star,一起把它打造成最好用的 PDF 目錄工具!
到此這篇關(guān)于純C#實(shí)現(xiàn)智能PDF目錄提取工具PdfTocExtractor的文章就介紹到這了,更多相關(guān)C#提取PDF目錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#批量刪除Excel重復(fù)項(xiàng)的實(shí)現(xiàn)方法
當(dāng)從不同來(lái)源導(dǎo)入Excel數(shù)據(jù)時(shí),可能存在重復(fù)的記錄,為了確保數(shù)據(jù)的準(zhǔn)確性,通常需要?jiǎng)h除這些重復(fù)的行,本文將提供一個(gè)使用C# 快速查找并刪除Excel重復(fù)項(xiàng)的免費(fèi)解決方案,需要的朋友可以參考下2024-04-04
Unity實(shí)現(xiàn)簡(jiǎn)單搖桿的制作
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單搖桿的制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C#使用Queue<T>進(jìn)行隊(duì)列設(shè)計(jì)
Queue<T>類提供了許多方法和屬性,用于處理隊(duì)列中的元素,本文主要介紹了C#使用Queue<T>進(jìn)行隊(duì)列設(shè)計(jì),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
C#實(shí)現(xiàn)多選項(xiàng)卡的瀏覽器控件
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)多選項(xiàng)卡的瀏覽器控件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-03-03
C#之關(guān)于Base64簡(jiǎn)單加密與解密方式
這篇文章主要介紹了C#之關(guān)于Base64簡(jiǎn)單加密與解密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06

