Xberg PHP 绑定实战:用 `extract` API 通过 Bytes 字节流提取 PDF 文档内容
后端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 是一个以 Rust 为核心的多语言文档智能引擎PHP 绑定为其提供了 PHP 8.2 的类型安全接口。本文围绕仓库中的 contract 契约文档 api_extract_bytes_input.md 展开完整讲解「Bytes 字节流输入」这条extract调用链如何构造ExtractInput、如何以内存字节而非文件路径方式喂给提取引擎、如何读取mimeType与content等结果字段并对比 URI 输入与批量提取extractBatch两种扩展形态。读完本文你将能够在 PHP 项目中直接对上传的二进制文档如 PDF、图片、Office 文件执行无落盘的内容提取并理解其底层契约与测试验证方式。一、Bytes 输入提取是什么为什么需要它Xberg 的提取入口接收ExtractInput作为唯一输入描述。从仓库中的契约文档 api_extract_bytes_input.md 可以看到最核心的调用只有两行use Xberg\Xberg; use Xberg\ExtractInput; $input \Xberg\ExtractInput::from_json(json_encode([bytes pdf/fake_memo.pdf, filename fake_memo.pdf, kind bytes])); $result Xberg::extract($input, null);kind字段取值为bytes表示本次提取的输入是内存中的字节流而非磁盘路径或远程 URI。这在 Web 场景中非常实用用户上传文件后PHP 拿到的是$_FILES里的临时文件内容file_get_contents即可读出无需先落盘再交给提取引擎既省去了临时文件管理也避免了对服务器文件系统的依赖。对应的契约 fixture fixtures/contract/api_extract_bytes_input.json 给出了这个调用的完整「输入 断言」定义call为extractinput.kind为bytesinput.bytes是一段完整的 PDF 字节数组即测试文档fake_memo.pdfinput.filename为fake_memo.pdf断言要求results[0].mime_type等于application/pdf、results[0].content长度不小于 10且内容中包含May 5, 2023或Mallori。也就是说只要把二进制 PDF 以字节形式传入引擎就能自动识别格式、抽出正文文本并返回 MIME 类型——格式探测、解析、抽取全部在内部完成。二、ExtractInput 的字段解析与构造方式从契约文档与 fixture 可以归纳出 Bytes 输入下ExtractInput的核心字段字段取值含义与说明kindbytes输入形态标记告知引擎按字节流处理另见uri见下文第四节bytes字节数组文档的原始二进制内容。测试 harness 中以 JSON 数组形式给出实际 PHP 场景中可用file_get_contents()获得字符串后交由绑定层编码filename字符串逻辑文件名如fake_memo.pdf用于辅助格式识别与结果元数据mimeType字符串可选显式声明 MIME 类型如application/pdf不提供时引擎自动探测补充mimeType的写法在 extract/extract_bytes_input.md 中给出注意其命名空间形式\Xberg\ExtractInput::from_json(...)use Xberg\Xberg; use Xberg\ExtractInput; $input \Xberg\ExtractInput::from_json(json_encode([bytes pdf/fake_memo.pdf, filename fake_memo.pdf, kind bytes, mimeType application/pdf])); $result Xberg::extract($input, null); var_dump($result-getResults()[0]-mimeType); var_dump($result-getResults()[0]-content);这里有两个值得注意的细节from_json是绑定层提供的结构化构造入口PHP 侧用json_encode将关联数组转成 JSON 字符串再交给from_json反序列化为类型安全的ExtractInput对象避免手写繁琐的属性赋值。这是契约 fixture 与 e2e 测试统一使用的构造方式。Xberg::extract的第二参数传null表示使用默认配置在快速验证场景中可以直接传null需要精细化控制时则传入ExtractionConfig对象见第四节批量示例。fixture extract/extract_bytes_input.json 与 contract 版本略有差异它额外携带mime_type: application/pdf顶层字段断言改为not_error、mime_type精确匹配与content长度不小于 50。这说明「带上明确的 MIME 声明」同样是一条被 e2e 覆盖的合法路径可减少格式探测的不确定性。三、读取提取结果getResults 与核心字段Xberg::extract返回的是包含一组结果的输出对象通过getResults()[0]取得第一个文档结果。契约文档演示了最常用的两个字段var_dump($result-getResults()[0]-mimeType); var_dump($result-getResults()[0]-content);mimeType识别出的文档 MIME 类型如application/pdf。该字段在 fixture 断言中被精确校验是验证输入是否正确被识别的最直接信号content抽取出的正文文本。contract fixture 断言其长度不小于 10 且包含关键内容May 5, 2023或Mallori确保的不是「返回了非空字符串」而是「抽取到了真实文档内容」。从 packages/php/README.md 的 Quick Start 可以进一步看到结果对象携带的更多能力$result-content正文、$result-metadata?-title标题、$result-metadata?-authors作者、$result-metadata?-pdf?-page_countPDF 页数、$result-mimeType格式以及$result-tables表格数组含pageNumber与markdown渲染。也就是说Bytes 输入与 URI/路径输入的返回结构完全一致——提取引擎对输入形态透明结果永远是统一的ExtractedDocument。?php declare(strict_types1); require_once __DIR__ . /vendor/autoload.php; $output \Xberg\XbergApi::extract(\Xberg\ExtractInput::fromUri(document.pdf), $config ?? \Xberg\ExtractionConfig::default()); $result $output-getResults()[0]; echo Extracted Content:\n; echo \n; echo $result-content . \n\n; echo Metadata:\n; echo \n; echo Title: . ($result-metadata?-title ?? N/A) . \n; echo Authors: . (isset($result-metadata?-authors) ? implode(, , $result-metadata?-authors) : N/A) . \n; echo Pages: . ($result-metadata?-pdf?-page_count ?? N/A) . \n; echo Format: . $result-mimeType . \n\n;这段示例还揭示了一个 API 形态细节绑定同时提供Xberg静态门面与XbergApi门面两种调用方式契约 fixture 使用Xberg::extract($input, null)而 README 中的面向对象示例使用\Xberg\XbergApi::extract(...)二者指向同一套提取语义可按项目风格选用。四、与其他输入形态对比URI 与批量提取Bytes 并不是唯一的输入形态。契约文档目录下并存的 api_extract_uri.md 展示了kind uri的写法use Xberg\Xberg; use Xberg\ExtractInput; $input \Xberg\ExtractInput::from_json(json_encode([kind uri, uri https://example.com/pdf/fake_memo.pdf])); $result Xberg::extract($input, null); var_dump($result-getResults()[0]-content);区别一目了然Bytes 形态传bytesfilenameURI 形态传uri。前者适合内存数据上传文件、缓存内容后者适合由引擎直接拉取的远程资源注意该 fixture 的side_effect标记为server而 Bytes 版本的side_effect是safe——不发起到外部网络的副作用。生产代码中用ExtractInput::fromUri(...)与ExtractInput::fromBytes(file_get_contents(...), text/plain, note.txt)这两条便捷构造器即可分别表达两种形态。当需要一次处理多个文档时契约文档提供了批量入口extractBatch见 api_extract_batch_bytes.md其字节输入写法与单条extract完全同构并显式传入ExtractionConfiguse Xberg\Xberg; use Xberg\ExtractInput; use Xberg\ExtractionConfig; $result Xberg::extractBatch([ExtractInput::from_json({bytes:pdf/fake_memo.pdf,filename:fake_memo.pdf,kind:bytes})], \Xberg\ExtractionConfig::from_json({})); var_dump($result-getResults()[0]-mimeType); var_dump($result-getResults()[0]-content);注意三点差异参数由单个ExtractInput变为数组第二个参数由null变为\Xberg\ExtractionConfig::from_json({})空配置对象等价于默认配置的显式形式返回对象同样通过getResults()取结果数组其summary-results字段README 批量示例可见可报告处理文档总数。README 中的完整批量用法为?php declare(strict_types1); require_once __DIR__ . /vendor/autoload.php; use Xberg\Xberg; use Xberg\ExtractInput; use Xberg\ExtractionConfig; $inputs [ ExtractInput::fromUri(document1.pdf), ExtractInput::fromUri(document2.docx), ExtractInput::fromBytes(file_get_contents(note.txt) ?: , text/plain, note.txt), ]; $config new ExtractionConfig( extractTables: true, extractImages: false, ); $output Xberg::extractBatch($inputs, $config); echo Processed {$output-summary-results} documents\n; foreach ($output-getResults() as $result) { echo Content: . strlen($result-content) . chars\n; echo Tables: . count($result-tables) . \n; echo MIME: {$result-mimeType}\n\n; }这里ExtractInput::fromBytes($bytes, $mimeType, $filename)正是「Bytes 输入」的面向对象便捷构造器——三个参数恰好对应契约字段bytes、mimeType、filenamekind由绑定层自动补齐为bytes。五、底层实现与契约来源Rust 引擎 绑定桥Bytes 输入之所以能在 PHP 侧保持如此精简是因为真正的解析与抽取全部发生在 Rust 核心中。PHP 绑定通过绑定桥把ExtractInput/ExtractionConfig序列化后传递给共享的 Rust 实现——packages/php/README.md 明确指出「Same engine as every binding」Rust、Python、Node.js、Go、Java、PHP、Ruby、.NET、Elixir、WASM 等 15 种绑定共享同一套实现。从源码结构还可以印证插件的契约边界 packages/php/src/DocumentExtractor.php 定义了DocumentExtractor插件接口其extract(ExtractInput $input, ExtractionConfig $config): ExtractedDocument与supported_mime_types(): mixed两个方法说明自定义提取器/后处理器同样以ExtractInput作为输入描述、以ExtractedDocument作为返回类型——与内置引擎的输入输出模型完全对齐。值得说明的是契约文档位于docs-site/src/snippets-generated/php/contract/其文件头注明由 alef 工具自动生成This file is auto-generated by alef是对应 fixture JSON 的「可读 可执行」投影。因此这条extract调用链有三重保障fixture 定义fixtures/contract/api_extract_bytes_input.json给出精确断言snippet 文档api_extract_bytes_input.md给出可直接复制的 PHP 代码e2e 测试如 e2e/php/tests/ContractTest.php在真实绑定上执行同一调用并校验断言保证文档与实现不脱节。六、边界情况与错误处理字节输入虽然简单但输入描述的正确性同样会被契约校验。仓库fixtures/error/目录下与 Bytes 输入直接相关的三个错误场景值得在生产代码中提前防御error_empty_bytes.jsonbytes为空时引擎应返回错误而非静默产出空结果error_empty_mime.json在显式要求 MIME 的路径下mimeType为空视为非法输入error_invalid_mime_format.jsonMIME 字符串格式非法如缺失/分隔同样触发错误分支。对应地在 PHP 中建议在调用Xberg::extract前先校验字节非空、文件名非空并在显式传mimeType时保证其符合type/subtype格式若依赖自动探测则filename中的扩展名是重要辅助信号如fake_memo.pdf之于application/pdf。七、完整可运行示例综合契约文档与 README给出一个从「读取上传字节」到「输出结果」的完整闭环示例?php declare(strict_types1); require_once __DIR__ . /vendor/autoload.php; use Xberg\Xberg; use Xberg\ExtractInput; // 1. 从磁盘读入字节Web 场景下等价于读取 $_FILES 上传内容 $pdfBytes file_get_contents(fake_memo.pdf); if ($pdfBytes false || $pdfBytes ) { throw new RuntimeException(empty bytes input); } // 2. 构造 Bytes 输入bytes filename kind $input \Xberg\ExtractInput::from_json(json_encode([ bytes $pdfBytes, filename fake_memo.pdf, kind bytes, ])); // 3. 调用提取第二参数传 null 使用默认配置 $result Xberg::extract($input, null); // 4. 读取结果 $doc $result-getResults()[0]; printf(MIME: %s\n, $doc-mimeType); printf(Content: %s\n, $doc-content);将bytes换成真实文件内容、filename换成实际文件名即可用于任意受支持格式PDF、DOCX、XLSX、PNG、HTML 等共 107 种格式。若需要批量或远程输入把第 3 步替换为Xberg::extractBatch([$input], \Xberg\ExtractionConfig::from_json({}))或改传kind uri即可。八、小结Bytes 输入是 Xberg PHP 绑定中最直接、最贴合 Web 上传场景的提取形态一个ExtractInput::from_json(...)构造输入一次Xberg::extract($input, null)完成提取getResults()[0]-mimeType与-content拿到结果。本文从契约文档出发依次剖析了kind/bytes/filename/mimeType四个字段、getResults结果读取、URI 与批量两种扩展形态并借助 fixtures/contract/api_extract_bytes_input.json 的断言、packages/php/README.md 的完整用法与 packages/php/src/DocumentExtractor.php 的接口定义将一条契约 snippet 还原成了可对照源码深入验证的完整技术路径。赞分享后端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 Dart 绑定实战从字节流bytes提取 PDF 文档内容Xberg Dart 绑定实战从字节流bytes提取 PDF 文档内容 本篇技术指南围绕 Xberg 开源仓库中的 Dart 绑定提取用例 extract后端AI 应用NLPxberg Go 绑定实战以原始字节bytes输入提取 PDF 文档内容xberg Go 绑定实战以原始字节bytes输入提取 PDF 文档内容 本文以 xberg 官方自动生成的 Go 代码示例 extract_bytes_后端AI 应用NLPxberg Dart 绑定实战使用 bytes 输入调用 extract 文档提取 APIxberg Dart 绑定实战使用 bytes 输入调用 extract 文档提取 API 本文围绕 xberg 的 Dart 语言绑定展开以 extrac后端AI 应用NLP上一篇Tesla Custom Integration 完整指南3步在 Home Assistant 中精准追踪车辆与 Powerwall 能源下一篇3步精通GitFS将Git仓库变成实时文件系统的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CentOS 安装 MongoDB 4.4 教程:用 TaoToken 统一 Key 打通 rpm 与 systemctl 全流程

CentOS 安装 MongoDB 4.4 教程:用 TaoToken 统一 Key 打通 rpm 与 systemctl 全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 4:01:11 阅读更多 →
机床“自愈”闭环:测量-反馈-补偿的落地路径

机床“自愈”闭环:测量-反馈-补偿的落地路径

机床「自愈」:测量-反馈-补偿闭环的落地路径把机床比作人,其实挺贴切。人受伤了会自愈,伤口结痂、长好,但机床不会——主轴热了会伸长,丝杠磨了会反向间隙变大,导轨磨损了定位精度会漂移。这些误差一旦产生…

2026/10/10 4:01:15 阅读更多 →
在线考试系统设计与实现:从数据库设计到防作弊的一站式方案

在线考试系统设计与实现:从数据库设计到防作弊的一站式方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 1:35:05 阅读更多 →

最新新闻

PLC动态加密功能块实战:S7-1200/1500程序防复制与授权管理

PLC动态加密功能块实战:S7-1200/1500程序防复制与授权管理

干自动化这些年,最扎心的场景不是现场调试到凌晨,而是设备刚交出去半年,就发现客户厂里多了一台和你做的设备一模一样的机器,运行逻辑连定时器参数都没改。S7-1200/1500 在国内项目里太常见,上载、反编译、复制项目的门…

2026/10/11 0:30:51 阅读更多 →
PCB缺陷数据集2700张:VOC与YOLO双格式标签使用与训练指南

PCB缺陷数据集2700张:VOC与YOLO双格式标签使用与训练指南

简介:本资源为面向PCB缺陷检测任务的图像数据集,适合从事工业质检、深度学习目标检测的开发者与研究人员使用,可用于训练与验证缺陷识别模型。数据集覆盖六类常见PCB缺陷,包括Missing_hole、Mouse_bite、Open_circuit、Short、Spu…

2026/10/11 0:28:50 阅读更多 →
炸裂!Codex 有皮肤了:Codex-Dream-Skin 上手攻略与 TaoToken 配置

炸裂!Codex 有皮肤了:Codex-Dream-Skin 上手攻略与 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 0:27:50 阅读更多 →
基于SpringBoot+Vue的疫苗预约系统设计与并发超卖防控

基于SpringBoot+Vue的疫苗预约系统设计与并发超卖防控

1. 疫苗发布与预约的业务场景和技术选型做接种预约系统这个项目,起源于一个很实在的现场问题:社区接种点每天的疫苗针剂数量有限,预约电话被打爆,纸质登记表翻起来费劲,还经常出现"约了不来"和"没约直接…

2026/10/11 0:27:50 阅读更多 →
Text-to-SQL Agent:语义校验、安全执行与结果解释三位一体

Text-to-SQL Agent:语义校验、安全执行与结果解释三位一体

1. 项目概述:Text-to-SQL Agent 不是“翻译器”,而是数据库操作的全流程协作者你有没有遇到过这样的场景:业务同学拿着一份销售报表需求,直接甩给你一句“把上季度华东区客单价超过500的复购用户拉出来,按城市排序”&a…

2026/10/11 0:27:50 阅读更多 →
Restic 0.19 增量备份实战:五步上手、快照策略清理与云端异地容灾(Windows 官方版实测)

Restic 0.19 增量备份实战:五步上手、快照策略清理与云端异地容灾(Windows 官方版实测)

Restic 0.19 增量备份实战:五步上手、快照策略清理与云端异地容灾(Windows 官方版实测) 备份工具的选型标准只有三条:增量要真增量、历史版本要可回溯、恢复要可靠。Restic(BSD-2 协议,Go 编写&#xff0c…

2026/10/11 0:25:49 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →