[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f1b33lgb9fb2my":3},{"code":4,"message":5,"data":6,"timestamp":87},10000,"success",{"full_name":7,"position":8,"description":9,"language":10,"stars":11,"forks":12,"stars_gained":13,"age_days":14,"hn_threads":15,"one_liner":22,"summary_md":23,"topic":24,"github_topics":27,"license":48,"homepage":49,"updated_at":50,"history":51,"related":59},"opendataloader-project\u002Fopendataloader-pdf",7,"PDF Parser for AI-ready data. Automate PDF accessibility. Open-source.","Java",30003,2863,281,531,[16],{"id":17,"title":18,"points":19,"comments":20,"posted_at":21},45347147,"OpenDataLoader-PDF: An open source tool for structured PDF parsing",109,28,"2025-09-23","把 PDF 转成带坐标的 Markdown\u002FJSON 和 Tagged PDF，服务 RAG 数据管道与无障碍改造。","如果你手上的 PDF 一到提取环节就乱，这个项目值得花半小时试：本地模式确定性输出，难页面再交给混合模式。但要先接受两点：AI 相关的大多数能力需要额外安装后端，而无障碍这边只有自动打标签在开源版里，PDF\u002FUA 导出属于付费插件。\n\n## 解决什么问题\n你有一批 PDF——报告、论文、银行流水、扫描件——想喂进 RAG 索引或做内容迁移。复制粘贴会把分栏和表格弄乱，普通提取器对多栏排版束手无策，坏页面只能人工逐页修。用这个工具，你把文件或目录传给 `convert()`，直接得到 Markdown、JSON 或 HTML，每个元素带坐标，还能重建标题、列表和表格结构。无障碍场景则不同：改造前是一份没有标签的 PDF，读屏软件只能按文档顺序念；改造后是一份带结构树的 Tagged PDF，后续修复工作有了基础。\n\n## 有什么不同\n核心是本地版面分析，用 XY-Cut++ 判断阅读顺序，输出确定、每个元素带 bounding box，也可以选择尊重 PDF 已有的结构标签。输出确定对数据管道很重要：同一份输入得到同一份结果，回归测试和 diff 才有意义。启发式搞不定的部分——复杂无边框表格、需要 OCR 的扫描页、公式、图表描述——混合模式会把这类页面转给 AI 后端，通过 `[hybrid]` 额外安装。代价也很典型：本地模式快且可预测，但恰恰在难页面上吃力；混合模式改善难页面，却多了一个服务、一步安装，输出也不再那么确定。\n\nTagged PDF 的处理是另一个有区分度的行为：文件本身有标签且你打开 `use_struct_tree` 时，解析器采用作者留下的结构，而不是猜。README 明确说标签质量差时会适得其反，而且 `use_struct_tree` 会覆盖混合模式，所以得先了解自己的语料。无障碍方向上，开源版止步于自动打标签生成 Tagged PDF；PDF\u002FUA 导出和无障碍工作室是企业版功能，完整合规输出不在开源核心里。\n\n## 谁值得试\n适合：正在搭文档摄取管道的数据或 ML 工程师，能接受 Java 依赖，想要带坐标的 JSON 以及 Python\u002FNode 封装；或者已经有修复流程的无障碍团队，需要给未打标签的 PDF 生成第一版结构树。不适合：只需要导出纯文本的人（安装成本换不回来），以及需要进程内 C++ 库的项目——HN 上有评论者明确说要找能在 C++ 里调用的表格提取库，Java\u002FPython 技术栈对他就是障碍。如果你要求 PDF\u002FUA 输出完整落在宽松许可证下，也不适合。\n\n一条实际使用反馈：2025-09-23 有评论者在[同一讨论串](https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=45347147)里说，拿银行流水试过，JSON 结果一次就能用，比自己试过的其他工具好，但仍需更深入检查。这只是单一文档类型、单一版本的经验，不是基准测试。\n\n## 使用条件与边界\npip 路径需要 Java 11+ 和 Python 3.10+；另有 Node.js 和 Java 的快速上手路径。因为每次 `convert()` 都会启动一个 JVM，README 提醒反复单文件调用会慢——把输入批量放进一次调用。混合模式、OCR、公式和图表功能需要安装额外组件并启动后端；OCR 质量随引擎和语言不同而变化。\n\nREADME 里的基准数字（整体 0.907、表格 0.928、本地模式 0.015 秒\u002F页）是项目自报的，本文没有独立验证，只能当作针对你自己文档的起点假设。许可证在 2.0 版从 MPL 2.0 改为 Apache 2.0，2.0 之前的版本仍属 MPL。依赖结构标签前，先读 [Tagged PDF 说明](https:\u002F\u002Fopendataloader.org\u002Fdocs\u002Ftagged-pdf)。\n\n## HotRepo 点评\nHotRepo 记录到该项目 2026-10-24 为 29,983 星、2026-10-25 为 29,988 星，这两天样本里两次登上日榜。这只是快照，不是趋势：两天的记录不足以判断热度能否持续。真正该先验证的是：在你的实际 tagged PDF 语料上，`use_struct_tree` 和混合模式哪个效果更好。",{"slug":25,"name":26},"data","数据",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"a11y","accessibility","ai","bounding-box","document-parsing","eaa","html","json","markdown","ocr","ocr-recognition","pdf","pdf-accessibility","pdf-converter","pdf-extraction","pdf-parser","pdf-ua","rag","tables","tagged-pdf","Apache-2.0","https:\u002F\u002Fopendataloader.org","2026-10-25T03:26:44Z",[52,56],{"date":53,"stars":54,"stars_gained":55},"2026-10-24",29983,11,{"date":57,"stars":58,"stars_gained":55},"2026-10-25",29993,[60,65,69,73,77,82],{"full_name":61,"one_liner":62,"language":63,"stars":64},"opengeos\u002FRustGIS","面向地理数据的桌面与浏览器 GIS，可绘图、分析和导出，并提供可脚本化的命令行和 Python 接口。","Rust",1923,{"full_name":66,"one_liner":67,"language":63,"stars":68},"apache\u002Figgy","用 Rust 写成的持久化消息流服务器，给想要 Kafka 式追加日志语义、又不想维护 JVM 栈的团队。",5193,{"full_name":70,"one_liner":71,"language":10,"stars":72},"apache\u002Fkafka","面向服务之间高吞吐事件传输与留存场景的分布式事件流平台。",34115,{"full_name":74,"one_liner":75,"language":10,"stars":76},"apache\u002Fgravitino","把 Hive、MySQL、S3 等异构数据源的元数据统一到一个目录，让查询引擎和团队不必各自维护一套。",3322,{"full_name":78,"one_liner":79,"language":80,"stars":81},"ClickHouse\u002FClickHouse","面向大规模数据的开源列式分析数据库，用来实时生成分析报表。","C++",50587,{"full_name":83,"one_liner":84,"language":85,"stars":86},"umami-software\u002Fumami","自托管网站与产品分析，不依赖 Cookie 和第三方监控。","TypeScript",39654,1793008437]