卫越把那份文件截图截了三张,每张各对应一级层级,发进对话框,一条消息没写字。
陆衍把三张图并排放大,看了一会儿,问:「层级是靠什么区分的?」
「字号,」卫越语音来了,「加左边距。这份格式三,主标题十二点,正文十点,条款九点,三级缩进分别是零、零点五厘米、一厘米——靠这两个参数组合判断哪个是section、哪个是subsection、哪个是exhibit里的条款。没有编号,没有缩进字符,就是排版。」
「我们的工具读不了排版,」陆衍说。
「对,我们是纯文本解析,字体信息读不进来。」
这个问题比陆衍最开始以为的要更根本。
他们的工具处理文件的方式是:把文件转成纯文本,然后按行读字段标题、识别层级、提取值。这在格式一和格式二里跑得很顺——那两种格式用数字编号(1.1.2这类)或者实心圆缩进来表示层级,纯文本里这些符号都保留着,工具直接识别。
但格式三把层级信息藏在排版里,转成纯文本以后,十二点标题和九点条款都变成了一样的文字,工具不知道哪个更高一级,字段平铺在一起,层级关系丢失,所以卡住了。
要解决这个问题,只有一条路:在读文件的时候不用纯文本转换,改成读PDF的排版信息——把字号、左边距这些参数一起提取出来,作为判断层级的依据。这需要换一套解析库,不是两行代码能改完的事情。
陆衍把这个判断想了一遍,给卫越发消息:「你估算过改这一块要多久吗?」
「两天,」卫越回,「如果只是格式三。但我不知道香港还会不会出格式四。」

这是个值得问的问题。
陆衍没有立刻回卫越,而是给祁明发了一条消息。
「祁律师,想请教一个技术问题:你们发过来的香港样本里有两份是靠字号和左边距区分层级的格式——我们这边的工具在这种格式上有个限制,需要单独适配。目前有两个方向,一是专门为这个格式开发解析模块,时间大概两到三天;二是不做自动解析,工具出一份字段清单,贵所这边由助理人工核对相关字段。想问一下:这两份文件在整个项目里占比怎么样,以及第二种方式贵所能否接受?」
他发出去,然后去倒了杯水,喝了两口,回来看到祁明已经回了。
「这两份是香港那边的附属协议,不是主合同,核心条款集中在大陆三份和香港主合同里,这两份附属协议我们也需要覆盖,但不是今天的优先级。第二种方式没问题,给清楚的说明就行,我们这边有专门负责文件管理的助理。」
陆衍把这条回复截图发给卫越,加了一行:「选B。不做专用模块。」
卫越回了三个字:「我去整清单。」
决定不难做。
在陆衍看来,为少数几种格式写专门的解析模块是一条走不完的路——香港文件有格式三,以后遇到新加坡、英国、德国的文件,还会有格式四、格式五,不可能每个都去专门适配。工具的核心价值是在常见格式里找矛盾,不是兼容世界上所有的文件排版。
能兼容的,工具跑;不能兼容的,给出清单让人工处理。这才是边界该在的地方。

他在本子上写了一行:「自动覆盖≠全覆盖,自动+人工=有效覆盖。」
然后在下面补了一条:「边界说明是报告的一部分,不是报告的缺陷。」
这两行他用来帮自己捋思路,也准备用在给祁明的最终报告里——不是辩解,是陈述:工具在这个范围里做了什么,在这个范围外是什么处理方案,读报告的人知道自己拿到的是一份什么东西。
下午,卫越发来格式三辅助核查清单的第一版。
是一个表格,纵轴是从格式三文件里提取出来的所有字段标题,横轴是「字段内容(请填写)」、「文件版本/日期」、「是否与其他文件一致」三列,每行后面跟一列备注提示语,说明这个字段通常在哪一层出现、格式上有什么要注意的。
陆衍把这个表格看了一遍,改了两处:一是把备注提示语里的「通常」改成「在本文件中」,避免暗示工具有其他文件的比对能力;二是在表格顶端加了一行说明:「本清单由工具从格式三文件提取字段框架,内容由贵所助理根据原始文件填写,填写完成后与其他报告合并使用。」
「这样用户知道这张表从哪来的,该怎么用,」他给卫越解释,「不然他们可能以为这张表本身就是分析结果。」
「加完了,」卫越说,「不过我发现另一个问题。」
「哪个?」
「那份混排卡住的文件,我今天重新看了一遍——不是一份文件出了问题,是两份文件被合在一起了。」
陆衍停了一下,「合在一起?」

「对,」卫越发来一段解释,「从第一页到第二十三页,文件头是HK-SUPP-002,格式是格式一;从第二十四页开始,文件头换成了HK-SUPP-003,格式换成了格式三,但整个文件是一个PDF,页码是连续的,没有分割。我刚才翻到中间那页,两份文件的最后一页和第一页直接相邻,之间只有一条细线,没有明显的分隔。」
陆衍把这个信息过了一遍。
这不是解析问题,是文件本身的结构问题——祁明给过来的样本里,有人把两份原本独立的协议合并成了一个PDF,大概是为了发送方便,没想到这样一来格式三的问题被夹在里面,工具遇到格式切换的那一页就卡住了,报了解析错误,但报的原因不对。
「那这算几份文件?」陆衍问。
「算两份,」卫越说,「HK-SUPP-002是格式一,可以正常跑;HK-SUPP-003是格式三,走辅助清单。但现在它们在一个PDF里,要拆开。」
「需要律所那边确认一下,」陆衍说,「可能是他们汇总的时候合的,也可能原始件就是这样。」
他给祁明发了一条消息,说明情况,问那份文件是否可以提供单独的原始件。
发出去的那一刻,他在本子上记了一行:
「混排=文件管理问题,不是格式问题。工具报的是症状,原因在别处。」
祁明当天晚上回了消息:「是我们助理整理的时候把两份附属协议合并发过来了,我让她把原始件分开发给你们。」

附件在十分钟后到了,两份独立PDF,文件名HK-SUPP-002和HK-SUPP-003。
陆衍把这两条消息截图发给卫越,然后发了一条:「明天把HK-SUPP-002跑一遍,HK-SUPP-003整进辅助清单。」
「好,」卫越回,然后停了几秒,又加了一条,「那今天香港那边是一红一黄,明天至少红的会变绿。」
陆衍看了一眼那行字,没有接着说什么,把手机放下了。
窗外还有点亮,他坐在桌边,看着本子上今天记的几行字——字段别名表、格式三辅助清单、混排文件处理、自动覆盖和人工覆盖。每一条都是这个项目里遇到的一个具体的事,每一条单独看都不大,放在一起,是一张这类项目的地图。
下一份英文项目,如果碰到格式三,他们知道怎么处理。如果碰到被合并的文件,他们知道先问原始件。
这不是从零开始学的,是从祁明这个项目里走出来的。
他在本子最下方写了一行:
「每个项目多出一条处理经验,这比工具代码更难被复制。」
然后把本子合上。