ARTICLE DETAIL

资讯详情

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

MuPDF Structured Text Options 完全指南:stext 结构化文本提取的每个开关与源码解析

MuPDF Structured Text Options 完全指南:stext 结构化文本提取的每个开关与源码解析 图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载MuPDF 的结构化文本Structured Text简称 stext提取引擎负责把 PDF、XPS、EPUB 等文档页面转换成可编程处理的结构化数据。本文以 stext-options.md 为核心系统讲解全部 22 个 stext 选项的含义、使用语法与底层实现并展示如何在mutool convert、mutool grep等命令行工具和 C API 中组合使用帮助你按需控制文本提取的还原度、精度与结构化程度。读完本文你将掌握如何用一条选项字符串控制连字展开、空白归一化、连字符拼接、ActualText 替换、字符包围盒精度、样式探测伪粗体/下划线/删除线、矢量收集、页面切分与表格探测等行为并能从 stext-device.c 的源码层面理解每个开关的生效路径。什么是 Structured Text OptionsMuPDF 在fitz层提供了fz_stext_page这一结构化文本模型文本被组织为 block → line → span → char 的层次结构同时可容纳 image、structure、vector 与 grid 等块类型见 structured-text.h 中的FZ_STEXT_BLOCK_TEXT/IMAGE/STRUCT/VECTOR/GRID枚举。从页面生成这一结构时可以通过一组键值对选项控制提取策略这些选项统称为 Structured Text Options。在 C 接口中它们体现在fz_stext_options结构体上typedef struct fz_stext_options { int flags; /* 位标志对应下方 FZ_STEXT_* 枚举 */ float scale; /* 由 resolution 选项换算的比例 */ fz_rect clip; /* clip-rect 指定的裁剪矩形 */ fz_table_hunt_options table_hunt_options; /* 表格探测选项 */ } fz_stext_options;结构体定义见 structured-text.h。其中flags是核心每个布尔选项对应一个位标志最终在fz_new_stext_device创建设备时被消费决定文本流水线中每一步的行为。选项字符串的三种书写语法所有 stext 选项都通过一个键值对字符串传入其通用语法由 option-strings.md 定义支持三种等价写法1. 逗号分隔经典语法preserve-images,accurate-bboxes,dehyphenate值可加双引号以嵌入逗号和等号双引号本身用连续两个双引号转义。2. URL 查询字符串以?开头时按 URL 查询语法解析特殊字符用%HH十六进制转义?preserve-imagestrueaccurate-bboxestruedehyphenatetrue3. JSON 子集单个 JSON 对象仅含布尔值、数字、字符串与数字数组{preserve-images:true,accurate-bboxes:true,dehyphenate:true}布尔值支持true/yes/on/enable/1与false/no/off/disable/0多种写法空值视为 true。这意味着dehyphenate与dehyphenatetrue等价。解析器实现在fz_apply_stext_optionsstext-device.c它通过fz_lookup_option_boolean/fz_lookup_option/fz_lookup_option_float逐一读取键并用SETCLEARBOOL宏设置或清除对应位标志。全部选项参考1. 文本还原与归一化选项默认作用preserve-ligatures关保留连字ligature原样输出关闭时展开为组成字符如ffi连字展开为 f、f、i 三个字符preserve-whitespace关保留原始空白字符关闭时所有水平空白含制表符归一化为变宽空格preserve-spans关同一行内的 span 不合并开启后每行保持同字体、同颜色、同字号的 span 粒度inhibit-spaces关不在字符间的大空隙处补加缺失空格dehyphenate关行尾连字符记录为软连字符扁平化输出时软连字符导致相邻行被连接实现断词合并ignore-actualtext关不做 ActualText 替换开启后文本保留文档原始内容忽略 PDF 的 ActualText 标记关键原理preserve-ligatures与preserve-whitespace的语义在 structured-text.h 的注释中有权威描述——连字展开对 CJK 排版和西文印刷体提取影响显著空白归一化则保证输出到纯文本/HTML 时字符流干净可搜索。dehyphenate通过软连字符机制工作提取时把行尾连字符标记为软连字符在fz_stext_page被扁平化flatten成文本流时才真正决定是否把两行拼接因而原始提取与最终输出解耦非常适合英文 PDF 断词恢复。2. 未知 Unicode 的字符回退选项作用use-cid-for-unknown-unicodeUnicode 映射失败时用字符的 CID字符标识符填充 unicode 字段并在 char flags 中置FZ_STEXT_UNICODE_IS_CIDuse-gid-for-unknown-unicode同上但回退到字形索引 GID置FZ_STEXT_UNICODE_IS_GID这两项解决提取出的字符没有标准 Unicode 码点的场景如自定义编码字体、符号字体。源码注释明确警告同时开启两者是未定义行为见 structured-text.h实际使用时必须二选一。返回的 CID/GID 可通过 flags 位区分来源便于下游做字体级映射。3. 精度类选项包围盒、升降部、字距选项作用accurate-bboxes字符包围盒从字形轮廓精确计算而非使用字体度量近似accurate-ascenders升降部ascender/descender从字体字形计算accurate-side-bearings扩展字符包围盒使其完全包含字形宽度三者都会引入额外的字形解析开销适合需要逐字定位如高亮、批注、坐标检索的场景。注意精度选项与clip协同工作裁剪判断依赖字符包围盒accurate-bboxes可让裁剪边界更贴合真实字形。4. 样式探测与结构收集选项作用collect-styles尝试检测文本特征伪粗体fake bold、删除线、下划线、高亮、描边/填充等structured收集 begin/end_structure 调用指定的结构标记开启后 stext 从block 列表变成需要深度优先遍历的树collect-styles的实现值得关注fz_stext_device中维护了一个rect_details列表stext-device.c处理页面的矢量矩形时通过check_for_strikeout等函数stext-device.c比对矩形与字符包围盒从而识别删除线/下划线等装饰检测结果写入字符 flagsFZ_STEXT_STRIKEOUT、FZ_STEXT_UNDERLINE、FZ_STEXT_BOLD等见 structured-text.h。structured开启后提取结果不再是线性 block 列表而是结构树mutool convert输出的 XML/JSON 会呈现文档的逻辑结构层级。5. 裁剪控制选项作用clip忽略被当前裁剪路径完全裁剪掉的字符图像包围盒也相应缩小。由于裁剪路径必然不大于页面 MediaBox该选项已取代旧的mediabox-clipclip-rectx0:y0:x1:y1只收集指定矩形坐标用冒号分隔的四元组内的内容用于提取页面特定区域clip-rect解析代码stext-device.c要求值必须能解析为合法矩形x0:y0:x1:y1成功后置FZ_STEXT_CLIP_RECT标志并把矩形存入opts-clip。遗留的mediabox-clip仍被接受但会打印弃用警告并映射到clipstext-device.c。6. 矢量收集选项作用vectors收集矢量图形的 bbox 信息主要用于切分分析lazy-vectors把矢量延迟到所在文本行之后输出避免删除线、音标/重音符号打断文本流fuzzy-vectors把同色、相邻的矩形矢量模糊合并识别用像素条拼出的字形效果同时避免存储与处理开销爆炸lazy-vectors的源码实现体现在fz_stext_device的lazy_vectors/lazy_vectors_tail字段stext-device.c——收集到的矢量先挂到延迟链表行处理完毕后才合并进正文输出这正是删除线不打断行流的原理。7. 页面级分析选项作用segment尝试把页面切分为不同区域对已含结构信息的页面刻意不做任何处理table-hunt在已切分的页面上探测表格把候选表格细节插入 stext 供调用方解释在切分页面上效果最佳paragraph-break在疑似段落边界处断开文本块仅对从左到右、自上而下的段落有效在切分页面上效果最佳segment的算法目标在 structured-text.h 的注释中有说明本质是反复尝试把页面横向/纵向递归切成越来越小的段尽量最小化内容重排。三个页面级选项彼此配合segment→table-hunt→paragraph-break是提取复杂版面的推荐链路。命令行实战在 mutool 中使用 stext 选项mutool convert提取结构化文本mutool convert支持文本类输出格式text / html / xhtml / stext见 muconvert.c通过-O传入输出格式选项muconvert.c# 输出结构化文本 XML保留图片、精确包围盒、探测样式 mutool convert -F stext -O preserve-images,accurate-bboxes,collect-styles -o out.xml input.pdf # 输出结构化文本 JSON并尝试段落切分与表格探测 mutool convert -F stext -O segment,table-hunt,paragraph-break -o out.json input.pdf # 只提取页面左上角 200x200 区域内的文字普通文本输出 mutool convert -F text -O clip-rect0:0:200:200 -o out.txt input.pdf # 恢复英文断词并抑制空白归一化 mutool convert -F text -O dehyphenate,preserve-whitespace -o out.txt input.pdf-F stext强制结构化文本输出配合 stdout 输出时必须显式指定因为文件后缀才能推断格式。mutool grep带提取选项的全文搜索mutool grep通过-O接收 stext 选项见 mutool-grep.md 与 mugrep.c选项经fz_parse_stext_options解析后应用于fz_new_stext_page_from_page_numbermugrep.c。例如对断词 PDF 执行不区分大小写搜索时dehyphenate能让跨行断开的词被正确匹配# 连字展开 断词合并然后忽略大小写搜索 fixture mutool grep -i -O dehyphenate fixture input.pdf注意-S控制的是搜索选项见 search-options.md-O才控制提取选项两者职责分离。mutool draw渲染与文本混合输出mutool draw的文本输出路径同样接收 stext 选项在 mudraw.c 中HTML 输出默认开启FZ_STEXT_CLIPXML/JSON 结构化输出则追加FZ_STEXT_ACCURATE_BBOXES、FZ_STEXT_COLLECT_STYLES最后通过fz_apply_stext_options合并用户传入的-O选项。这说明同一套选项语义在 convert / draw / grep 三个工具间完全一致。C API 用法三步接入 stext 选项在应用程序中标准用法是初始化 → 解析选项字符串 → 创建页面#include mupdf/fitz.h fz_context *ctx fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED); fz_document *doc fz_open_document(ctx, input.pdf); /* 1. 初始化默认选项 */ fz_stext_options opts; fz_init_stext_options(ctx, opts); /* 2. 从选项字符串解析内部会再次初始化结构体 */ fz_parse_stext_options(ctx, opts, preserve-images,accurate-bboxes,dehyphenate); /* 3. 按选项生成结构化文本页 */ fz_stext_page *page fz_new_stext_page_from_page_number(ctx, doc, 0, opts); /* ... 遍历 page 的 block/line/span/char ... */ fz_drop_stext_page(ctx, page);相关入口函数全部声明在 util.h除按页号提取外还有fz_new_stext_page_from_page、fz_new_stext_page_from_chapter_page_number、fz_new_stext_page_from_display_list从 display list 提取可复用已有渲染结果以及一键生成文本缓冲区的fz_new_buffer_from_page*系列util.h。底层设备由fz_new_stext_device创建structured-text.h。如果选项来自统一的fz_options结构例如与其他 writer 选项混合管理可用fz_apply_stext_optionsstructured-text.h直接应用它也是fz_parse_stext_options的内部核心。源码级解析流程完整的选项处理链位于 stext-device.cfz_parse_stext_options先把字符串包装成fz_options调用fz_init_stext_options复位结构体再委托fz_apply_stext_optionsfz_apply_stext_options用fz_lookup_option_boolean逐一检查每个布尔键并SETCLEARBOOL设置/清除位标志——注意它是显式开关而非单向置位optionfalse会清除默认标志clip-rect走fz_lookup_optionval_is_rect校验resolution走fz_lookup_option_float按96 ppi 的 HTML 基准分辨率换算为scaleopts-scale x / 96.0f最后调用fz_apply_table_hunt_options合并表格探测子选项并fz_validate_options校验未识别的键。开发者若想扩展选项源码注释要求同步维护 fz_stext_options_usage 的用法说明字符串——该字符串同时是mutool convert --help和mutool grep --help的输出内容muconvert.c、mugrep.c。附Table Hunt 子选项table-hunt展开后接受一组独立的 Table Hunt Options当前唯一成员选项默认作用vertically-collapse-bordered-cellsfalse若为 true完全带边框的单元格内容被视为可垂直折叠该选项目前标记为experimental可能随时变更。在 stext 选项字符串中直接混写即可mutool convert -F stext -O segment,table-hunt,vertically-collapse-bordered-cells -o out.xml input.pdf推荐组合速查目标推荐选项保留版面原貌排版本提取preserve-ligatures,preserve-whitespace,preserve-spans,inhibit-spaces干净可搜索的纯文本dehyphenate配合默认的连字展开与空白归一化逐字定位/坐标检索accurate-bboxes,accurate-ascenders,accurate-side-bearings,clip版面结构分析segment,paragraph-break,table-hunt装饰与样式还原collect-styles,lazy-vectors,fuzzy-vectors区域抽取clip-rectx0:y0:x1:y1语义标签保留structured,ignore-actualtext按需取舍 ActualText总结MuPDF 的 Structured Text Options 是一套小而精的提取控制面22 个布尔开关加一个裁剪矩形选项覆盖了文本归一化、连字/断词、字符回退、精度、样式、裁剪、矢量与页面分析全链路。无论通过mutool convert/mutool grep的命令行-O参数还是 C API 的fz_parse_stext_optionsfz_new_stext_page_from_page_number都能以统一的键值对语法精确控制提取行为。深入 stext-device.c 与 structured-text.h 的源码可以进一步确认每个开关的默认值、位标志取值与副作用例如use-cid与use-gid的互斥性为构建可靠的文本提取流水线提供依据。赞分享图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载相关推荐MuPDF Table Hunt Options 完全指南vertically-collapse-bordered-cells 参数解析与源码级原理MuPDF Table Hunt Options 完全指南vertically collapse bordered cells 参数解析与源码级原理 Tabl图形学图像处理PyMuPDF TextPage 完全指南文本、图像与矢量的结构化提取与全文搜索PyMuPDF TextPage 完全指南文本、图像与矢量的结构化提取与全文搜索 PyMuPDF 的 TextPage 类是页面内容提取与搜索的底层核心它把图像处理重新定义智能体编程AutoGen多智能体协作框架的架构革命重新定义智能体编程AutoGen多智能体协作框架的架构革命 在当今AI应用开发领域构建复杂的多智能体系统一直面临着架构复杂、扩展困难、调试繁琐等挑战。Aut人工智能AI AgentAgent 框架多智能体大模型工具调用上一篇终极iOS激活锁绕过指南免费解锁二手iPhone的完整方案下一篇Google Agent Skills 完全指南安装、组织与使用 136 个官方 Google Cloud Agent Skills 及其插件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表