当前位置: 首页 > news >正文

纯 C#实现+AOT 打造的智能PDF目录提取工具 PdfTocExtractor

前言

最近在做标书的时候发现,有些文档文字量很大,想让大模型完全解读不太现实,先不说 context 长度够不够,首先 token 消耗量就爆炸了

于是想到使用取巧的方式,提取 PDF 的目录来进行分析,于是说干就干,用 C# 写了一个工具来实现目录提取,结果效果还不错

后续我又继续完善这个工具,增加了语义识别等功能

继续沿用 C# + AOT + GitHub Actions + dotnet tool + nuget 这套流程的开发

项目地址: https://github.com/star-plan/pdf-toc-extractor

类似项目:

  • SharpIco
  • ImageGlider

为什么是目录提取?

PDF 转 word、markdown 等格式的工具太多了

咱不卷这个赛道

(说是这么说,我最近也做了一个🤣,不排除后续把 PDF 转文档的功能集成到这个项目里)

咱就专注于这个小众的需求,把 PDF 目录提取这个功能做好

后续又增加了语义识别功能,有些 PDF 并没有内嵌目录,这时候就需要从 PDF 的内容中分析提取出目录。

我一开始使用了模式匹配,结果效果很差,后面换成 NLP 的思路,虽然只是用了最简单的语义识别,但效果的提升非常可观!

可见选对工具还是很重要的

PdfTocExtractor

PdfTocExtractor 是一个纯 C# AOT 实现的轻量级PDF目录提取工具,用于从PDF文件中提取目录(TOC)并导出为多种格式。支持Markdown、JSON、XML、纯文本等格式,完全摆脱命令行依赖,无需额外的PDF处理工具,适合在 .NET 项目中内嵌、分发或集成自动化流程中使用。

通过PdfTocExtractor,您可以轻松从PDF文档中提取书签和目录结构,生成清晰的导航文档。v2.0新增的语义分析功能让您即使在PDF没有嵌入书签的情况下,也能通过基于NLP的智能分析自动识别章节标题,完美适用于文档处理、内容分析和自动化工作流。

🚀 跨平台、零依赖、极速提取,一切尽在 PdfTocExtractor!

✨ 功能特点

  • 📖 从PDF文件提取书签/目录信息
  • 🧠 语义分析功能:基于NLP的智能章节标题识别,适用于无书签PDF
  • 📄 支持多种输出格式:Markdown、JSON、XML、纯文本
  • 🎯 可配置的导出选项(层级深度、页码格式等)
  • 🔧 可扩展的导出器架构,支持自定义格式
  • ⚡ 异步操作支持,高性能处理
  • 🛠️ 提供命令行工具和NuGet包
  • 🚀 支持AOT编译,原生性能无需.NET运行时
  • 🌐 跨平台支持:Windows、Linux、macOS
  • 🎛️ 多种分析模式:默认、严格、宽松模式可选

📄 支持的输出格式

  • Markdown (md, markdown) - 适合文档和网页显示,支持层级结构
  • JSON (json) - 适合程序处理和API集成,包含完整元数据
  • XML (xml) - 结构化数据交换,标准化格式
  • Text (txt, text) - 纯文本格式,简洁易读

使用方法

依然和其他工具一样

提供了 nuget 库和 dotnet tool 命令行工具

可以作为库引入使用,也可以在命令行使用

命令行

安装 CLI 工具

dotnet tool install --global PdfTocExtractor.Cli

命令行使用

# 🌟 智能提取(推荐)- 自动选择最佳方法
pdftoc smart document.pdf -o output.md# 📖 提取PDF书签(传统方法)
pdftoc extract document.pdf -o output.md# 🧠 语义分析(v2.0新功能 - 适用于无书签的PDF)
pdftoc semantic document.pdf -o output.md# 指定输出格式
pdftoc smart document.pdf -o output.json -f json# 设置最大层级深度
pdftoc smart document.pdf -o output.xml --max-depth 3# 自定义标题和页码格式
pdftoc smart document.pdf -o output.txt --title "我的文档目录" --page-format "第 {0} 页"# 语义分析 - 严格模式(更精确的标题识别)
pdftoc semantic document.pdf -o output.md --mode strict --confidence 0.7# 语义分析 - 调试模式(查看分析过程)
pdftoc semantic document.pdf -o output.md --debug --verbose# 结构分析 - 宽松模式(识别更多潜在标题)
pdftoc analyze document.pdf -o output.md --relaxed# 结构分析 - 自定义参数
pdftoc analyze document.pdf -o output.md --min-font-size 14 --use-bold --debug# 智能提取 - 带结构分析配置
pdftoc smart document.pdf -o output.md --analysis-preset strict --debug-analysis# 显示详细输出
pdftoc smart document.pdf -o output.md --verbose# 诊断PDF文件问题
pdftoc diagnose document.pdf

作为库使用

安装核心库

dotnet add package PdfTocExtractor

代码示例

using PdfTocExtractor;
using PdfTocExtractor.Exporters;
using PdfTocExtractor.Models;// 创建提取器实例
var extractor = new PdfTocExtractor();// 🌟 智能提取(推荐)- 自动选择最佳方法
var tocItems = await extractor.ExtractTocSmartAsync("document.pdf");// 📖 传统方法:提取PDF书签
var bookmarkItems = await extractor.ExtractTocAsync("document.pdf");// 🧠 结构分析:适用于无书签的PDF
var structureItems = await extractor.AnalyzeStructureAsync("document.pdf");// 🧠 结构分析:使用自定义配置
var analysisOptions = new StructureAnalysisOptions
{MinFontSizeForHeading = 14f,UseBoldAsIndicator = true,MaxHeadingLevels = 4,RequireStandaloneHeadings = true,DebugMode = false
};
var customStructureItems = await extractor.AnalyzeStructureAsync("document.pdf", analysisOptions);// 🧠 使用预设配置
var strictItems = await extractor.AnalyzeStructureAsync("document.pdf", StructureAnalysisOptions.Strict);
var relaxedItems = await extractor.AnalyzeStructureAsync("document.pdf", StructureAnalysisOptions.Relaxed);// 导出为Markdown
await extractor.ExportToFileAsync(tocItems, "output.md", "markdown");// 导出为JSON(带自定义选项)
var exportOptions = new ExportOptions
{MaxDepth = 3,IncludePageNumbers = true,CustomTitle = "文档目录"
};
await extractor.ExportToFileAsync(tocItems, "output.json", "json", exportOptions);// 智能提取并直接导出
await extractor.ExtractSmartAndExportAsync("document.pdf", "output.xml",exportOptions: exportOptions,structureOptions: StructureAnalysisOptions.Default);

扩展性

可以通过实现 IExporter 接口来创建自定义导出器:

public class CustomExporter : IExporter
{public string FormatName => "Custom";public string FileExtension => "custom";public string Export(IEnumerable<TocItem> tocItems, ExportOptions? options = null){// 实现自定义导出逻辑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);}
}// 注册自定义导出器
extractor.RegisterExporter("custom", new CustomExporter());

技术实现

PdfTocExtractor 使用以下技术:

  • .NET 9.0 - 现代化的.NET平台
  • iText 9.2.0 - 强大的PDF处理库
  • iText7.bouncy-castle-adapter 9.2.0 - 加密PDF支持(必需)
  • Newtonsoft.Json 13.0.3 - JSON序列化
  • System.CommandLine 2.0.0 - 命令行参数解析
  • AOT编译支持 - 原生性能,无需.NET运行时

TODO 计划

AI 增强功能

Web 服务接口

Web 前端界面

技术架构优化

高级功能

企业级功能

小结

到这里,PdfTocExtractor 的核心能力已经完整亮相:不管你的 PDF 有没有书签,都能一键生成结构化目录;想要命令行批处理还是在代码里灵活调用,都不在话下。⚡️

在实际项目中,这个工具已经帮我节省了大量手动整理目录的时间,也避免了 OCR 误识别、格式混乱等繁琐问题。尤其是新版的 SmartSemantic 双引擎,既快又准,真香!😋

当然,项目还远远没有到“终点”。后续的 AI 目录识别、Web API、现代化 UI 乃至企业权限体系,都在 Roadmap 上等着逐步落地。如果你也对这些方向感兴趣,欢迎 issue / PR / Star,一起把它打造成最好用的 PDF 目录工具!🌟

最后,如果本文对你有所帮助,别忘了给仓库点个 Star,让更多小伙伴受益;也欢迎在评论区交流使用体验或提功能建议,我们下篇文章再见~👋

http://www.sczhlp.com/news/21024/

相关文章:

  • python 箱线图叠加折线图
  • 如何制作网站网页百度接单平台
  • 花钱做网站不给源码黄山seo
  • java网站项目可做青岛网站建设公司
  • 挂号网站建设苏州疫情最新通知
  • 做坑人网站二维码东莞企业网站排名优化
  • 上海有几个区分别叫什么名字爱站seo工具包下载
  • 电子商务网站开发前言站长论坛
  • 家庭网络如何做网站服务器新的数据新闻
  • 成都定制网站建设服google关键词搜索工具
  • 西安哪里可以做网站友链提交入口
  • 地产网站建设百度sem
  • 完整教程:决策树的学习
  • GAS_Aura-Gameplay Effects
  • 电子世界的“万能开关”与“电流放大器”——三极管深度解析
  • 如果让AI分析项目并让AI下次自动了解?
  • 别再纠结了!2025年代码托管平台选Gitee还是GitHub?
  • dwcc如何做网站谷歌seo外包
  • 登封网站制作网站建设长沙疫情最新消息今天封城了
  • 静态网站开发试验报告网站怎样优化文章关键词
  • 西安学校网站建设费用培训机构招生7个方法
  • 成都网站网站建设如何推广网上国网
  • 唐山房产网站建设seo技术培训宁波
  • wordpress自带轮播seo平台是什么意思
  • 网络服务器怎么连接seo排名的方法
  • 做网站的属于什么行业在线生成个人网站app
  • 包头网站网络营销就业方向和前景
  • 建设自己的淘宝优惠券网站南京网络建站公司
  • 互联网站公安备案广州最新重大新闻
  • 政府网站模板下载链接交换公司