PHP中如何检测表格列内跨行拆分的名称
PHP中如何检测表格列内跨行拆分的名称
嘿,我看你已经在处理PDF表格文本提取的问题了,而且空格规范化、换行清理这些基础工作都做了,考虑得挺周到!针对你问的「检测表格列内跨行拆分的名称」,我结合你现有的代码给你捋捋完善思路:
首先得明确:跨行拆分的名称,本质就是原本属于同一个单元格的内容被拆成了多行,我们要做的就是把这些零散的行识别出来并拼接回去。核心思路就是用一个变量暂存“未完成”的名称,等遇到不属于名称列的内容时,再把完整的名称存入结果。
结合你写的代码,我们可以这样优化:
$parser = new Parser(); $pdf = $parser->parseFile($_FILES['pdf']['tmp_name']); $text = $pdf->getText(); // 把NBSP转换成普通空格,避免特殊空格干扰文本判断 $text = preg_replace('/\x{00A0}/u', ' ', $text); // 处理Weekly Totals前的多余换行,你这步已经考虑到了,很实用 $text = preg_replace('/\R+(?=\s*Weekly\s+Totals)/iu', ' ', $text); // 按行拆分文本 $lines = preg_split('/\R/u', $text); $results = []; $currentType = null; $pendingName = ''; // 用来暂存还没拼接完成的跨行名称 foreach ($lines as $line) { $line = trim($line); if (empty($line)) continue; // 跳过空行 // 这里是核心:你需要根据自己的PDF表格结构,定义判断"名称行"的规则 // 举个例子:假设你的名称列内容不含数字,都是纯文本,就可以这么判断 $isNameLine = !preg_match('/\d+/', $line); if ($isNameLine) { if (!empty($pendingName)) { // 如果之前有暂存的未完成名称,说明当前行是跨行的一部分,直接拼接 $pendingName .= ' ' . $line; } else { // 遇到新的名称行,开始暂存 $pendingName = $line; } } else { // 当前行是数据行,说明之前的名称已经完整了,存入结果 if (!empty($pendingName)) { $results[] = [ 'category_name' => $pendingName, 'row_data' => $line ]; $pendingName = ''; // 重置暂存变量,准备接收下一个名称 } else { // 处理没有对应名称的数据行(根据你的业务需求调整) $results[] = ['row_data' => $line]; } } } // 循环结束后,别忘了检查有没有剩下的未完成名称 if (!empty($pendingName)) { $results[] = ['category_name' => $pendingName]; }
这里必须重点提醒你:$isNameLine的判断规则一定要贴合你的实际PDF表格!比如有的表格名称可能带特定前缀、固定在每行前几个字符的位置、或者和数据行有明显格式区分,你得根据实际情况调整这个判断逻辑——毕竟不同PDF的表格排版差异可大了。
要是你的表格里名称跨行是因为单词被截断(比如一行末尾是"Depart",下一行是"ment"),还能再优化:比如检查暂存的$pendingName末尾是不是完整单词(用preg_match('/[a-z0-9]$/i', $pendingName)检测),如果是不完整的,直接拼接当前行,这样识别会更精准。
备注:内容来源于stack exchange,提问作者h25
相关产品推荐
相关产品推荐

