=== PaddleOCR-VL 对抗性审查 === --- 组 1: Markdown 提取抗攻击 --- [PASS] CRLF/CR/LF 混合换行正确分割为 4 行 → got 5 [PASS] 所有行无残留 \r [PASS] 空响应不报错,返回 [] → got 0 lines [PASS] markdown.text 缺失 → 只返回页分隔符 → got 1 [PASS] 大量空行过滤: 只保留 1 行内容 + 1 行页分隔符 → got 2 [PASS] Unicode(中文标点、全角空格、货币符号)保留无损 → got 5 [PASS] 第一行含全角括号的公司名称完整 --- 组 2: 错误分类 & 指数退避 --- [PASS] API code 17 可重试 [PASS] API code 18 可重试 [PASS] API code 215 可重试 [PASS] API code 224 可重试 [PASS] API code 4008 可重试 [PASS] API code 4009 可重试 [PASS] API code 4010 可重试 [PASS] API code 400 不可重试 [PASS] API code 401 不可重试 [PASS] API code 403 不可重试 [PASS] API code 4004 不可重试 [PASS] 第 1 次重试: 1s [PASS] 第 2 次重试: 2s [PASS] 第 3 次重试: 4s [PASS] 第 4 次重试: 8s [PASS] 第 5 次重试: cap 在 8s [PASS] 第 10 次重试: 仍在 8s 上限 --- 组 3: recognizePdf 异常路径 --- [PASS] 文件不存在 → success=false [PASS] 文件不存在 → error 含中文“不存在” [PASS] 文件不存在 → attempts=0 [PASS] 文件不存在 → all_text_lines=[] [PASS] 路径是目录 → success=false [PASS] 错误返回结构完整(含 success/attempts/error/all_text_lines) [PASS] 假 PDF 文件 → 发 HTTP 后失败(success=false) [PASS] 假 PDF 文件 → attempts > 0 (尝试过或内部处理) [PASS] MAX_FILE_SIZE = 50MB [PASS] RETRY_BASE_DELAY = 1s [PASS] RETRY_MAX_DELAY = 8s [PASS] MAX_RETRIES = 3(含原始调用共 4 次) --- 组 4: 内存安全 --- [PASS] 处理 10000 行 Markdown 不崩溃 (2MB delta) → got 10001 lines [PASS] 20 页文档 → 提取正确 → got 80 lines (expect 20 × 4 = 80) --- 组 5: VATDocumentGenerator 兼容性契约 --- [PASS] implode($all_text_lines) 无警告 → text length=56 [PASS] raw_data 可 JSON 编码 [PASS] raw_data JSON 解码结构一致 [PASS] 真实 API raw_data 可 JSON 保存 --- 组 6: 安全与配置 --- [PASS] 所有 logger 调用不引用 $this->apiKey [PASS] 代码中存在 $this->apiKey 的定义(构造函数接收) [PASS] CURLOPT_SSL_VERIFYPEER = true(防 MITM) [PASS] CURLOPT_SSL_VERIFYHOST = 2(完整校验) [PASS] 构造函数拒绝空 apiKey --- 组 7: 端到端真实 HTTP 测试 --- [PASS] 真实 API Key + 测试 PDF 都存在,执行端到端测试 [PASS] 测试 PDF 大小: 362.61 KB [PASS] 端到端: success=true → 4.50s, attempts=1 [PASS] 端到端: all_text_lines 非空 → 44 lines [PASS] 端到端: page_count > 0 → 3 pages [PASS] 端到端: 文本内容含公司/注册关键字 [PASS] 端到端: implode 输出长度合理(< 2MB) → 4.99 KB [PASS] 端到端: implode 不含 "Array" [PASS] 端到端: raw_data 保存到 JSON 文件 → 59.9 KB === 对抗性审查结果: 56 通过, 0 失败 ===