网站首页 > 教程文章 正文
前言
最近在做标书的时候发现,有些文档文字量很大,想让大模型完全解读不太现实,先不说 context 长度够不够,首先 token 消耗量就爆炸了
于是想到使用取巧的方式,提取 PDF 的目录来进行分析,于是说干就干,用 C# 写了一个工具来实现目录提取,结果效果还不错
后续我又继续完善这个工具,增加了语义识别等功能
继续沿用 C# + AOT + GitHub Actions + dotnet tool + nuget 这套流程的开发
项目地址:
https://github.com/star-plan/pdf-toc-extractor
类似项目:
为什么是目录提取?
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 classCustomExporter : IExporter
{
publicstring FormatName => "Custom";
publicstring FileExtension => "custom";
public string Export(IEnumerable
{
// 实现自定义导出逻辑
return"custom format content";
}
public async Task ExportToFileAsync(IEnumerable
{
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 增强功能
- AI 目录识别- 使用机器学习技术识别没有书签/大纲数据的PDF文档目录结构
-
集成 OCR 技术识别扫描版PDF中的目录页面
-
基于文本分析和格式识别的智能目录提取
-
支持多语言目录识别(中文、英文、日文等)
-
目录层级结构智能推断
-
页码与目录项的自动匹配算法
Web 服务接口
- RESTful API 开发- 提供基于 HTTP 的 Web API 服务
-
PDF 文件上传接口
-
目录提取 API 端点
-
多格式导出 API(JSON、XML、Markdown等)
-
批量处理接口
-
任务状态查询接口
-
API 文档和 Swagger 集成
Web 前端界面
- 现代化 Web UI- 开发用户友好的 Web 前端界面
-
拖拽式 PDF 文件上传
-
实时目录提取进度显示
-
目录结构可视化预览
-
多格式导出选项界面
-
历史记录和文件管理
-
响应式设计,支持移动端访问
技术架构优化
- 微服务架构- 将功能模块化为独立的微服务
-
PDF 处理服务
-
AI 识别服务
-
文件存储服务
-
用户管理服务
-
容器化部署支持(Docker)
高级功能
- 智能分析- 提供更多文档分析功能
-
文档结构分析和统计
-
目录质量评估
-
重复内容检测
-
文档相似度比较
-
批量文档处理和分析报告
企业级功能
- 安全和权限- 企业级安全特性
-
用户认证和授权
-
文件访问权限控制
-
审计日志记录
-
数据加密存储
-
API 访问限制和配额管理
小结
到这里,PdfTocExtractor
的核心能力已经完整亮相:不管你的 PDF 有没有书签,都能一键生成结构化目录;想要命令行批处理还是在代码里灵活调用,都不在话下。
在实际项目中,这个工具已经帮我节省了大量手动整理目录的时间,也避免了 OCR 误识别、格式混乱等繁琐问题。尤其是新版的 Smart与Semantic双引擎,既快又准,真香!
当然,项目还远远没有到“终点”。后续的 AI 目录识别、Web API、现代化 UI 乃至企业权限体系,都在 Roadmap 上等着逐步落地。如果你也对这些方向感兴趣,欢迎 issue / PR / Star,一起把它打造成最好用的 PDF 目录工具!
最后,如果本文对你有所帮助,别忘了给仓库点个 Star,让更多小伙伴受益;也欢迎在评论区交流使用体验或提功能建议,我们下篇文章再见~
猜你喜欢
- 2025-09-03 现代机械研究:大麦播种中拖拉机-轮胎-工具系统中不同的可调参数
- 2025-09-03 SpringBoot 实现在线查看内存对象拓扑图 —— 给 JVM 装上“透视眼”
- 2025-09-03 我从 OpenAI 官方的『GPT-5 提示指南』里,为你总结了 8 条核心法则
- 2025-09-03 现代农机研究:大麦播种拖拉机-轮胎-工具系统中不同的可调参数
- 2025-09-03 4个问题 + 1个Demo:彻底搞懂谷歌的新玩意Agent2Agent(A2A)
- 2025-09-03 Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 2025-09-03 ASEAN+3 finance ministers, central bank governors conclude meeting in Milan
- 2025-09-03 我的Artix linux-Dinit-Xfce配置_artixlinux安装教程
- 2025-09-03 Android调优 使用内存分析器查看应用的内存使用情况
- 2025-09-03 RoboSense Unveils 'Active Camera' Vision Platform at 2025 World Robot Conference in Beijing
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)