ARTICLE DETAIL

资讯详情

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

Xberg Elixir OCR 实战:用 Rust 核心对 PNG 图片进行文本提取

Xberg Elixir OCR 实战:用 Rust 核心对 PNG 图片进行文本提取 后端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 的 Elixir 绑定在图片 OCR 场景下的最小可运行方案以fixtures/images/test_hello_world.png为样例输入通过Xberg.ExtractInput构造 bytes 类型的提取请求调用Xberg.extract_async/2触发 Rust 核心中的 OCR 管线并从返回结果中取出识别文本。读完本文你将掌握 Elixir 环境下图片 OCR 的完整调用链、ExtractInput各字段的语义、OCR 配置含 Tesseract 引擎参数与多语言的写法以及如何用仓库自带的 e2e 测试验证提取结果。场景一个带 OCR 的 PNG 提取冒烟用例仓库中docs-site/src/snippets-generated/elixir/smoke/ocr_image_png.md定义了一个标准的 smoke fixtureOCR: PNG image extraction with OCR enabledOCR 开启状态下的 PNG 图片提取。它的目标非常明确——验证 Elixir 绑定能够接收 PNG 图片的原始字节而不是文件路径或 URI触发底层 OCR 引擎识别图片中的文字返回可被上层代码直接消费的提取结果results[0].content。该 fixture 的输入数据定义在 fixtures/smoke/ocr_image_png.json 中call为extractkind为bytes字节内容正是 fixtures/images/test_hello_world.png200x60 像素的 PNG 小图画面即 Hello, World! 字样。这意味着这是一个无外部依赖、可离线运行的自包含用例——不需要服务器、不需要网络很适合作为 OCR 功能的入门冒烟测试。环境准备在 mix 项目中接入 xberg 依赖OCR 能力来自同一套 Rust 实现核心Elixir 侧通过 Rustler NIF 封装。按 packages/elixir/README.md 的说明在mix.exs中加入依赖def deps do [ {:xberg, ~ 1.3.0} ] end安装后即可获得完整的Xberg模块。该模块的公开 API 由 alef 自动生成见 packages/elixir/lib/xberg.ex 顶部的 auto-generated by alef 标注其中与本场景直接相关的两个入口是Xberg.extract(opts \\ [])—— 接收 keyword list内部把:input与:config序列化为 JSON 后转发给 NIFXberg.extract_async(input_value, config)—— 直接接收ExtractInput结构体与 JSON 字符串配置fixture 中使用的形式。最小调用示例从 PNG 字节到识别文本fixture 原文给出的 Elixir 示例即是最小可运行版本input_value %Xberg.ExtractInput{bytes: :binary.bin_to_list(File.read!(images/test_hello_world.png)), config: %{}, filename: test_hello_world.png, kind: bytes, mime_type: image/png} result Xberg.extract_async(input_value, {}) IO.inspect(Enum.at(result.results, 0).content)逐行拆解便于理解每个字段为什么必须这样写File.read!(images/test_hello_world.png)以二进制形式读入图片:binary.bin_to_list/1把二进制转为整数列表——NIF 边界上 bytes 参数以整数列表传递这正是 WASM 场景下Uint8Arraybridge 参数的对应物%Xberg.ExtractInput{...}构造统一提取输入其字段语义见 packages/elixir/lib/xberg/extract_input.exkind: bytes声明输入为原始字节另一选项是uribytes:PNG 的字节列表mime_type: image/png显式告知核心按图片格式处理filename: test_hello_world.png保留原始文件名供格式嗅探与元数据使用config: %{}结构体层面的空配置Xberg.extract_async(input_value, {})第二参数是 JSON 字符串形式的配置{}表示全部使用默认配置——注意默认配置下OCR 是开启的因此空配置即可触发识别Enum.at(result.results, 0).content结果集results列表中第一个条目的content字段即提取出的 Markdown 文本。值得说明的是Xberg.ExtractInput实现了Jason.Encoder且序列化时会剔除值为nil的字段见 extract_input.ex所以未使用的字段不会污染请求同时kind的默认值是:uri构造 bytes 输入时必须显式传kind: bytes否则核心会按 URI 分支处理。用仓库 e2e 测试验证识别到了 Hello Worldfixture 并非孤立的文档示例它在仓库的 e2e 测试套件中有完全对应的落地实现。打开 e2e/elixir/test/smoke_test.exs 可以看到ocr_image_png测试用例describe ocr_image_png do test ocr_image_png do input_value %Xberg.ExtractInput{ bytes: :binary.bin_to_list(File.read!(images/test_hello_world.png)), config: %{}, filename: test_hello_world.png, kind: bytes, mime_type: image/png } {:ok, result} Xberg.extract(input: input_value, config: {}) assert Enum.at(result.results, 0).mime_type image/png assert (is_binary(Enum.at(result.results, 0).content) byte_size(Enum.at(result.results, 0).content) 1) || (is_list(Enum.at(result.results, 0).content) length(Enum.at(result.results, 0).content) 1) assert Enum.any?([Hello, World, hello, world], fn v - String.contains?(to_string(Enum.at(result.results, 0).content), v) end) end end这段测试给出了三个可复用的断言范式回答了OCR 到底成没成功这一核心问题断言目标写法含义格式回显result.results[0].mime_type image/png提取结果正确标注来源格式非空产出content为 binary 且byte_size 1或为 list 且length 1OCR 管线确实产出了文本而非空文档语义正确content包含Hello/World等关键词之一识别出的文字内容与图片画面一致前两条是通用冒烟标准第三条直接验证识别质量——test_hello_world.png上印刷的就是 Hello, World!OCR 结果必须命中这些词。这意味着读者完全可以照抄这套断言把它改造成自己图片 OCR 流水线的最小验收测试。深入 OCR 配置Tesseract 引擎参数与多语言fixture 用{}走默认配置但生产场景往往需要显式控制 OCR 行为。仓库中 docs-site/src/snippets-generated/elixir/ocr/ocr_multi_language.md 给出了开启多语言的配置写法input_value %Xberg.ExtractInput{kind: uri, mime_type: image/png, uri: https://example.com/images/test_hello_world.png} result Xberg.extract_async(input_value, {\ocr\:{\backend\:\tesseract\,\enabled\:true,\language\:[\eng\,\deu\,\fra\]}}) IO.inspect(Enum.at(result.results, 0).content)配置项逐项解读ocrOCR 功能段enabled: true显式开启默认即开启backend: tesseract指定引擎后端。仓库支持的 OCR 选项在 packages/elixir/README.md 中列明Tesseract、PaddleOCR、Candle支持的构建下、通过 liter-llm 的 VLM OCR以及插件钩子注册的自定义后端language: [eng, deu, fra]多语言代码列表Tesseract 内部会以连接为engdeufra交给引擎。如果你需要更细粒度的引擎控制Rust 侧公开的TesseractConfig结构定义于 crates/xberg/src/types/formats.rs暴露了完整参数面它们同样可以通过ocr配置段的 JSON 传入字段默认值说明language[eng]识别语言代码列表配置文件中也可接受单个字符串如engdeupsmNone由管线按上下文选择页面分割模式 1–133全自动分割、6单一文本块、11稀疏文本无顺序。0OSD_ONLY被拒绝因为只做方向/文字检测而不产生识别结果output_formatmarkdown输出text或markdownoem3OCR 引擎模式0仅 Legacy、1仅 LSTM 神经网络、2两者、3默认min_confidence0.0最低置信度阈值0.0–100.0低于该值的词可能被剔除或标记enable_table_detectiontrue自动表格检测与重建开关use_cachetrueOCR 结果缓存开关见 crates/xberg/src/ocr/cache.rs 的OcrCache实现preprocessingNone图像预处理配置对扫描件/低质量图片有明显收益一个实际可用的显式配置示例单语言、Markdown 输出、稀疏文本模式config_json Jason.encode!(%{ ocr %{ backend tesseract, enabled true, language [eng], tesseract_config %{ psm 11, output_format markdown, oem 1 } } }) input_value %Xberg.ExtractInput{ bytes: :binary.bin_to_list(File.read!(images/test_hello_world.png)), kind: bytes, mime_type: image/png, filename: test_hello_world.png } {:ok, result} Xberg.extract(input: input_value, config: config_json) IO.inspect(Enum.at(result.results, 0).content)底层原理一次 PNG OCR 请求的 Rust 调用链从源码结构看Elixir 侧的Xberg.extract_async/2只是 NIF 边界Xberg.Native.extract_async真正的 OCR 逻辑全部在 Rust 核心中完成。梳理 crates/xberg/src/ocr 目录可以还原这条调用链输入归一化核心把kind: bytesmime_type: image/png的输入路由到图片提取器extractors::image图片不属于 PDF 等可内嵌 OCR 的复合格式因此走独立图片 OCR分支处理器入口OcrProcessorcrates/xberg/src/ocr/processor/mod.rs暴露process_image/process_image_with_format/process_image_file等方法族负责把图像字节交给具体后端后端实现以 Tesseract 为例TesseractBackend::process_image(self, image_bytes: [u8], config: OcrConfig)crates/xberg/src/ocr/tesseract_backend.rs是引擎级实现WASM 环境则对应tesseract_wasm_backend.rs的同名方法crates/xberg/src/ocr/tesseract_wasm_backend.rs缓存与批处理execution.rs中的process_image_with_cache/process_image_files_batchcrates/xberg/src/ocr/processor/execution.rs在带缓存与批量场景下组织执行——这解释了use_cache配置项为何存在结果落点OCR 产出转换为ExtractedDocument进而映射为返回结构中的results[0]其content、mime_type等字段正是 Elixir 侧断言读取的位置相关类型见 crates/xberg/src/types/formats.rs 的OcrExtractionResult。这条链路同时解释了 fixture 描述中WASM 下锻炼Uint8Arraybridge 参数与生成的OcrBackendbridge 中 Promise await的由来bytes 在 Rust/Elixir 边界表现为整数列表在 Rust/WASM 边界表现为Uint8Array而生成的OcrBackendbridge对应 packages/elixir/lib/xberg.ex 中Xberg.OcrBackend.Host的process_image(binary(), map())回调在 WASM 端需要以异步 Promise 方式等待识别完成。因此这个看似简单的 smoke fixture实际上横跨了三种运行时BEAM、原生、WASM的桥接路径。结果消费content 与其他可用字段提取完成后result.results是一个列表本用例固定只有一个元素单张图片输入但保持Enum.at(result.results, 0)的索引写法可以在将来扩展到批量输入时无缝兼容。results[0]上至少可以直接读取content—— OCR 识别出的文本默认以 Markdown 呈现mime_type—— 来源格式测试中用于断言image/png由OcrExtractionResult携带的其余结构化信息如表格结果OcrTable、置信度相关元数据见 crates/xberg/src/types/formats.rs。Xberg.extract/1返回{:ok, map()} | {:error, atom, String.t()}见 xberg.ex 的类型规格生产代码建议用模式匹配处理错误分支而不是像 smoke fixture 那样直接取字段。小结与延伸从一份不足 20 行的 fixture 出发我们完整走通了 Xberg Elixir 图片 OCR 的全链路ExtractInput的 bytes 构造 →extract/extract_async调用 → Rust 核心的OcrProcessor→ Tesseract 后端识别 →results[0].content消费并用 e2e/elixir/test/smoke_test.exs 的断言范式验证了输出质量。想继续深入可以沿着两条路径展开一是把{}换成带tesseract_config的多语言/预处理配置针对扫描件、表格、低分辨率图片调优配置参考 crates/xberg/src/types/formats.rs二是对照 docs-site/src/snippets-generated/elixir/ocr 目录下的ocr_force_all_pages、ocr_multi_language、ocr_paddle_backend、vlm_ocr等兄弟 fixture探索 PDF 整页 OCR、PaddleOCR 与 VLM OCR 后端等更多能力。赞分享后端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 C 绑定基础 OCR 配置实战用 Tesseract 从 PNG 图片提取文本Xberg C 绑定基础 OCR 配置实战用 Tesseract 从 PNG 图片提取文本 本篇技术指南聚焦 Xberg 文档智能库在 C 绑定Xberg.后端AI 应用NLPxberg C FFI 实战用 C 语言对 PNG 图片执行 OCR 提取的完整流程xberg C FFI 实战用 C 语言对 PNG 图片执行 OCR 提取的完整流程 xberg 是一个以 Rust 为核心的多语言文档智能引擎其 C FF后端AI 应用NLPXberg Dart 绑定 OCR 实战从 PNG 图片提取文本的完整调用链解析Xberg Dart 绑定 OCR 实战从 PNG 图片提取文本的完整调用链解析 本文以 Xberg 仓库中的 Dart 语言 OCR 冒烟样例 docs后端AI 应用NLP上一篇MDClub一款开源社区系统的详细介绍下一篇开源项目推荐基于Laravel的论坛系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表