前言

最近在做标书的时候发现,有些文档文字量很大,想让大模型完全解读不太现实,先不说 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 使用以下技术:

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 误识别、格式混乱等繁琐问题。尤其是新版的 SmartSemantic 双引擎,既快又准,真香!

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

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

纯 C#实现+AOT 打造的智能PDF目录提取工具 PdfTocExtractor的更多相关文章

  1. 打造强势智能手表平台:Testin云測携手索尼招募全球开发人员

    打造强势智能手表平台:Testin云測携手索尼招募全球开发人员 2014/10/27 · Testin · 业界资讯 日前,全球最大的移动游戏.应用真机和用户云測试平台Testin云測宣布联手索尼公司 ...

  2. StartDT AI Lab | 视觉智能引擎+数据决策引擎——打造商业“智能沙盘”

    众所周知,线上商家可以通过淘宝平台的大量前端“埋点”轻松获取商品的加购率.收藏率.转化率.成交额等大量基础信息,甚至商家能够在更精细的层面,获取商品关键字变化或者上新/爆款带来的流量变化数据,更甚者商 ...

  3. ABBYY FineReader 15新增智能PDF文档转换功能

    ABBYY FineReader 15(Windows系统)新增智能PDF文档转换功能,可自动检测导入PDF数字文档的文本层质量,确保转变为可编辑格式后的准确结果:从表单字段和文本框中提取文本,准确保 ...

  4. AI剪辑和自定义UI,打造更智能的剪辑体验

    为满足开发者构建高效的应用内视频编辑能力,7月的HMS Core 6.0 推出了视频编辑服务(Video Editor Kit),一站式的视频处理能力获得了积极反响.同时,我们也关注到开发者需要集成丰 ...

  5. 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验

    移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...

  6. 打造程序员的高效生产力工具-mac篇

    打造程序员的高效生产力工具-mac篇 1   概述 古语有云:“工欲善其事,必先利其器” [1] ,作为一个程序员,他最重要的生产资源是脑力知识,最重要的生产工具是什么?电脑. 在进行重要的脑力成果输 ...

  7. 【强大的PDF格式转换工具】Lighten PDF Converter OCR for Mac 6.2.0

    [简介] Lighten PDF Converter OCR 是一款Mac上强大的PDF格式转换工具,可以将PDF文档快速批量的转换为Office (Word, Excel, PowerPoint), ...

  8. 经验分享:PDF怎么提取页面

    PDF文件的页面有很多但有需要的并不是全部,有时候需要其中一页或几页的时候,这个时候我们就需要把单独的页面提取出来,这个时候应该怎么做呢,上次有小伙伴来询问小编,今天小编就为大家分享一下小编自己的编辑 ...

  9. 如何编辑PDF文件,怎么使用PDF裁剪页面工具

    在编辑PDF文件的时候,往往会有很多的小技巧可以使用,在编辑PDF文件的时候,怎么对文件的页面进行裁剪呢,不会的话,看看下面的文章吧,小编已经为大家整理好了哦. 1.打开运行PDF编辑器,在编辑器中打 ...

  10. 小米正式开源 SQL 智能优化与改写工具 SOAR

    近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...

随机推荐

  1. uniCloud云函数结合nodemailer发送邮件的方法

    使用uniCloud云函数结合nodemailer发送邮件的时候,在本地调试可以发送成功,但是当我把云函数上传后,就不能发送到邮件了,但是云函数依旧执行了.开始我以为是node.js版本的原因,但是经 ...

  2. linux系统自定义登录提示信息

    centos7配置说明 这里对于centos7.x系统,可以直接编辑/etc/motd文件,增加定制的提示信息,并可以通过不同颜色展示. vim /etc/motd ^[[32m 设备IP地址: 10 ...

  3. 直播预约丨《袋鼠云大数据实操指南》No.2:实时开发,如何成为数据智能化的有效驱动力

    近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...

  4. jemelloc论文(中英翻译)

    AScalable Concurrent malloc(3) Implementation for FreeBSD (基于FreeBSD的可伸缩的并发malloc(3)实现) 作者:Jason Eva ...

  5. DRF之权限组件源码分析

    DRF之权限组件源码分析 [一]权限组件介绍 Django REST framework(DRF)中的权限组件用于控制API的访问权限. DRF内置了多个常用的权限类,同时也允许你创建自定义的权限类以 ...

  6. ArcGIS Pro SDK 001 基于SDK创建第一个插件

    ArcGIS Pro SDK只能开发ArcGIS Pro软件上的插件,不能单独开发独立的应用程序.ArcMap是32位的,在处理大数据时,经常会崩溃,但同样的数据和逻辑,因为ArcGIS Pro是64 ...

  7. 大模型基础补全计划(三)---RNN实例与测试

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言    本文是这个系列第三篇,它们是: & ...

  8. poi处理excel基本操作时写的工具类

    1.复制单元格 1 ... 2 public static void copyCell(Workbook wb, Cell srcCell, Cell distCell, boolean copyVa ...

  9. Codeforces Round #601 (Div. 2) ABC 题解

    A. Changing Volume 题意:每次可以加减5或2或1,问最少几步将a变成b. 思路:水题,贪心先搞把5取完再取2再取1. #include<iostream> #includ ...

  10. libsvm matlab 上的安装

    简介windows上matlab安装还是有一些坑的 首先 matlab2016a 安装一个 编译器 tdm64-gcc-4.9.2.exe 然后更改 libsvm 中的matlab make.m 重点 ...