
图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载Table Hunt 是 MuPDF 结构化文本提取管线中的实验性功能用于在已提取的 stext 页面structured text page上自动识别表格、重建表格结构并将识别结果写回文档结构树。本文以docs/reference/common/table-hunt-options.md为骨架完整讲解 Table Hunt 唯一可控参数vertically-collapse-bordered-cells的语义、选项字符串书写语法、C API 与命令行mutool draw用法并结合仓库源码深入其底层实现逻辑。读完本文你将能够准确地在文本提取任务中配置该参数理解它在行合并row merging阶段如何改变表格结构判定结果。参数一览唯一选项及其默认值Table Hunt Options 的全部配置项只有一个且为布尔类型选项键类型默认值说明vertically-collapse-bordered-cells布尔false为 true 时任何完全带边框的单元格cell的内容将被视为适合纵向折叠vertically collapsing该选项当前标注为experimental实验性其行为可能在后续版本中不经通知即发生变更subject to change without notice。这一点在头文件注释、官方 man 手册与文档中均有明确提示。选项字符串语法三种书写形式Table Hunt Options 通过选项字符串option string以 key-value 键值对的形式指定。完整语法规则见 docs/reference/common/option-strings.mdMuPDF 支持以下三种等价语法。1. 逗号分隔键值对经典语法vertically-collapse-bordered-cellstrue多个选项用逗号分隔值中如需嵌入逗号或等号可用双引号包裹双引号本身写作两个连续的双引号。2. URL 查询字符串语法以?开头的字符串将按 URL query string 解析?vertically-collapse-bordered-cellstrue特殊字符用%HH十六进制转义。3. JSON 子集语法也可以直接写一个仅含布尔值、数字、字符串与数字数组的 JSON 对象{vertically-collapse-bordered-cells:true}布尔值的等价写法布尔值支持多种等价表示源码is_yes_option/is_no_option逻辑位于 source/fitz/options.c真值true、yes、on、enable、1假值false、no、off、disable、0空值如vertically-collapse-bordered-cells不带value等价于true在结构化文本选项中的位置table-hunt 开关Table Hunt Options 本身不独立启用表格识别它只是细调Table Hunt 行为的参数集。真正的开关是结构化文本选项Structured Text Options中的table-hunt标志见 docs/reference/common/stext-options.mdtable-hunt : Hunt for tables within a (segmented) page官方文档明确说明Structured Text Options 中可以一并包含 Table Hunt Options 集合中的选项Also, options from the Table Hunt Options set can be included here。也就是说你可以在同一条选项字符串里同时写table-hunttrue与vertically-collapse-bordered-cellstrue前者决定要不要找表格后者决定找到后如何对待完全带边框的单元格。源码级剖析选项如何被解析与生效数据结构与枚举Table Hunt 选项在 C 层面对应结构体fz_table_hunt_options定义于 include/mupdf/fitz/structured-text.htypedef struct { int vertically_collapse_bordered_cells; } fz_table_hunt_options; enum { /* Never collapse the contents of bordered cells vertically. */ FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NO 0, /* Always collapse the contents of bordered cells vertically. */ FZ_TABLE_HUNT_VERTICAL_COLLAPSE_YES 1 };该结构体会被内嵌进fz_stext_optionsinclude/mupdf/fitz/structured-text.h中fz_stext_options的table_hunt_options字段因此它可以随结构化文本设备一起使用。解析链路fz_parse_table_hunt_options选项字符串的实际解析发生在 source/fitz/stext-table.cvoid fz_init_table_hunt_options(fz_context *ctx, fz_table_hunt_options *opts) { memset(opts, 0, sizeof *opts); } fz_table_hunt_options * fz_parse_table_hunt_options(fz_context *ctx, fz_table_hunt_options *opts, const char *args) { fz_options *options fz_new_options(ctx, args); fz_try(ctx) { fz_init_table_hunt_options(ctx, opts); fz_apply_table_hunt_options(ctx, opts, options); fz_throw_on_unused_options(ctx, options, table hunt); } fz_always(ctx) fz_drop_options(ctx, options); fz_catch(ctx) fz_rethrow(ctx); return opts; }注意其实现要点fz_init_table_hunt_options用memset将结构体清零即所有字段默认取FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NO0——这正是文档所述默认 false的代码来源解析完成后调用fz_throw_on_unused_options任何拼写错误或未知的选项键都会触发报错可有效防止拼写失误被静默忽略。选项键映射fz_apply_table_hunt_options真正的键名映射在 source/fitz/stext-table.cvoid fz_apply_table_hunt_options(fz_context *ctx, fz_table_hunt_options *opts, fz_options *args) { fz_lookup_option_boolean(ctx, args, vertically-collapse-bordered-cells, opts-vertically_collapse_bordered_cells); fz_validate_options(ctx, args, table hunt); }fz_lookup_option_boolean定义于 source/fitz/options.c负责把前文列出的各种布尔写法归一化为 0/1。当用户未提供该键时lookup_option返回 0字段保持初始化后的默认值 0即false。与 stext 选项的联动fz_apply_stext_optionssource/fitz/stext-device.c在处理table-hunt标志后会调用fz_apply_table_hunt_options将字符串中剩余的 Table Hunt 键一并应用同时fz_init_stext_options同文件 L2125-L2132在初始化时也会先初始化内嵌的table_hunt_options。因此 Table Hunt 参数可以无缝嵌入 stext 选项字符串。该参数究竟改变了什么行合并merge_rows逻辑vertically-collapse-bordered-cells的作用点位于表格网格grid构建后的行合并阶段。相关实现见 source/fitz/stext-table.c 的merge_rows函数。网格由横竖线h_line/v_line与跨越线h_crossed/v_crossed标记出一个个cell_t单元格。默认FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NO情况下两行能否合并取决于行是否为空且竖线分布一致上方/下方单元格是否为空两行单元格的竖线线度是否一致两行都非空时是否被横线分隔、是否跨越、行距是否足够近a-content.y1 fs/2 b-content.y0其中fs取两行字号最大值。而当vertically_collapse_bordered_cells ! FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NO时会额外启用一条合并路径if (opts ! NULL opts-vertically_collapse_bordered_cells ! FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NO) { /* If every cell in a row is plausibly bounded, and none have a horizontal * line under them, we can merge. */ for (x 0; x gd-cells-w-1; x) { cell_t *b get_cell(gd-cells, x, y1); if (!plausibly_bordered_spanned_cell(gd-cells, x, y) || b-h_line) break; } if (x gd-cells-w-1) goto merge_row; }即只要一行中每个单元格都看起来带完整边框plausibly_bordered_spanned_cell且其正下方没有横线h_line这两行就可以被纵向合并。这正是文档所述完全带边框的单元格内容适合纵向折叠的实现语义。看起来带完整边框如何判定辅助函数plausibly_bordered_spanned_cellsource/fitz/stext-table.c的判定流程为从单元格(x,y)出发向左、向右、向上、向下扫描分别找到包围它的竖线v_line与横线h_line从而确定一个候选的大单元格super-cell允许跨行跨列检查大单元格的上下左右四边是否每条边都确实存在边框线内部扫描时对每一列检查顶/底h_line对每一行检查左/右v_line再确认大单元格内部没有多余的横线或竖线cell-h_line || cell-v_line必须全部为假全部通过才返回 1判定该单元格是完全带边框的。也就是说该选项只会影响那些四边框线完整、内部无分割线的单元格——这类单元格在视觉上更像一个合并后的整体纵向折叠把相邻行的内容并入同一行在语义上更合理。何时会真正触发Table Hunt 的调用路径fz_table_hunt只是fz_table_hunt_within_bounds以无限矩形调用的一层封装source/fitz/stext-table.cvoid fz_table_hunt(fz_context *ctx, fz_stext_page *page, const fz_table_hunt_options *opts) { fz_table_hunt_within_bounds(ctx, page, fz_infinite_rect, opts); }完整的调用关系为结构化文本设备结束一页时若设置了FZ_STEXT_TABLE_HUNT标志则调用fz_table_hunt(ctx, page, NULL)source/fitz/stext-device.c——注意此时传NULL即使用默认选项若需自定义行为应通过选项字符串设置vertically-collapse-bordered-cells它会经由fz_apply_stext_options落入opts-table_hunt_options最终在行合并阶段生效更细粒度的控制还有fz_table_hunt_within_bounds限定矩形范围、fz_find_table_within_bounds把给定矩形内容解释为单个表格、fz_find_table_within_grid跳过网格检测阶段、直接使用给定网格、fz_propose_table_within_bounds只猜测网格结构、不写入页面声明均位于 include/mupdf/fitz/structured-text.h。实际用法mutool draw 命令行mutool draw支持通过-O选项传入通用选项字符串source/tools/mudraw.c中case O: options_string fz_optarg随后fz_new_options(ctx, options_string)文本提取时这些选项会应用到 stext 设备上见source/tools/mudraw.c中fz_apply_stext_options(ctx, stext_options, user_options)。因此可以直接这样使用# 提取结构化文本stext为 XML同时启用表格识别与纵向折叠 mutool draw -F stext -o out.xml -O table-hunttrue,vertically-collapse-bordered-cellstrue input.pdf # 使用 JSON 语法 mutool draw -F stext -o out.xml -O {table-hunt:true,vertically-collapse-bordered-cells:true} input.pdf # 使用 URL 查询字符串语法 mutool draw -F stext -o out.xml -O ?table-hunttruevertically-collapse-bordered-cellstrue input.pdfmutool draw支持的输出文本格式为 plain text、html 与结构化文本xml 或 json由-F指定详见 docs/tools/mutool-draw.md。man 手册 docs/man/mutool.1 对相关选项的描述为table-hunt在已分段的页面中寻找表格vertically-collapse-bordered-cells实验性为 true 时将完全带边框的超级单元格super-cells的内容视为可纵向折叠。C API 用法示例对于直接使用 MuPDF C API 的开发者可以通过fz_parse_table_hunt_options或fz_apply_table_hunt_options编程式配置fz_table_hunt_options opts; fz_parse_table_hunt_options(ctx, opts, vertically-collapse-bordered-cellstrue); /* 之后可将 opts 交给 fz_table_hunt / fz_table_hunt_within_bounds */ /* 若需手动初始化再逐键设置 */ fz_init_table_hunt_options(ctx, opts); opts.vertically_collapse_bordered_cells FZ_TABLE_HUNT_VERTICAL_COLLAPSE_YES;需要强调的是除非显式指定FZ_STEXT_TABLE_HUNT标志或直接调用fz_table_hunt系列函数否则 Table Hunt 不会运行vertically-collapse-bordered-cells也就不会产生任何效果。注意事项与适用前提实验性 APIfz_table_hunt、fz_segment_stext_page等接口在头文件中均被标注为实验性可能在未来版本中变更甚至移除vertically-collapse-bordered-cells亦不例外默认关闭结构体经memset清零默认值为FZ_TABLE_HUNT_VERTICAL_COLLAPSE_NOfalse需要时显式开启对输入的要求该选项只在存在完整边框单元格的表格如典型的全框线表格上才有意义对无线框或仅部分线框的表格plausibly_bordered_spanned_cell的边框完整性检查会使其不满足折叠条件拼写敏感选项键必须精确写作vertically-collapse-bordered-cells未知键会被fz_throw_on_unused_options直接拒绝并报错与segment的关系官方 man 手册将table-hunt描述为hunt for tables within a (segmented) page即表格识别通常配合segmenttrue的分段分析使用fz_segment_stext_page见 include/mupdf/fitz/structured-text.h但二者是独立的 stext 标志可按需单独开启。参考链接汇总参数权威文档docs/reference/common/table-hunt-options.md选项字符串通用语法docs/reference/common/option-strings.md结构化文本选项含table-hunt开关docs/reference/common/stext-options.md头文件 API 声明include/mupdf/fitz/structured-text.h解析与行合并实现source/fitz/stext-table.cstext 选项联动source/fitz/stext-device.c布尔值归一化实现source/fitz/options.cman 手册docs/man/mutool.1mutool draw用法docs/tools/mutool-draw.md赞分享图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载相关推荐MuPDF Table Hunt Optionsvertically-collapse-bordered-cells 参数详解与表格识别原理MuPDF Table Hunt Optionsvertically collapse bordered cells 参数详解与表格识别原理 本篇技术指南围绕桌面应用文档Apache Spark CREATE DATASOURCE TABLE 完全指南语法、参数语义与源码级原理详解Apache Spark CREATE DATASOURCE TABLE 完全指南语法、参数语义与源码级原理详解 导读 CREATE TABLE 是 Spar大数据数据分析批处理流处理机器学习图计算RedwoodJS Cells 完全指南从教程实战到源码级原理剖析RedwoodJS Cells 完全指南从教程实战到源码级原理剖析 Cells 是 RedwoodJS 最具标志性的数据获取抽象你只需按约定导出 QUERY后端前端Web框架开发工具上一篇Nextcloud server Playwright 端到端测试实战Docker 自动拉起、页面对象模型与 DAV 数据注入下一篇FastBle框架设计思想面向接口编程与回调机制的完美结合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考