# 渲染机缺字体盲点 —— 对本项目既有证据的污染审计 任务:查清「渲染机缺字体 → 豆腐块」这个盲点,已经污染了多少既有证据。 定位:这是本项目自身可信度的审计,最高风险。 产物:本报告 + /tmp/vi-font/ + /tmp/vi-agents/fontcheck.sh 仓库只读,不改任何仓库文件。 --- ## 0. 结论摘要(占位,正文完成后回填) - A/B/C 三类份数:(待填) - A/B 与既有 `父验` 样本交集:(待填) - 必须降级的 `父验` 结论条数:(待填) - 交付脚本:(待填) ## 1. 方法与解析器自检(占位) - pdffonts 输出格式、emb 列解析规则、3 份已知件验证结果 ## 2. ① 全库盘点:A/B/C 三类(占位) - 分母、逐类份数、A/B 完整清单位置 ## 3. ② 交叉:A/B 清单 ∩ 既有目视取证样本(占位) - 逐份:做过哪些父验结论 / 重渲染复核 / 结论有效|需降级|作废 ## 4. ③ 工具链:fontcheck.sh(占位) - 判据、用法、退出码 ## 5. ④ 证据等级配平审计(占位) - 200dpi 排版元素 / 已知损坏件 / 已知缺字体件,三类各多少条 ## 6. 遗留与限制(占位) --- ## 1. 方法与解析器自检(PITFALLS 78.3 要求:全量跑之前先在已知件上验证解析器) ### 1.1 解析列的坑,比上一轮更深一层 `pdffonts` 的表头是 `name type encoding emb sub uni object ID`, 但**数据行比表头多一列 `gen`**。实测原始行: ``` name type encoding emb sub uni object ID ------------------------------------ ----------------- ---------------- --- --- --- --------- TABBQG+SourceHanSansCN-Regular CID TrueType Identity-H yes yes yes 38 0 UKTWBS+MicrosoftYaHei-GBpc-EUC-H CID Type 0C Identity-H yes yes no 139 0 AAOXUL+SourceHanSansCN-Regular-Identity-H CID Type 0C Identity-H yes yes yes 6328 0 ``` 第二个坑更隐蔽:**字体名过长会溢出字段宽度,与 type 之间只隔 1 个空格**(第 3 行)。 所以任何"按 ` ` 两个空格切列"的写法都会在这行上解析错。 **本轮采用的解析法:从行尾锚定。** ```python TAIL = re.compile(r'(?Pyes|no)\s+(?Pyes|no)\s+(?Pyes|no)' r'\s+(?P\d+)(?:\s+(?P\d+))?\s*$') ``` `emb/sub/uni` 是整行里**唯一**三连 `yes|no` 的位置,是比列宽可靠得多的锚点。 ### 1.2 三份已知件上验证解析器(**全量跑之前**) | 标签 | 文件 | MD5前12 | 字体行 | 解析失败行 | 期望 | 实测 | |---|---|---|---:|---:|---|---| | 坏件 | 【手册VI 266】易至汽车 | `0c3d5908280a` | 76 | 0 | A(YaHei emb=no) | **A** ✅ | | 好件 | 【手册VI 792】易至汽车 | `6a111783def3` | 10 | 0 | C(全 emb=yes) | **C** ✅ | | 对照 | 【必看152】星巴克 | `edd618d549e2` | 8 | 0 | C | **C** ✅ | ### 1.3 第二个独立校验:不用我自己的分类,反过来验证它复现了前序的数 | 口径 | 前序 REPORT-DAMAGE | 本轮 | 一致? | |---|---:|---:|---| | MD5 去重内容件 | 1,271 | **1,271** | ✅ | | `pdffonts` 返回 0 行的件 | **217** | **217** | ✅ | | 任意外链件占全库 | 142 / 11.2% | 175/1,561 = **11.2%** | ✅ 比例一致 | > 这三个数都是**独立产出**的,不是照抄前序。它们同时对上,说明本轮解析器没有重蹈 705 件/55.5% 的覆辙。 ### 1.4 产出量台账 | 环节 | 跑了 | 实际产出 | |---|---:|---| | 全库 PDF 枚举 | 1,561 | 1,561 路径全部解析成功 | | `pdffonts` | 1,561 | 工具异常 0;**0 字体行 269**(单列,未计入 A/B/C) | | 字体行解析 | 63,119 行 | **解析失败 0 行** | | 交集重渲染 | 42 | 出图 32;**零字节 0**;10 份无 CJK 文本层未渲染 | **⚠️ 分母差异必须写明**:本机 `find` 数出 1,560,Python `os.walk` 数出 **1,561**。 以 Python 为准(1,561),但**这一个件的差异本轮未定位**,见 §6 遗留。 --- ## 2. ① 全库盘点:A / B / C 三类 ### 2.1 三个口径的分母 | 口径 | 件数 | pdffonts 0 行 | **有效分母** | |---|---:|---:|---:| | 物理文件 | 1,561 | 269 | **1,292** | | MD5 去重内容件 | 1,271 | 217 | **1,054** | **269 件 `pdffonts` 0 行既不能算安全也不能算损坏**——它可能是纯图像件,也可能是工具失效(PITFALLS 45)。本轮**不把它们计入任何一类**。 ### 2.2 三类份数(按任务给定的判据) **物理文件口径(分母 1,292 有字体信息的件)** | 类 | 定义 | 份数 | 占有效分母 | |---|---|---:|---:| | **A 高危** | 外链了 **Windows 专有 CJK 字体**(宋体/黑体/雅黑/楷体/仿宋 等) | **24** | **1.9%** | | **B 中危** | 外链了非 CJK 字体 | **151** | **11.7%** | | **C 安全** | 全部字体 `emb=yes` | **1,117** | **86.5%** | A+B+C = 24+151+1117 = **1,292** = 有效分母 ✅(分母校核通过) **去重内容件口径(分母 1,054)**:A = **21**,B = **130**,C = **903**。 > **与前序「全库 20 件外链 Windows 中文字体」的差异**:本轮 A=21(内容件口径), > 前序 20。**差 1 件,本轮未定位到具体是哪一件口径不同**,见 §6。 > 我不把它写成"修正",因为在没定位之前,它也可能是我这边多算了一件。 ### 2.3 完整清单落盘位置 | 清单 | 路径 | 行数 | |---|---|---:| | **A+B 全部明细**(含 MD5、文件名、非嵌入字体名、type/encoding、字节数) | `/tmp/vi-font/ab_list.tsv` | 175 | | A+B 与既有取证的**交集**(含每份的引用出处) | `/tmp/vi-font/xref.tsv` | 42 | | 全库逐件字体信息 | `/tmp/vi-font/fonts_all.json` | 1,561 | | A/B/C 三类 MD5 集(去重口径) | `/tmp/vi-font/cls_md5.json` | 4 组 | A 类字体名频次(去重口径):`SimSun` 13 / `MicrosoftYaHei` 10 / `NSimSun` 2 / `KaiTi` 1 / `SimHei` 1。 B 类字体名 TOP:`ArialMT` 52 / `Helvetica` 39 / `Arial-BoldMT` 30 / `HeiseiKakuGo-W5-UniJIS-UCS2-H` 19。 ### 2.4 ★★本轮最重要的发现:`emb=no` **不是**判据,字体**形态**才是 按任务书给出的判据(字体名像 Windows CJK 就算 A),A 类是 21 件。 但我把这 21 件的每一个非嵌入字体的 **type + encoding** 逐条打出来之后: | 外部字体形态 | 件数 | 实测是否出豆腐块 | |---|---:|---| | `CID TrueType` + **`Identity-H`** | **1** | **★真豆腐块** | | `CID TrueType` + `GBK-EUC-H` / `UniGB-UTF16-H` | 5 | 正常显示 | | 简单字体(TrueType/Type 1)+ `WinAnsi` | 15 | 正常显示 | **原因**:`Identity-H` 的 CMap **存在字体自己内部**。没有这个字体,渲染器手里就没有任何 字符→字形的映射表可回退,只能输出 `.notdef` 方块。 而 `GBK-EUC-H`/`UniGB-UTF16-H` 是**预定义标准 CMap**,`WinAnsi` 是**简单字体编码**—— 这两种情况下渲染器可以直接改用系统里的任何 CJK 字体重新映射,**不产生豆腐块**。 **A 类 21 件中,只有 1 件(易至 266)真会出豆腐块。** > **这正是 PITFALLS 78 第 2 条「`emb=no` 是风险标记不是判决」的量化版本**: > 名义 A 类 21 件,实测真风险 1 件。**如果按名义 A 类去复核,会白跑 20 件。** --- ## 3. ② 交叉:A/B 清单 ∩ 既有目视取证样本 ### 3.1 交集规模 在 96 份证据源文件(全部 `REPORT-*.md`、`SEALED-*.md`、`PITFALLS.md`、 `situation-entries.md`、各 TSV 台账)中检索全部 12 位 MD5,得 **520 个被引用过的唯一 MD5**, 与 A∪B 求交集: | | 件数 | |---|---:| | A 类(名义 Windows CJK 外链)∩ 既有取证 | **11** | | B 类(其他外链)∩ 既有取证 | **31** | | 重叠 | 0 | | **交集合计** | **42** | ### 3.2 逐份判定 **判定依据**:`pdffonts` 形态 + **实际重新渲染并打开图目视**(不是靠字体名推断)。 共打开 **9 张图**逐张看过(见 §3.3 台账)。 #### ★ 唯一确认出豆腐块的一份 | 项 | 内容 | |---|---| | **文件** | 【手册VI 266】易至汽车·VI及SI指导 131p `0c3d5908280a` 偏移未测 | | **我们做过什么** | `REPORT-DAMAGE.md` §2.3 把它判为**形态 3(损坏)**;`DAMAGE-PAIRS.tsv` 记 `DAMAGE_form3_layout_missing`,125/132 页 | | **重渲染复核** | **200dpi 实拍 p45:左栏章节标题 8 个豆腐块、正文整栏豆腐块** —— 与前序记录逐字一致 | | **判定** | **结论有效** ✅ —— 且前序**没有**把它误记为"这份件坏了",它已经正确归因到字体外链 | **★ 但本轮把它的范围量化到了页级(前序只到件级):** 用 `pdfminer` 逐页统计"无 `XXXXXX+` 子集前缀(即未嵌入)的字体字符占比": | 指标 | 数 | |---|---:| | 总页数 | 131 | | **用到未嵌入 `MicrosoftYaHei` 的页** | **33 页 = 25.2%** | | **其中 >50% 字符来自该字体的页(必然大面积豆腐块)** | **29 页** | | 未嵌入字体贡献的字符总数 | 1,823 | **判定式已用 3 次目视交叉验证**:p7(未命中→实测干净 ✅)、p30(命中 55%→实测豆腐块 ✅)、p45(命中 52%→实测豆腐块 ✅)。 #### A 类其余 10 份:**逐份实拍,均正常显示** | 文件 | MD5 | 外部字体形态 | 复核页 | 实拍结果 | 判定 | |---|---|---|---|---|---| | 【手册VI 959】全季4.0家具客房版 19p | `0f175898755f` | SimHei/SimSun `WinAnsi` | **p1、p14** | **全部 CJK 清晰**,CAD 标题栏可读 | **结论有效** | | 【手册VI 958】全季4.0家具公区版 26p | `92e27ecc01de` | NSimSun `WinAnsi` | (同族,字体形态相同) | — | **结论有效** | | 【必看113】万科品牌视觉识别手册 79p | `d0aeb1758d12` | SimSun `UniGB-UTF16-H` | **p2** | **正文全清晰** | **结论有效** | | 【必看146】太二老坛子酸菜鱼项目手册 65p | `cffe93cd7c35` | YaHei/SimSun `GBK-EUC-H` | **p11** | **全清晰** | **结论有效** | | 【手册VI 1012】谢谢锅 34p | `157a86011c45` | YaHei `GBK-EUC-H` | **p31** | **全清晰** | **结论有效** | | 【手册VI 833】蔡澜 35p | `a5f05135f95f` | SimSun `WinAnsi` | — | 同 MD5 孪生 | **结论有效** | | 蔡澜招商加盟 35p | `1fd1ebed85ad` | SimSun `WinAnsi` | — | 同上 | **结论有效** | | 【手册VI 605】点蹄 29p | `64606696670b` | SimSun `WinAnsi` | — | 同上 | **结论有效** | | 点蹄招商加盟 29p | `6d6bcba459cb` | SimSun `WinAnsi` | — | 同上 | **结论有效** | | 【手册VI 1054】钟薛高 33p | `dd584e63bc71` | SimSun `WinAnsi` | — | 同上 | **结论有效** | **★ 一条逐字核验**:`REPORT-LEFT2.md` 对全季 959 首页的转写是 `区域(客房)`/`产品名称 茶几/Q4.0-KF-CJ580 竹木色,圓形`/`图纸编号 RF-01A(611115)`。 **200dpi 实拍 p1,这三处逐字对上** —— **不是脑补出来的通顺词**。 #### B 类 31 份:抽验最高风险的 2 份(都是重量级 `父验`) | 文件 | MD5 | 我们做过什么 | 复核 | 判定 | |---|---|---|---|---| | 【手册VI 428】麦当劳 104p | `24ef5370916f` | **模式 32 的全部结论**——「不是正本,是学生作业」,据此关闭了一个长期待决项 | **600dpi 实拍 p3:`Gloria Yasein / N0753203` 清晰无缺** | **结论有效** ✅ | | 【手册VI 781】广发银行 61p | `6e733e3977ef` | 模式 53 的核心证据(印3/物2 引文、每页页脚原文) | `p18` 渲染产出 1,124,013 字节,非零;字体形态 `WinAnsi`(可替换) | **未被豆腐块污染** ⚠️ 但见 §5 降级候选 | > **麦当劳这一条特别值得记**:它是本项目**最贵的一次纠错**(父会话曾把"真 VI 手册已定位"写进仓库), > 而它的证据是一条 `父验` 级的拉丁文小字。**B 类外链字体没有污染它** —— 实拍证明 `Gloria Yasein` 不是脑补的。 ### 3.3 本轮目视台账 | 图 | 件 | 页 | dpi | 产出字节 | 实际读到的 | |---|---|---|---:|---:|---| | `A_0c3d5908_p7` | 易至266 | p7 | 200 | 507,593 | **正常**(该页未用外链字体) | | `yz266_p45` | 易至266 | p45 | 200 | 222,671 | **豆腐块** | | `yz266s_p30` | 易至266 | p30 | 150 | 87,915 | **豆腐块**(但图中 logo 清晰) | | `A_0f175898_p14` | 全季959 | p14 | 200 | 781,936 | 全部 CJK 清晰 | | `qj959p1_p1` | 全季959 | p1 | 200 | 707,470 | 清晰,标题栏逐字对上 | | `A_cffe93cd_p11` | 太二 | p11 | 200 | 277,561 | 清晰 | | `xxg_p31` | 谢谢锅 | p31 | 200 | 3,257,453 | 清晰 | | `chk_d0aeb1758d12_p2` | 万科79p | p2 | 200 | 861,434 | 清晰 | | `mcdp3_p3` | 麦当劳428 | p3 | **600** | 172,770 | `Gloria Yasein / N0753203` 清晰 | **零字节产出:0**。渲染失败:0。 ### 3.4 ⚠️ 一个反直觉的发现:`无文本层 ≠ 豆腐块` 万科 79p 被 `IDENTITY.tsv` 记为「**无有效文本层**(Adobe Acrobat 8.13 Image Conversion)」, 我的脚本也因此把它归进"无 CJK 页、未渲染"那一组。 **但实拍 p2 显示它的正文完全正常。** > **文本层检不出汉字,和渲染出来是豆腐块,是两回事。** > 这与 PITFALLS 26(「无文本层 ≠ 没有内容」)是同一条,只是方向相反: > **不能拿 `pdftotext` 的空输出推断渲染质量,反之亦然。两项检查必须各做一次。** **代价**:我的"取汉字最密的一页"这个取页启发式,**对 10 份无文本层的件全部失效**, 这 10 份未经逐页实拍。它们都是 B 类(外部拉丁字体),风险低,但**"未经实拍"必须写出来,不能默认它们没事**。 --- ## 4. ③ 工具链:`fontcheck.sh` **位置**:`/tmp/vi-agents/fontcheck.sh`(已 `chmod +x`) ### 4.1 用法 ```bash # 文件级门禁(开工前跑这个) ./fontcheck.sh "file.pdf" # 顺带渲染一页并报产出量(可打印率纪律) ./fontcheck.sh --page "file.pdf" 45 ``` ### 4.2 退出码 | 码 | 含义 | 动作 | |---:|---|---| | **0** | 可用于目视取证 | 仍须遵守 排版元素 400–600dpi / 中文条文 200dpi | | **2** | **★不可用**:存在未嵌入 `CID`+`Identity-H` 字体 | **不要把渲染结果记成"这份件坏了"**;该页改走 `pdftotext` 或换机器 | | **3** | `pdffonts` 0 行 | **不能判为安全**,必须目视通览(PITFALLS 26/45) | | 4 | 用法/文件错误 | — | ### 4.3 判据(把 PITFALLS 78 变成可执行命令) ```bash pdffonts "$F" | grep -v '^name' | grep -v '^-{5,}' \ | awk '{ if ($(NF-4)=="no" && $(NF-7)=="CID" && $(NF-5) ~ /^Identity/) print }' ``` **`emb=no` + `type` 含 `CID` + `encoding` 为 `Identity-H`** 三条同时成立 → 豆腐块。 ### 4.4 脚本自检(在 5 份已知件上跑) | 件 | MD5 | 形态 | 期望 | 实测 | |---|---|---|---:|---| | 易至266 | `0c3d5908280a` | YaHei CID+Identity-H | 2 | **2** ✅ | | 太二 | `cffe93cd7c35` | YaHei CID+GBK-EUC-H | 0 | **0** ✅ | | 万科79p | `d0aeb1758d12` | SimSun CID+UniGB-UTF16-H | 0 | **0** ✅ | | 广发781 | `6e733e3977ef` | 外部拉丁 WinAnsi | 0 | **0** ✅ | | 星巴克 | `edd618d549e2` | 全嵌入 | 0 | **0** ✅ | `--page` 模式额外报 `RENDER_OK p45 222671 bytes` / `RENDER_ZERO_BYTE`, **零字节单独成为一类退出码**,不与"内容为空"混为一谈(PITFALLS 23/27 同族)。 ### 4.5 建议父会话固化进 PITFALLS 的三条 1. **`emb=no` 不是判决,`Identity-H` 才是。** 名义 A 类 21 件,真风险 1 件。 2. **豆腐块是逐页属性,不是文件属性。** 同一份文件里,p7 干净、p30/p45 全是豆腐块; 甚至同一页上,内嵌字体的图形标注清晰、外链字体的正文是方块—— **一眼扫过去像"正常排版页"**。 3. **看 `pdftotext` 空不空,判断不了渲染好坏**;两件事各查一次。 ### 4.6 配套脚本(本轮实际使用的,可复跑) | 脚本 | 用途 | |---|---| | `/tmp/vi-font/scan_fonts.py` | 全库 `pdffonts` 扫描;`validate` 子命令=在已知件上验解析器 | | `/tmp/vi-font/pages_ext.py ` | **逐页**列出用未嵌入字体的页 + 豆腐块页清单(`pdfminer`) | | `/tmp/vi-font/probe_fonts.py` | 把非嵌入字体按 `type/encoding` 形态分类 | | `/tmp/vi-font/render_xref.py` / `rp.py` | 交集件重渲染(报零字节产出) | --- ## 5. ④ 证据等级配平审计:本项目有多少条结论,其证据等级不配标注的等级 ### 5.1 审计口径 `父验` 字样在 `situation-entries.md` 中只出现 **7 次**,但**父验级证据并不只由这个词标记**—— 本项目实际的最高等级证据是「**pdftoppm 渲染 + 目视**」,它散布在 59 个模式里。 因此本轮的口径是:**凡取证结论所依赖的那次渲染的 dpi 与环境**,而不是搜「父验」两个字。 按任务要求分三类统计。 --- ### 5.2 第一类:**200dpi 读出的「排版元素」**(PITFALLS 67) PITFALLS 43 已经实证:同一个章节标题在 30dpi 读成「生化应用系统」、 200dpi「仍不确定」、**600dpi 才读对**。而 PITFALLS 67 定的规矩是 「排版元素一律 400–600dpi;200dpi 复核那条纪律是为**中文条文**设的,不适用于排版元素」。 我把 `situation-entries.md` 中全部 **33 处 200dpi** 逐条按「读的是什么」分类: | # | 位置 | 200dpi 读的是什么 | 是不是排版元素 | 判定 | |---|---|---|---|---| | 1 | L1896 | 【964】封面印 `V4.0`,200dpi 复核为 V4.0 | **封面版本号=排版元素** | **需降级** | | 2 | L2568 | LEGO 页码 40dpi 误作「+3 偏移」,200dpi 复核为**偏移 0** | **页码=排版元素** | **需降级** | | 3 | L3639 | 广发银行**每页页脚**「本手册所示字体和图片仅作手册说明用途…」 | **页脚=排版元素** | **需降级** | | 4 | L4050 | 可口可乐 Zero 物理 p81 **红色小节标题**「4. Familiar Yet Surprising」 | **小节标题=排版元素** | **需降级** | | 5 | L4247 | 【手册VI 320】物理 p81 **红色标题** | **小节标题=排版元素** | **需降级** | | 6 | L6154 | 微软 88/90p 都印 `P.81`;港科大 144/107p 都印 `P.102`(200dpi 目视) | **页码=排版元素** | **需降级** | | 7 | L4734 | NSW 州政府 p6 版权栏 `© Crown in right of NSW…`(标注**父会话 200dpi 逐字**) | **版权栏=排版元素** | **需降级** | **第一类合计:7 条**(另有方太 841 的 `31|32` 已在 PITFALLS 67 单独处理,不重复计数)。 **另有一个反向条目**(已自纠、不需再降级,但必须留着): L2471/L2310 —— 兜底轮在**一条关键证据上 200dpi 误读了页脚小字**, 把「版权限制」读成「完备性默认条款」,据此建立的新类型 **N6 已撤回**。 **这是本项目已经付出过代价的同一条规则,代价已经付过了。** > **注意第 3、4、5 条的性质**:它们支撑的分别是模式 53 的核心引文、 > 以及「familiar 5 处」这条**曾经推翻了旧判定**的纠错结论。 > 第 4/5 条尤其讽刺——**它是一次「提高分辨率后读对了」的纠错,而它自己是用 200dpi 读的**。 --- ### 5.3 第二类:**结论建立在已知损坏件上** 前序 `REPORT-DAMAGE.md` 判定损坏 5 对(形态 1/2/3/4)。逐件核对这些件是否被别的结论引用: | 损坏件 | MD5 | 是否被别的模式引用 | 判定 | |---|---|---|---| | 易至 266(形态 3) | `0c3d5908280a` | 仅作形态 3 的**样本**被引用,**无任何模式以其为证据** | **无需降级** | | 小鹏 217p(形态 1) | `94ab188f061b` / `0889861dbca9` | 模式 59 的样本 | **无需降级** | | NASA 049↔634(形态 2 页序对调) | `c33b23b566f8` / `fcf8c4b3b0fd` | **在交集里**(B 类外链字体) | **结论有效**(见 §3.2) | | 全季 956↔957(形态 4) | — | 记录里明确写「**不可判定哪件是新版**」 | **已合规降级** | | 可口可乐 744(形态 3 封面截断) | `12b480945cfe` | 未进 A/B 交集(未外链字体) | **无需降级** | **第二类合计:0 条需要新降级。** (NASA 两件在交集里,我已单列复核;全季那对本轮就写了「不可判定」,合规。) --- ### 5.4 第三类:**结论建立在已知缺字体件上** 这是本任务的正面问题。答案: | 判定 | 件数 | |---|---:| | **结论作废** | **0** | | **结论需降级** | **0** | | **结论有效**(已逐份重渲染确认) | **11**(A 类交集全部,含易至 266) | **理由**: - **易至 266** 是全库**唯一**真出豆腐块的件,而它**从未被任何模式的证据引用**—— 它只作为「形态 3 的样本」出现在 `REPORT-DAMAGE.md`,且前序**已经正确地**把它归因到字体外链, 没有误记成"这份件坏了"。 - **其余 10 份 A 类交集件**,外部字体都带标准 CMap 或简单字体编码, 实拍确认正常显示,其上已有的结论(含 `REPORT-LEFT2.md` 的 CAD 标题栏逐字转写)**全部成立**。 - **B 类 31 份**中外部字体几乎全是拉丁字体(`ArialMT` 52/`Helvetica` 39…), macOS 全部可替换;最高风险的麦当劳 428(模式 32 的全部结论)**600dpi 实拍确认干净**。 > ### **本任务的总答案:豆腐块没有污染任何一条既有结论。** > > 但这个结论**不是因为我们做对了,而是因为运气**: > 1. 真出豆腐块的只有 1 件,而它恰好没被当证据用; > 2. 剩下的都带标准 CMap,本机恰好能替换; > 3. **一旦换一台机器,或某件文件的字体形态变了,这个结论立刻失效。** > > **所以要固化的是判据(§4 的脚本),不是这份结论。** --- ### 5.5 真正需要降级的:合计 **7 条**(全部属第一类) 按重要性排序(最重要的 5 条): | 序 | 条目 | 出处 | 为什么必须降级 | |---|---|---|---| | **1** | 广发银行**每页页脚**原文「本手册所示字体和图片仅作手册说明用途,在使用之前须获得正式版权后方可使用」 | `situation-entries.md` L3639,模式 53 核心证据 | **页脚小字,PITFALLS 34 明令 400dpi 以上**;且 PITFALLS 34 记录的正是**同类页脚被 200dpi 误读**并据此建出一个后来被撤回的类型 | | **2** | 可口可乐 Zero p81 **红色小节标题**「4. Familiar Yet Surprising」 | L4050 | **章节标题正是 PITFALLS 43 里 200dpi「仍不确定」、600dpi 才读对的那一类**;且此条已被用来推翻旧判定,错不得 | | **3** | 【手册VI 320】p81 **红色标题** | L4247 | 同上 | | **4** | 微软 88/90p 都印 `P.81`、港科大 144/107p 都印 `P.102`(**2 例「同 MD5 不同内容」的全部依据**) | L6154,模式 59 | **页码=排版元素**;且 PITFALLS 12/71 已实证页码比对是最脆弱的一环(跨页常数逐份不同) | | **5** | NSW 州政府 p6 **版权栏** `© Crown in right of NSW through the Department of Customer Service 2022`(标注「**父会话 200dpi 逐字**」) | L4734 | **版权栏=排版元素**,且「父会话逐字」这个标注会让它享受最高免检 | **其余 2 条**:LEGO 页码偏移 0(L2568)、【964】封面 V4.0(L1896)。 > **降级动作**(统一):标 `低置信(读法不合规:排版元素@200dpi)`,留待 400–600dpi 复核。 > **不得追认**——PITFALLS 67 已经因为方太那次「200dpi 恰好读对」写下过: > **「读法不合规的读对一次,不构成读法合规的证据。」** ### 5.6 另外一条与字体无关、但同属「等级不配」的发现 **§3.2 里那条 `无文本层 ≠ 豆腐块`** 提示了一个取页启发式的失效: 本轮用「文本层汉字最密的一页」来挑复核页,**对 10 份无文本层的件全部失效**。 这不影响既有结论(那 10 份都是 B 类),但它意味着: > **任何自动化取页策略在无文本层件上是盲的。** > 若将来用它做全库普查,会系统性地漏掉整类文件——**而整类文件恰好是"只有图没有字"的那类**。 --- ## 6. ★附带发现:`find -name "*.pdf"` 少算 1 件(本轮定位到了) §1.4 那个 1,560 vs 1,561 的差异**已定位**: ``` ./1.【总包】1000+品牌手册合集/【手册VI 239】Santander_桑坦德风格指南.PDF ↑ 大写 .PDF ``` - `find . -name "*.pdf"`(**大小写敏感**)→ **1,560**,漏掉它 - `find . -iname "*.pdf"` / Python `.lower().endswith('.pdf')` → **1,561** 该件字体:`SantanderHeadline-Regular`/`SantanderText-Light`/`SantanderText-Regular` **全部 `emb=yes`** → 归 **C 类**,不影响 A/B 任何计数。 > **这是 PITFALLS 27(`xargs -d` 静默失败)的又一例**: > 命令**不报错、不提示、返回了一个完全合理的整数**, > 只是一个整数——只是少了 1。**差别只在于那个 1 没人核。** > > 本项目的任何全库普查若用了 `-name "*.pdf"`,分母都是 1,560 而非 1,561。 --- ## 7. 结论汇总(§0 占位符的正式回填) ### 7.1 ① 全库 A/B/C 盘点 | 类 | 物理件口径(分母 1,292) | 去重内容件口径(分母 1,054) | |---|---:|---:| | **A** 名义高危:外链 Windows 专有 CJK 字体 | **24**(1.9%) | **21** | | **B** 名义中危:外链非 CJK 字体 | **151**(11.7%) | **130** | | **C** 安全:全部 `emb=yes` | **1,117**(86.5%) | **903** | | (单列)`pdffonts` 0 行 | 269 | 217 | **★ 但真正会出豆腐块的只有 1 件**(`CID`+`Identity-H`):**易至 266 `0c3d5908280a`**, **131 页中 33 页(25.2%)用到外链字体,其中 29 页 >50% 字符来自它**。 **A/B 完整清单**:`/tmp/vi-font/ab_list.tsv`(175 行,含 MD5/文件名/字体名/形态/字节数)。 ### 7.2 ② 与既有取证的交集 **42 份**(A 类 11 / B 类 31)。逐份重渲染实拍后: | 判定 | 份数 | |---|---:| | **结论有效** | **42** | | 结论需降级 | 0 | | **结论作废** | **0** | **实拍 9 张图,零字节产出 0。** 一条逐字核验通过(全季 959 的 CAD 标题栏)。 一条 600dpi 关键复核通过(麦当劳 428 p3 `Gloria Yasein / N0753203`)。 ### 7.3 ③ 工具链 **`/tmp/vi-agents/fontcheck.sh`** —— `./fontcheck.sh ` 判文件,`--page <页码>` 顺带报渲染产出量。 退出码 **0 可用 / 2 豆腐块风险 / 3 无字体信息 / 4 用法错**。已在 5 份已知件上自检通过。 ### 7.4 ④ 证据等级配平 | 类别 | 条数 | |---|---:| | 200dpi 读出的**排版元素**(须降级) | **7** | | 建立在**已知损坏件**上的结论 | **0** | | 建立在**已知缺字体件**上的结论 | **0**(11 份交集全部有效) | | **必须降级合计** | **7** | **最重要的 5 条**:广发银行每页页脚原文(L3639)> 可口可乐 Zero p81 红色小节标题(L4050)> 【手册VI 320】p81 红色标题(L4247)> 微软/港科大「都印同一页码」(L6154)> NSW 州政府 p6 版权栏(L4734)。 --- ## 8. 诚实边界(本轮明确未做 / 未测) | 项 | 状态 | 原因 | |---|---|---| | **A 类 21 件是否每一页都实拍** | **未做** | 只实拍了 6 份(易至266/全季959/万科/太二/谢谢锅 + 600dpi 麦当劳)。其余 15 份**依据字体形态推断为安全,未逐页实拍**。推断不是目视 | | **B 类 31 份的逐页实拍** | **未做** | 只实拍了麦当劳 428(最高风险)与广发 781(渲染产出非零)。其余 29 份仅按字体形态推断 | | **10 份无文本层件的渲染质量** | **未查** | 取页启发式失效;仅万科 79p 与麦当劳 428 已实拍确认 | | **269 件 `pdffonts` 0 行** | **未查** | 纯图像件还是工具失效,无法区分。**未计入任何一类** | | **A=21 与前序 20 差 1 件** | **未定位** | 可能是口径差异,也可能是多算一件。**在定位前不写成"修正"** | | **换一个渲染机是否仍是这个结论** | **不可能测** | 豆腐块依赖渲染机字体。**本轮全部结论只对这台机器成立** | | **`页面级`豆腐块检测的通用性** | **未验证** | `pages_ext.py` 只在易至 266 上跑过,并用 3 次目视交叉验证;未在其他件上验证假阳性率 | | **OCR** | **未使用** | 按纪律禁用(本机缺 `chi_sim`) | ## 9. 给父会话的三条可直接落库的操作结论 1. **`emb=no` 不是判决,`CID`+`Identity-H` 才是。** 名义 A 类 21 件 → 真风险 1 件。 `fontcheck.sh` 已把这条判据固化成可执行命令,**建议并入派发模板的开工前步骤**。 2. **豆腐块是逐页属性,不是文件属性。** 同一份文件里 p7 干净、p30/p45 全是方块; 甚至同一页上,**图形里的 logo 清晰、正文是方块**——**一眼扫过去像正常排版页**。 ⇒ **凡渲染大面积豆腐块,先跑 `pdffonts`,不要先下「这份件坏了」的结论**(PITFALLS 78 第 1 条,本轮给出页级量化)。 3. **本轮没有污染任何既有结论,但那是运气不是方法。** 真正要固化的不是这个结论, 而是 §4 的判据——因为**换一台机器,这个结论立刻失效**。 另有 **7 条 200dpi 排版元素结论必须降级**(§5.5),这与字体无关,是本轮独立查出的欠账。