前言
最近在做标书的时候发现,有些文档文字量很大,想让大模型完全解读不太现实,先不说 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 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 增强功能
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 目录工具!
到此这篇关于纯c#实现智能pdf目录提取工具pdftocextractor的文章就介绍到这了,更多相关c#提取pdf目录内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论