
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本篇指南围绕 xbergRust 核心的多语言文档智能提取库的 PHP 绑定完整讲解如何通过Xberg\ExtractInput构造输入、调用Xberg::extract()提取 HTML/PDF/Office/图片等文档中的表格并分别以二维单元格数组与渲染好的 Markdown 文本两种形态消费表格数据。读完本文你将掌握getTables()/getCells()/getMarkdown()等核心 API 的用法理解Table对象中pageNumber、boundingBox、tableId、columns、cellStyles等字段的语义并学会用仓库中的端到端测试验证自己的代码。最小可运行示例一次提取双通道读取表格原始契约文档 docs-site/src/snippets-generated/php/contract/table_access.md 给出的核心示例展示了 xberg PHP 绑定访问表格的完整闭环——构造一个指向 HTML 文档的 URI 输入执行提取然后同时读取每个表格的单元格网格和Markdown 文本?php declare(strict_types1); require_once __DIR__ . /vendor/autoload.php; use Xberg\Xberg; use Xberg\ExtractInput; $input \Xberg\ExtractInput::from_json(json_encode([kind uri, mimeType text/html, uri https://example.com/html/simple_table.html])); $result Xberg::extract($input, []); foreach ($result-getResults()[0]-getTables() as $table) { var_dump($table-getCells()); var_dump($table-markdown); }这段代码虽然只有十余行却串联起了整个 xberg PHP 表格访问链路下面逐层拆解。输入构造ExtractInput的字段与工厂方法示例通过\Xberg\ExtractInput::from_json()用一个 JSON 字符串构造输入对象其背后的 PHP 类定义在 crates/xberg-php/src/lib.rs。ExtractInput携带以下字段字段类型说明kindstring输入来源类型。bytes表示原始字节输入此时须提供bytesuri表示 URI 输入此时须提供uribytes?stringkind bytes时的原始字节内容uri?string本地路径、file://URI 或 HTTP(S) URLmimeType?stringMIME 类型提示如text/html、application/pdffilename?string文件名提示用于 MIME 探测与元数据config?FileExtractionConfig单输入粒度的提取配置覆盖示例中kind uri、mimeType text/html、uri指向一个远程 HTML 页面这组合是标准的网页/HTML 表格提取姿势。除了from_json()这个通用工厂绑定还提供了两个语义更明确的构造方法ExtractInput::fromBytes(bytes, mimeType, filename)——直接喂字节流适合已读入内存的 PDF、图片、Office 文件ExtractInput::fromUri(uri)——只给 URI本地路径、file://或 HTTP(S) URLMIME 由引擎自动探测。from_json内部调用serde_json::from_str解析如果 JSON 结构非法会抛出带具体错误信息的PhpException。提取调用链从Xberg::extract到getResults()[0]-getTables()示例调用Xberg::extract($input, [])第二个参数为空数组表示使用全默认ExtractionConfig。绑定层实现位于 crates/xberg-php/src/lib.rs它把 PHP 对象转换为核心 Rust 的xberg::ExtractInput与xberg::ExtractionConfig在WORKER_RUNTIME上block_on异步执行真正的xberg::extract()最后把 Rust 结果整体转回 PHP 对象返回。返回值是Xberg\ExtractionResultcrates/xberg-php/src/lib.rs它包含results——按发现顺序排列的提取文档列表即getResults()errors——非致命、按输入归类的错误summary——本次操作的聚合统计crawlFinalUrls/crawlRedirectCount/crawlUniqueNormalizedUrls——URL 抓取相关的跳转与去重信息。每个结果是一个ExtractedDocumentcrates/xberg-php/src/lib.rsgetTables()crates/xberg-php/src/lib.rs返回该文档中识别出的全部表格对象数组。所以$result-getResults()[0]-getTables()的语义就是第一个文档里所有被提取出来的表格。Table对象深度解析单元格、Markdown 与位置信息PHP 侧的Xberg\Table类定义在 crates/xberg-php/src/lib.rs它直接镜像 Rust 核心类型 crates/xberg/src/types/tables.rs。一个Table包含以下属性属性访问器类型语义cellsgetCells()arrayarraystring表格单元格的二维数组cells[row][col]行 × 列结构markdowngetMarkdown()string该表格渲染好的 Markdown 文本如| A | B |\n|---|---|\n| C | D |pageNumbergetPageNumber()int表格所在页码从 1 开始boundingBoxgetBoundingBox()?BoundingBox表格位置边界框仅当产生该表格的提取器提供了位置数据时才填充tableIdgetTableId()?string稳定标识符用于把tables[]与content/pages[].content/chunks[].content中的 Markdown 块对应起来columnsgetColumns()?arraystring表头单元格即cells的第一行即使该表格自身的表头行被合并掉也会填充保证单个表格片段可独立解读cellStylesgetCellStyles()arrayTableCellStyle带段落样式的单元格列表稀疏、扁平设计如 DOCX 标题行关于boundingBox坐标系必须知道的约定boundingBox的坐标空间取决于表格由哪条管线产出使用前必须先弄清来源见 crates/xberg/src/types/tables.rsPDF 原生内容提取的表格以及扫描版 PDF 经过 OCR 管线--force-ocr/--ocr-scanned-pages识别出的表格坐标单位为PDF 磅points原点在左下角x 向右、y 向上。OCR 场景下管线会把后端的像素坐标先经过rescale_ocr_bboxes_to_page_points实现在 crates/xberg/src/extractors/pdf/ocr/document.rs缩放到该坐标系纯图片PNG/JPEG/TIFF直接提取、OCR 检测出的表格坐标是光栅像素坐标原点在左上角x 向右、y 向下与 OCR 后端Tesseract、PaddleOCR、candle 系后端或版面检测器上报的原始像素框一致因为没有 PDF 页面几何可缩放直接原样透传。tableId跨通道对齐表格的关键tableId由提取管线确定性地分配按文档顺序生成table-N这类序号绝不依赖随机数或墙钟时间因此同一输入文档每次提取都会得到相同的 idcrates/xberg/src/types/tables.rs。它的典型用途把结构化tables[]条目与 Markdown 文本流content、pages[].content、chunks[].content中的表格块做关联实现既保留了全文 Markdown又能精确知道每张表的结构。需要注意跨页拆分的表格目前不会共享同一个 id——每个页内片段各自独立编号。cellStyles处理表头即标题的特殊表格cellStyles对应类型TableCellStyle见 crates/xberg/src/types/tables.rs保存单元格携带的段落样式字段为row、col零基下标指向cells、headingLevel1–6 级标题非标题则为空、styleName如heading 2。这是一个稀疏、扁平的结构——只有真正带样式的单元格才会出现条目所以普通表格序列化后与从前完全一致。它解决的真实痛点DOCX 中的横幅行第 0 行、整行跨列、样式为Heading1..Heading6是 Word 导航窗格与TOC字段眼中的文档大纲但作为表格单元格它原本只能以匿名文本到达消费者cells保持纯文本给单元格文本加#前缀会在表格内部产生非法 Markdown 标题样式信号则独立放进cellStyles。引擎内部表格是如何被提取出来的xberg 的表格提取并非单一算法而是按文档类型走不同管线最终都归一为统一的Table结构HTMLHtmlExtractor支持text/html与application/xhtmlxml两种 MIMEcrates/xberg/src/extractors/html.rs。测试辅助函数extract_tablescrates/xberg/src/extractors/html.rs展示了其内部链路convert_html_to_markdown_with_tables解析 HTML 得到TableData含网格grid与 Markdown 文本再经flatten_positioned_cells把带row_span/col_span的定位单元格展平为规整的VecVecString最后组装成Table { cells, markdown, page_number: i 1, bounding_box: None }。这就是示例文档走的路——HTML 表格位置信息天然缺失boundingBox为None。PDF 原生NativeDocument::extract_tables_nativecrates/xberg/src/pdf/native/table.rs以及extract_tables_bordered有边框表格、extract_tables_heuristic启发式表格构成 PDF 侧的表格识别族。OCR 识别扫描页经 OCR 管线得到的是RecognizedTablePHP 侧见 crates/xberg-php/src/lib.rs含detectionBbox、cells、markdown再经坐标缩放、缝合stitching等步骤归入统一tables[]。Rust 核心类型 crates/xberg/src/types/tables.rs 自带的单元测试直接给出了Table的 JSON 形态样例cells为二维数组markdown为管道表格文本page_number为 1bounding_box形如{x0:50.0,y0:100.0,x1:500.0,y1:700.0}并验证了含bounding_box时的序列化往返。端到端验证仓库中的test_table_access测试仓库为本文核心示例提供了对应的端到端契约测试位于 e2e/php/tests/ContractTest.php。测试通过环境变量MOCK_SERVER_URL指向 mock 服务器把$mock_url/html/simple_table.html作为 URI 输入与契约 fixture fixtures/contract/table_access.json 对应然后断言$results0Tables $result-getResults()[0]-getTables(); $this-assertEquals(text/html, $result-getResults()[0]-mimeType); $this-assertGreaterThanOrEqual(2, count($results0Tables)); $this-assertStringContainsString(Product, $result-getResults()[0]-getTables()[0]-markdown); $this-assertStringContainsString(Category, $result-getResults()[0]-getTables()[0]-markdown); $this-assertStringContainsString(Laptop, $result-getResults()[0]-getTables()[0]-markdown); $this-assertStringContainsString($999.99, $result-getResults()[0]-getTables()[0]-markdown);从中可以提炼出三个可靠的行为约定MIME 回传提取结果的mimeType与输入提示一致text/html表格数量这个simple_table.html样例至少产生 2 个表格条目assertGreaterThanOrEqual(2, ...)Markdown 保真表头单元格Product、Category与数据单元格Laptop、$999.99都完整出现在markdown字段里——说明 HTML 表格的文本内容没有在转换过程中丢失。实战组合把表格用于你的 PHP 项目将表格转成关联数组getCells()返回规整的二维字符串数组第一行即表头getColumns()是其冗余暴露跨片段场景下更可靠可以直接转成按列名索引的行记录$table $result-getResults()[0]-getTables()[0]; $cells $table-getCells(); $headers $cells[0] ?? []; $rows []; foreach (array_slice($cells, 1) as $row) { $rows[] array_combine($headers, array_pad($row, count($headers), )); }直接消费 Markdown$table-markdown等价于getMarkdown()是已经渲染好的标准管道表格可直接拼进全文、落盘或喂给下游 LLM/RAG 管线$table-getTableId()可用来反向定位这段 Markdown 在全文中的归属。页面与位置过滤多页文档用getPageNumber()筛选指定页的表格带位置数据的结果PDF 原生或扫描页 OCR用getBoundingBox()拿到边界框做版面分析。务必按上一节说明确认坐标系后再解释坐标值。批量场景Xberg::extractBatch()crates/xberg-php/src/lib.rs接受多个ExtractInput并同样返回ExtractionResult适合批量文档的表格抽取getResults()的下标即输入顺序。关键约定小结cells始终是纯文本的二维网格带样式的单元格信息走cellStyles不要试图往cells里塞 Markdown/标题语法。pageNumber从 1 开始boundingBox的坐标系必须结合表格来源PDF 原生/扫描 OCR 为 PDF 磅、左下原点纯图片 OCR 为像素、左上原点解释。tableId确定性分配、可跨通道对齐跨页拆分表格各片段 id 独立。表格提取按格式分流HTML 转换器、PDF 原生/边框/启发式、OCR 识别最终统一收敛为Table因此同一套 PHP 代码可以无差别处理 HTML、PDF、Office 与图片中的表格。如需查看 PHP 绑定支持的全部能力与安装方式可阅读 packages/php/README.md底层表格类型定义与测试在 crates/xberg/src/types/tables.rs更多语言的契约样例可在 docs-site/src/snippets-generated/php/contract/ 下继续探索。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg Java 绑定中的表格访问遍历结构化单元格与 Markdown 输出xberg Java 绑定中的表格访问遍历结构化单元格与 Markdown 输出 本文围绕 xberg 的 Java 绑定 io.xberg 包讲解如何通后端AI 应用NLPXberg Go 绑定实战从结构化单元格到 Markdown 的表格访问指南Xberg Go 绑定实战从结构化单元格到 Markdown 的表格访问指南 本篇指南讲解如何使用 xberg 的 Go 绑定 packages/go 提后端AI 应用NLPxberg C 表格访问实战通过 ExtractAsync 提取并遍历结构化单元格与 Markdown 输出xberg C 表格访问实战通过 ExtractAsync 提取并遍历结构化单元格与 Markdown 输出 本文基于 xberg 仓库中的 table_ac后端AI 应用NLP上一篇aioredis-py终极指南从入门到精通的Python异步Redis客户端下一篇FossFLOW等距图制作终极指南7步打造专业级基础设施可视化图表创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考