ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

使用 Xberg Dart 绑定提取 PDF 文本:基于 smoke_pdf_basic 冒烟测试的完整实战指南

使用 Xberg Dart 绑定提取 PDF 文本:基于 smoke_pdf_basic 冒烟测试的完整实战指南 后端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 语言冒烟测试片段smoke_pdf_basic展开讲解如何通过xberg的 Dart 包flutter_rust_bridge 生成对 PDF 文档执行基础文本抽取从RustLib.init()初始化、JSON 构造输入与配置、调用XbergBridge.extract到输出结果的完整调用链。读完本文你将掌握在 Dart / Flutter 项目中接入 Xberg 抽取引擎的最小可用方案并能对照仓库中的 e2e 测试与 fixture 定义理解其底层验证逻辑。一、smoke_pdf_basic 是什么smoke_pdf_basic是 Xberg 仓库 e2e 测试体系中的一个冒烟测试smoke test其目标文档位于 docs-site/src/snippets-generated/dart/smoke/smoke_pdf_basic.md。该片段由 alef仓库的 polyglot binding 生成器自动生成文件头的 front matter 记录了它的元信息字段值含义idfixture_dart_smoke_pdf_basic全局唯一测试标识language/targetdart面向 Dart 语言绑定leveltypecheck验证级别为类型检查 运行requires[]无前置依赖side_effectserver测试需要 mock server 提供远端 PDF测试的断言目标非常直观对一个仅含简单文本的 PDFfake_memo.pdf通过 URI 输入执行抽取验证返回结果的 MIME 类型为application/pdf、文本内容非空并包含文档中的关键字符串。二、核心代码逐段拆解冒烟测试的 Dart 代码完整如下原样继承自关联文档import dart:io; import package:xberg/xberg.dart; import package:xberg/src/xberg_bridge_generated/frb_generated.dart show RustLib; Futurevoid main() async { await RustLib.init(); try { final input await createExtractInputFromJson(json: {kind:uri,mime_type:application/pdf,uri:https://example.com/pdf/fake_memo.pdf}); final config await createExtractionConfigFromJson(json: {}); final result await XbergBridge.extract(input, config: config); stdout.writeln(result.results[0].mimeType); stdout.writeln(result.results[0].content); } finally { RustLib.dispose(); } }2.1 初始化与释放RustLib.init / RustLib.disposeRustLib来自 flutter_rust_bridge 生成的内部桥接文件frb_generated.dart是所有 Dart ↔ Rust 调用的入口。RustLib.init()负责加载原生动态库并建立桥接环境RustLib.dispose()负责释放资源代码用try ... finally保证异常路径下也能正确释放这是接入原生绑定时的标准模式。完整的 e2e 测试文件 e2e/dart/test/smoke_test.dart 中同样遵循await RustLib.init()于setUpAll、RustLib.dispose()于tearDownAll的生命周期管理。2.2 构造输入createExtractInputFromJsoncreateExtractInputFromJson由 flutter_rust_bridge 生成定义在 packages/dart/lib/src/xberg_bridge_generated/lib.dart。它接受一段 JSON 字符串并返回ExtractInput数据类。冒烟测试使用的输入 JSON{ kind: uri, mime_type: application/pdf, uri: https://example.com/pdf/fake_memo.pdf }三个字段的含义kind输入类型。取值为uri通过 URL 拉取文档或bytes直接内嵌文件字节数组。mime_type声明文档的 MIME 类型此处为application/pdf。为空白时引擎会尝试自动探测mime_detection_policy相关逻辑但显式声明更稳妥。uri文档的远程地址。冒烟测试场景下由 mock server 提供该地址实际返回fake_memo.pdf文件内容。2.3 构造配置createExtractionConfigFromJsonfinal config await createExtractionConfigFromJson(json: {});ExtractionConfig是生成的数据类且没有默认值见 packages/dart/README.md 的说明因此必须通过 JSON 构造省略的字段会保留 Rust 侧的默认配置。{}表示完全采用引擎默认行为对纯文本型 PDF 已足够。若需要 OCR、分块、关键词等能力可以在 JSON 中补充字段例如{ force_ocr: true, ocr: { backend: tesseract, language: [eng] } }2.4 执行抽取XbergBridge.extractXbergBridge是 Dart 包的统一门面定义在 packages/dart/lib/src/xberg.dartstatic FutureExtractionResult extract(ExtractInput input, {ExtractionConfig? config}) async { return await rust_bridge.extract(input: input, config: config ?? await createExtractionConfigFromJson(json: {})); }注意两个细节config是可选命名参数不传时自动使用{}默认配置真正的桥接函数位于生成层lib.dart中RustLib.instance.api.crateExtract(...)最终落到 Rust 核心引擎。返回的ExtractionResult包含results列表每个results[i]对应一份ExtractedDocument冒烟测试只读取了results[0].mimeType与results[0].content。2.5 输出结果stdout.writeln(result.results[0].mimeType); stdout.writeln(result.results[0].content);第一行输出抽取结果声明的 MIME 类型第二行输出抽取出的正文文本。针对fake_memo.pdf正文中应包含日期May 5, 2023与抬头To Whom it May Concern等字样。三、底层验证逻辑fixture 与 e2e 测试冒烟测试并非凭空运行其行为契约定义在 fixture 文件 fixtures/smoke/pdf_basic.json 中{ id: smoke_pdf_basic, input: { mock_responses: [ { path: /pdf/fake_memo.pdf, status_code: 200, headers: { content-type: application/octet-stream }, body_file: ../test_documents/pdf/fake_memo.pdf } ], extract_input: { kind: uri, uri: $mock_url/pdf/fake_memo.pdf, mime_type: application/pdf } }, assertions: [ { type: equals, field: results[0].mime_type, value: application/pdf }, { type: min_length, field: results[0].content, value: 50 }, { type: contains_any, field: results[0].content, values: [May 5, 2023, To Whom it May Concern] } ] }它揭示了三条关键信息mock server 机制side_effect: server表明测试运行前会启动仓库的 mock server路径映射在 e2e/dart/test/e2e_helpers.dart 中实现优先使用MOCK_SERVER_URL环境变量否则编译并拉起e2e/rust的mock-server二进制以fixtures目录为数据根把/pdf/fake_memo.pdf映射到测试文档文件。断言契约MIME 必须等于application/pdf内容长度不小于 50内容必须命中两个代表性字符串之一——这验证了简单文本 PDF 能被正确抽取成可读文本这一冒烟目标。同样约定在 Rust 侧 e2ee2e/dart/test/smoke_test.dart中Smoke test: PDF with simple text extraction用例约 L237-L255将$mock_url替换为 fixture URL 后执行相同断言与生成的 snippets 互为印证。四、从 URI 到 Bytes输入方式的扩展冒烟测试演示了kind: uri但同样面向 PDF 的 bytes 输入在仓库中也有完备实践见 fixtures/extract/extract_bytes_input.json其extract_input携带filename: fake_memo.pdf、kind: bytes、mime_type: application/pdf以及 e2e/dart/test/extract_test.dart 的extract bytes input from PDF document用例。bytes 输入的关键区别是把文件内容以十进制字节数组内嵌进 JSON适合本地文件、内存数据等无法通过 URL 访问的场景{ bytes: [37, 80, 68, 70, 45, 49, 46, 51, 10, ...], filename: fake_memo.pdf, kind: bytes, mime_type: application/pdf }若需要在 Dart 侧读取本地文件再抽取可参考ExtractInputKind.bytes结合File.readAsBytes()构造而 URI 输入则保持kind: ExtractInputKind.uri的常量构造方式见 README Quick Start。五、Dart 绑定全景与使用前提5.1 包结构与安装Dart 绑定代码位于 packages/dart结构如下lib/xberg.dart对外入口重新导出桥接层与 trait 定义。lib/src/xberg.dartXbergBridge门面类封装extract/extractBatch/mapUrl等静态方法。lib/src/xberg_bridge_generated/flutter_rust_bridge 生成的桥接代码lib.dart、frb_generated*.dart、lib.freezed.dart。lib/src/traits.darttrait 桥接定义OCR / embedding / reranker 等插件接口。安装方式见 packages/dart/README.mddart pub add xberg # 纯 Dart 项目 flutter pub add xberg # Flutter 项目依赖要求Dart SDK 3.0Flutter 支持 macOS、iOS、Android、Linux、Windows不支持 Flutter Web原生运行时由 flutter_rust_bridge 以捆绑二进制形式提供。e2e 测试自身的依赖配置见 e2e/dart/pubspec.yamlxberg以path: ../../packages/dart本地引用并额外依赖ffi与test。5.2 冒烟测试的运行环境约定运行该冒烟测试需要满足两点一是能加载 Dart 绑定的原生库RustLib.init()成功二是测试中使用的https://example.com/pdf/fake_memo.pdf在真实运行中由 mock server 或等价 HTTP 服务替换e2e 测试通过_fixtureUrl(smoke_pdf_basic)解析出可访问地址。这意味着直接把片段中的 example.com 地址换成你自己的 PDF 链接即可用于真实业务——这是冒烟片段最小可运行样例的意义所在。六、从冒烟到实战配置化抽取与批量处理冒烟测试只是起点。基于同一套 API可以平滑扩展到更复杂的抽取需求带 OCR 的扫描件抽取final config await createExtractionConfigFromJson(json: { force_ocr: true, ocr: { backend: tesseract, language: [eng] } } ); const input ExtractInput(kind: ExtractInputKind.uri, uri: scanned.pdf); final output await XbergBridge.extract(input, config: config); print(output.results.first.content);批量处理多文档final inputs [ const ExtractInput(kind: ExtractInputKind.uri, uri: report.pdf), const ExtractInput(kind: ExtractInputKind.uri, uri: notes.txt), ]; final output await XbergBridge.extractBatch(inputs); for (final result in output.results) { print(result.content); }XbergBridge.extractBatch在 packages/dart/lib/src/xberg.dart 中定义底层同样是RustLib.instance.api.crateExtractBatch(...)由 Rust 核心并行处理多输入。七、小结smoke_pdf_basic虽名为冒烟却完整覆盖了 Dart 绑定接入 Xberg 抽取引擎的全部关键环节初始化桥接运行时、用 JSON 构造ExtractInput与ExtractionConfig、经XbergBridge.extract单次调用完成 PDF 文本抽取、以及从results[0].mimeType/results[0].content读取结果。它的 e2e 与 fixture 实现e2e/dart/test/smoke_test.dart、fixtures/smoke/pdf_basic.json为这条调用链提供了可重复验证的契约MIME 类型正确、内容非空且包含源文档关键文本。掌握这一模式后你可以将其直接推广到 OCR、批量抽取、结构化输出等更高阶场景把 100 种格式的文档智能抽取能力引入自己的 Dart / Flutter 应用。赞分享后端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 绑定 JSON 文档提取smoke_json_basic 冒烟测试逐行解析Xberg Dart 绑定 JSON 文档提取smoke_json_basic 冒烟测试逐行解析 本指南围绕 Xberg 仓库中的 Dart 冒烟测试片段 s后端AI 应用NLPxberg C 绑定冒烟实战用 FFI 接口五步完成 PDF 基础文本提取xberg C 绑定冒烟实战用 FFI 接口五步完成 PDF 基础文本提取 本文以仓库官方冒烟样例 smoke_pdf_basic.md https://li后端AI 应用NLP使用 Xberg C 绑定提取 PDF 文本ExtractAsync 完整实战指南使用 Xberg C 绑定提取 PDF 文本ExtractAsync 完整实战指南 本文围绕 Xberg 官方 C 绑定中“独立 PDF 文本提取Stand后端AI 应用NLP上一篇Forem 调查问卷重提交Survey Resubmission功能深度解析allow_resubmission 字段、会话机制与前后端实现下一篇解决attention_sinks项目的终极指南10个常见问题快速修复方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表