Skill v1.0.1
Automated scan82/100+18 new
version: "1.0.1" name: enterprise-analysis description: AI产业链企业六维分析(企业介绍/核心人物/技术知识产权/经济数据/供应链/竞争格局)。输出MD+PDF+DOCX三种格式,含图片嵌入。
企业分析 · AI产业链企业六维分析
约束规则(必须遵守)
- 维度锁定:最终报告有且仅有以下六个维度,不得增减、合并或扩展:
① 企业介绍与主营业务 / ② 核心人物 / ③ 技术与知识产权 / ④ 经济贡献与经营数据 / ⑤ 供应链与区域布局 / ⑥ 竞争与市场结构
- 制品固定:每个分析必须生成且仅生成三种文件:
[公司名]_企业分析.md— Markdown 报告[公司名]_企业分析.pdf— PDF 报告(含图)[公司名]_企业分析.docx— Word 报告
- 数据溯源:每项数据必须标注来源,禁止编造,多源交叉验证。
- 篇幅限制:PDF最终产物不超过两页A4。所有内容(含图片)必须压缩在2页内,经济数据表固定10项指标(见下文模板),不限制具体行数但需控制列宽和字号(≤9pt)。
- 相关产品展示:报告底部(数据源上方)增设"相关产品"视觉展示区,展示至少4个不同领域的产品图片,每个领域选最具代表性的1个,并排展示。这是视觉/版面元素,不属于分析维度,不违反第1条的维度锁定。纯互联网公司无实体产品时,展示代表性App图标(使用simpleicons或官网下载),同样≥4个。
- 模板性质:下方报告模板为内容指引,PDF实际排版需按两页限制做密度优化,并非逐字逐段输出。
- 语言:若用户用中文提问,全部输出为中文(包括报告内容、表格头、来源标注)。
用法
企业分析 <公司名> <官网域名> <英文名>
示例:
企业分析 百度 baidu.com baidu企业分析 NVIDIA nvidia.com nvidia企业分析 比亚迪 byd.com企业分析 华为 huawei.com huawei企业分析 深圳格芯集成电路装备 grandtec-ic.com
工作流
Step 0 — 优先检查本地工作空间
在任何网络搜索前,先检查用户工作空间中是否有该公司的已有分析文件。用户可能在 ~/Progress/analysis/v1.*/ 下维护了结构化的企业分析目录(如 格芯集成电路_产业安全分析.md),六维数据已存在,直接复用远比重新搜集高效。
找到已有文件后,extract其中的核心人物/经营数据/技术专利等信息并交叉验证时效性即可。如果在本地找不到现成分析,再进入 Step 1。
Step 1 — 数据搜集
使用 delegate_task 并行搜集以下三类数据(并发3个子任务):
| 任务 | 内容 | |
|---|---|---|
| 经营数据 | 最近3年(本年/上一年/前年)的10项固定指标:营业总收入、营收同比增速、毛利率、归母净利润、净利率、经营活动现金流净额、研发投入、研发占营收比、员工总数、总资产。标注数据来源。详见 references/financial-indicator-template.md | |
| 核心人物 | 创始人/CEO、当前管理层、轮值制度(如有)。报告时只用创始人/董事长作为代表性人物,无需列出全部管理层 | |
| 技术专利 | 累计专利数、PCT申请、标准必要专利份额、国标/行标参与 |
要求每个子任务输出结构化摘要,包含数据来源。
数据来源分级(按优先级):
| 企业类型 | 营收/利润/现金流/资产/毛利率 | 研发投入 | 员工 | 来源工具 | |
|---|---|---|---|---|---|
| A股上市 | ✅ 年报(巨潮/东方财富/同花顺) | ✅ 年报可查 | ✅ 年报可查 | akshare.stock_financial_abstract_ths() | |
| 美股上市 | ✅ SEC 10-K年报(sec.gov EDGAR) | ✅ 10-K可查 | ✅ 10-K可查 | 浏览器搜索 + curl解析iXBRL | |
| 港股上市 | ✅ 年报(港交所/雅虎财经) | ✅ 年报可查 | ✅ 年报可查 | yfinance | |
| 已提交IPO申请(未上市) | ✅ 招股说明书 | ✅ 可查 | ✅ 可查 | 搜狗搜索新闻摘要 + 上交所/港交所官网。科创板/创业板招股书含3年完整财务数据,不要默认"未公开披露",先搜"公司名+招股说明书+营收"确认。示例:宇树科技2026年3月科创板IPO,招股书营收1.59亿→3.93亿→16.99亿 | |
| 非上市大企业 | 官网/新闻稿/搜狗搜索 | 部分可查 | ✅ | 官网+百度百科+搜狗 | |
| 中小企业 | 搜狗注册信息(仅营收估算) | ❌ | ✅ 官网 | 标注"未公开披露" |
注册信息前置采集:在执行以上子任务之前,先用 curl 获取该公司的基本工商注册信息(注册资本、成立日期、法定代表人、企业类型),作为报告的 baseline 数据。详见 references/company-registration-scraping.md — 当企查查/天眼查不可达时,用官网 + 搜狗搜索组合拳获取这些字段。
Step 2 — 撰写六维报告(自然语句风格)
以连贯的自然语句撰写,避免标签+符号分隔的简历式格式。禁止使用 `·` 间隔符做字段分隔,应将信息整合为完整通顺的介绍语句。
参考风格(每个维度一段话,而非列表):
## ① 企业介绍与主营业务> [公司名]成立于[年份],[上市/未上市],总部位于[城市],是国内领先的[定位]。公司主营业务为[一句话概括],覆盖[领域A]、[领域B]、[领域C]等行业。## ② 核心人物> **[姓名]** · 创始人、董事长 · [籍贯] · [毕业院校] · [关键履历一句话]## ③ 技术与知识产权> 公司坚持[技术路线],累计获得发明专利[X]项、软件著作权[X]项。参与制定国标[X]项,[年份]年研发投入[X]亿元(占营收[X]%),研发人员[X]人。## ④ 经济贡献与经营数据(最近3年,固定10项指标)| 指标 | 2023年 | 2024年 | 2025年 ||------|--------|--------|--------|| 营业总收入 | 填入 | 填入 | 填入 || 营收同比增速 | — | 自动计算 | 自动计算 || 毛利率 | 填入 | 填入 | 填入 || 归母净利润 | 填入 | 填入 | 填入 || 净利率 | 自动计算 | 自动计算 | 自动计算 || 经营活动现金流净额 | 填入 | 填入 | 填入 || 研发投入 | 填入 | 填入 | 填入 || 研发占营收比 | — | 自动计算 | 自动计算 || 员工总数 | 填入 | 填入 | 填入 || 总资产 | 填入 | 填入 | 填入 |> 每个公司统一使用相同指标模板。非上市企业不可获取的字段标注"未公开披露"。计算项(营收同比增速/净利率/研发占营收比)在表格中填入计算结果。## ⑤ 供应链与区域布局> 公司核心芯片/技术来自[供应商],[国产化程度]。总部位于[城市],研发中心分布于[多个城市],生产基地位于[多个城市]。旗下子公司包括...## ⑥ 竞争与市场结构> [公司名]在[行业]领域属于[规模级别]企业(营收约[X]亿元),主要竞争者包括...。公司差异化优势在于...。需关注的风险包括...
⚠️ 两页版说明:以上模板为内容指引。PDF实际排版需做压缩——blockquote 内用自然语句而非·分隔,禁止使用 `·` 间隔符做字段分隔(如**定位**:软件服务商 · A股上市 · 长沙),应将信息整合为完整通顺的介绍语句(如"公司总部位于长沙,成立于1996年,在深交所A股上市")。表格字号≤9pt,边距1.3-1.5cm。
### Step 3 — 图片搜集(强制执行,无图不交付)**图片是报告的必需组成部分,严禁跳过。** 三张图缺一不可。#### Step 3a — 优先使用用户提供的图片在开始自动抓取前,检查用户工作目录中是否有预置图片:
用户可在 image/ 目录下预先放入以下文件(可选全部或部分):
logo.png / logo.jpg / logo.svg ← 公司 Logo
founder.png / founder.jpg ← 创始人照片
product_.png / product_.jpg ← 产品图(至少4张)
image_dir="./image" found_existing=false
Logo
for f in "$image_dir"/logo.*; do [ -f "$f" ] && echo "✅ 使用已有 Logo: $f" && found_existing=true && break done [ "$found_existing" = false ] && echo "⏳ Logo 需要自动抓取"
创始人照片
found_existing=false for f in "$image_dir"/founder.*; do [ -f "$f" ] && echo "✅ 使用已有创始人照片: $f" && found_existing=true && break done
产品图
count=$(ls "$image_dir"/product_* 2>/dev/null | wc -l) [ "$count" -ge 4 ] && echo "✅ 使用已有产品图 ${count}张" || echo "⏳ 产品图不足(${count}/4),需要自动抓取"
找到的图片跳过抓取阶段,直接进入 Step 4 的 base64 嵌入。部分缺失时仅抓取缺失项。#### Step 3b — 自动抓取缺失图片首选用配套脚本全自动抓取:
python3 scripts/fetch_images.py \ --company "$公司名" \ --domain "$域名" \ --english "$英文名" \ --founder "$创始人名" \ --output ./image/
脚本自动执行以下流程,依次尝试各来源,**找到即停**:- **Logo**: simpleicons.org → 官网HTML解析(icon/og:image/logo图) → 常见路径- **创始人**: 百度百科 → 官网关于我们页面(排除产品和logo类图片)- **产品图**: 官网产品页(支持懒加载 data-src) → 产品详情子页面**脚本特性:**- 自动去重:产品图不会与已下载的logo/创始人图重复- 图片有效性校验(PIL verify,不只是看HTTP status)- 跳过返回HTML的无效响应- User-Agent轮换防拦截全部失败才标注"图片待补充"。同时输出图片需求清单供跟踪:
图片需求:
- id: logo 描述: "公司Logo" 来源: "simpleicons/官网" 状态: 待抓取
- id: founder 描述: "创始人照片" 来源: "百度百科/官网" 状态: 待抓取
- id: product 描述: "核心产品图" 来源: "官网产品页" 状态: 待抓取
#### Logo 抓取(按优先级依次尝试,找到即停)| 优先级 | 方法 | 说明 ||--------|------|------|| ① | `curl -sL https://cdn.simpleicons.org/<英文名>` | SimpleIcons CDN(Cloudflare),国内可达,覆盖~80%科技公司 || ② | WebSearch 中文搜索 + curl | 搜"公司名 logo 百度百科",从中文网页提取图片直链下载 || ③ | curl 官网 `grep -iE 'icon\|favicon\|og:image'` | 从官网HTML提取favicon或og:image URL → curl下载 || ④ | WebSearch 英文兜底 + curl | `公司英文名 press kit logo` → curl下载 |
下载后必须检查是否为有效图片
curl -sL <图片URL> -o /tmp/logo_check file /tmp/logo_check # 应输出 "PNG/JPEG/SVG image data"
如输出 "HTML document" → 非图片,跳过
#### 创始人/CEO照片抓取**最高优先级:百度百科**(使用 curl 绕过 requests 的 Baidu 403 拦截)。`fetch_images.py` 自动执行,手动备选:| 优先级 | 方法 | 说明 ||--------|------|------|| ① | 百度百科(curl直连,绕过requests的UA检测) | `curl -sL "https://baike.baidu.com/item/人物名?fromModule=lemma_search-box" -H "Cookie: BAIDUID=..."` 提取 `bkimg.cdn.bcebos.com` 图片URL || ② | 官网关于我们/团队页面 | 过滤logo/icon/product类图片,优先含 people/team/headshot 关键词的URL || ③ | WebSearch 英文兜底 | `founder name photo official` |#### 产品图抓取**优先搜索国内中文站点**,按优先级依次尝试:| 优先级 | 方法 | 说明 ||--------|------|------|| ① | WebSearch 中文搜索 + curl | 搜"公司名 产品 评测",从汽车之家/中关村在线/太平洋科技/IT之家等国内媒体找图 || ② | curl 官网产品页 `grep -i img` | 从官网产品页提取大图URL,优先含 `large`/`high`/`1920` 的链接 || ③ | WebSearch 通用英文兜底 | `company product official photo press` |关键技巧:- **中文搜索优先**:国内科技媒体(汽车之家、中关村在线、太平洋科技、IT之家等)图片走国内CDN加速,下载成功率高- 对懒加载网站,检查 `data-src`、`data-original` 属性- 图片URL优先选**大分辨率**(含 `large`、`high`、`1920` 等关键词)#### 图片源可达性(实测)**⚠️ 关键发现:WebFetch ≠ 真实网络。** WebFetch 工具有域名安全策略,会拒绝访问 nvidia.com 等知名站点。但 **curl/Bash 不受此限制**。图片抓取阶段应**全部用 Bash(curl) 下载**,WebFetch 仅用于分析HTML文本。**国内可达源 ✅(优先使用)**| 来源 | 说明 ||------|------|| `cdn.simpleicons.org`(Cloudflare) | SimpleIcons,知名公司Logo首选,curl直达 || 百度系(baidu.com / baike.baidu.com) | 中文搜索Logo/产品图首选 || 国内科技媒体(汽车之家/中关村在线/太平洋/IT之家等) | 含大量产品实拍图,国内CDN加速 || 公司官网(通过 Bash curl) | 官网路径需摸索但连接可达 |**国内不可达源 ❌**| 来源 | 原因 ||------|------|| `upload.wikimedia.org` / Wikipedia | 网络层阻断(TLS握手超时) || Google系(含 `s2/favicons`) | 网络层阻断 || `logo.clearbit.com` | DNS无法解析 || `raw.githubusercontent.com` | HTTP 403 || 境外官网CDN(如 `images.nvidia.com`) | 连接可达但具体路径需摸索 |#### 实操策略速查
Logo 抓取: ① curl cdn.simpleicons.org/{英文名} ② WebSearch 中文"公司名 logo" → 百度百科 → curl图片URL ③ curl 官网 | grep -iE 'icon|favicon|og:image' → 提取URL → curl下载
产品图抓取: ① WebSearch 中文"公司名 产品 评测" → 国内科技媒体 → curl图片URL ② curl 官网产品页 | grep -iE 'img.jpg|img.png' → 提取URL → curl下载
兜底: 全部失败则纯文字输出,标注 [图片待补充]
嵌入报告时使用 `[图片:类型:描述]` 占位标记:- `[图片:logo:xxx]` → h1同一行右上角,height=28px,右浮动(不单独占行),两页版必用此模式- `[图片:founder:xxx]` → "核心人物"板块右侧,矩形(非圆形),`align-items: stretch` + `object-fit: contain` 使图片高度与文字栏一致,`max-height: 110px`,圆角4px,带品牌色边框- `[图片:product:xxx]` → 用于"相关产品"展示区(PDF底部),至少4个不同领域产品图标并排,width≤100px;纯互联网公司用App图标统一展示- `[图片:app:xxx]` → 互联网公司App图标,width≤60px,与产品图同样式统一展示### Step 4 — 生成HTML并转PDF创建自包含HTML文件(所有图片base64嵌入),用 weasyprint 转PDF。**嵌入图片前先检测用户提供的图片:**
import os, base64 img_dir = './image'
def find_image(prefix): """查找用户提供的或自动抓取的图片,支持多种扩展名""" for ext in ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg']: path = os.path.join(img_dir, prefix + ext) if os.path.exists(path): return path # 也支持 product_.png 通配 if prefix.startswith('product_'): import glob files = sorted(glob.glob(os.path.join(img_dir, 'product_'))) return files[0] if files else None return None
def b64(path): if not path: return None with open(path, 'rb') as f: data = f.read() # 灰度JPEG转RGB from PIL import Image; from io import BytesIO img = Image.open(BytesIO(data)) if img.mode in ('L', 'RGBA'): rgb = img.convert('RGB'); buf = BytesIO() rgb.save(buf, 'JPEG', quality=85); data = buf.getvalue() return base64.b64encode(data).decode('ascii')
logo_b64 = b64(find_image('logo')) or '' founder_b64 = b64(find_image('founder')) or '' product_b64s = [] for i in range(1, 5): path = find_image(f'product_{i}') or find_image(f'product_0{i}') if not path: # 按通配查找 import glob files = sorted(glob.glob(os.path.join(img_dir, 'product_*'))) if len(files) >= i: path = files[i-1] if path: product_b64s.append(b64(path))
PDF底部必须包含 **相关产品展示区**(至少4个不同领域产品并排),CSS模板见 `references/product-showcase-template.md`。关键坑:`<img>` 的 `src` 属性必须用**单引号** `src='data:...'`,不能用双引号。详见陷阱6。### Step 5 — 生成DOCX`pandoc [公司名]_企业分析.md -o [公司名]_企业分析.docx`## PDF排版要求### 字体路径(先验证,再生成)
生成PDF前必须验证字体文件存在(Ubuntu 22.04位置)
ls /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc 2>/dev/null
如不存在,尝试:
apt install fonts-noto-cjk
⚠️ **关键坑:字体路径必须指向 opentype/noto/,不是 truetype/noto/**- ✅ 正确:`url('file:///usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc')`- ❌ 错误:`url('file:///usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc')`- `truetype/noto/` 下只有 emoji/mono 字体,**不含 CJK 字符集**。路径错了则全篇中文用回退字体渲染,所有排版优化无效。### 分页控制(必加)
/ 防止标题孤行、表格断裂、图片跨页 / h2, h3 { page-break-after: avoid; } table { page-break-inside: avoid; } .founder-row { page-break-inside: avoid; } .product-section { page-break-inside: avoid; } .bq { page-break-inside: avoid; } body { widows: 2; orphans: 2; }
### 字体与字号层级| 层级 | 字号 | 字重 | 说明 ||------|------|------|------|| h1 | 20-22pt | Bold | 品牌色,letter-spacing 2px || h2 | 13pt | **Medium** 或 Bold | 与正文拉开明显层级(>3pt差距),Border-bottom 1.5px || 正文 p | 10-10.5pt | Regular | line-height 1.9,text-align: justify || blockquote .bq | 9.5-10pt | Regular | line-height 1.85-1.9,padding 0.5em 0.8em || 表格 | 9pt | Regular | 单元格 padding ≥4px 8px || 产品标签 | 8.5pt | Regular | 副标签 ≥7.5pt || 数据源 | 7.5pt | Regular | 浅灰色 #94a3b8 |### 表格设计规则1. **数字右对齐**:数值列(年份列)必须 `text-align: right` + `font-variant-numeric: tabular-nums`(等宽数字),指标名左对齐2. **负值红色标识**:用 `<span class="neg">` + CSS `.neg { color: #DC2626; }` 标记亏损/负增长3. **单元格内边距**:th min 5px 10px,td min 4px 10px(2-3px太局促)4. **顶底边线**:`table { border-top: 2px solid var(--brand); }` + `tr:last-child td { border-bottom: 2px solid var(--brand); }` 闭合表格5. **斑马线**:`#F1F5F9` 或 `#EFF6FF`(比 #f8fafc 更明显)### 色彩层次系统
:root { --brand: #2563EB; / 主品牌蓝:标题、关键强调 / --brand-dark: #1D4ED8; / 深蓝:表头背景 / --brand-light: #DBEAFE; / 浅蓝:标签背景 / --text-primary: #0F172A; / 主文字 / --text-secondary: #475569; / 次要文字 / --border: #E2E8F0; / 边框 / } .neg { color: #DC2626; } / 负值红色 / tr:nth-child(even) td { background: #F1F5F9; }
### 其他PDF要求- A4纸张 · 边距 **1.5-1.8cm**(不低于1.3)- **h1只用公司名**(如"华为""NVIDIA"),不附加"企业分析"或股票代码。h1与logo flex同行(h1左 logo右),字号20-22pt品牌色- blockquote 使用 `text-align: justify` 两端对齐,line-height ≥ 1.85- 段落 margin-bottom ≥ 0.3em- h2 上间距 ≥ 0.65em,下间距 0.25em- `.hl { color: var(--brand); font-weight: bold; white-space: nowrap; }` — 新增 `white-space: nowrap` 防止两端对齐拉伸英文品牌词之间的空格。对于 "GeForce RTX" 等含空格的英文词组,还需将空格替换为 ` `(如 `GeForce RTX`),因为 `white-space: nowrap` 只禁止换行,`text-align: justify` 仍可拉伸普通空格- 去掉所有`---`分隔线,板块间用自然间距分隔- **相关产品展示区**:标题"相关产品"12pt,产品图 width≥100px,gap≥0.8em。可用浅灰背景框 `background: #F8FAFC; border-radius: 6px; padding: 0.6em 0.8em` 与上文视觉隔断- **创始人图片**:`width: auto; max-height: 110px; object-fit: contain` — 使用 `align-items: stretch` + `width: auto` 让图片高度与文字栏一致,`object-fit: contain` 保持原始宽高比。父容器 `.founder-row { display: flex; align-items: stretch; flex-direction: row-reverse; }`- 产品标签 font-size ≥ 8pt,副标签 ≥ 7pt使用 `:root { --brand: 华为#cf0a2c / 百度#2932e1 / NVIDIA#76b900; }` CSS自定义属性统一品牌色## 参考文件- `references/huawei-analysis-workflow.md` — 华为分析实战记录(数据源、CDN拦截、输出结构)- `references/2page-layout-pattern.md` — 两页版HTML/CSS排版模板与技巧(包括h1+logo并排、base64引号陷阱、品牌色表、产品展示区)- `references/private-company-analysis.md` — 非上市/中小企业六维分析指南(数据缺失处理、官网图片抓取、实战案例)- `references/company-registration-scraping.md` — 中国公司注册信息抓取实战- `references/workspace-fallback-pattern.md` — 网络不可达时的工作区回退模式- `references/executive-research-guide.md` — 企业高管背景研究方法- `references/image-fetching-pitfalls.md` — 图片抓取防坑记录(百度百科403curl应对、JS渲染页面替代源、去重策略)- `references/grayscale-jpeg-fix.md` — 灰度JPEG(mode L)导致weasyprint渲染失败的原因与修复- `references/workspace-git-workflow.md` — 企业分析仓库布局、工作空间结构、推送流程与相关仓库区分- `references/financial-indicator-template.md` — 固定10项财务指标模板 + 3年数据规范 + 数据来源分级- `references/page-balance-technique.md` — 两页PDF排版失衡时("版块以较少内容单独成页")的反向调优技巧- `references/chinese-typography.md` — 中文排版CSS最佳实践(字号层级、两端对齐、自然语句风格、两页均衡策略)- `references/pdf-layout-checklist.md` — PDF排版检查清单(生成前逐项核对:字体路径/表格对齐/分页控制/色彩层级)## 陷阱与注意事项1. **Web搜索/联网不可达时的工作区回退**:当用户拒绝网络搜索或网络不可达时,不要停止工作。优先搜索用户工作目录(如 `~/Progress/analysis/`、当前cwd)下是否有该公司的既有分析文件。如存在,提取结构化数据并标注"数据来源:已有存档,需交叉验证",然后尝试增量补缺。2. **专利数据口径不一致处理**:不同来源可能报告不同的专利数字(如"累计139项发明及实用新型" vs "40余项发明专利")。如果无法确定数字间的包含关系(40+项发明是否在139项总数内),在报告中明确标注两个数字的关系含糊,并优先使用可信来源(官方年报 > 百度百科 > 第三方咨询)。不要替用户做归并假设。3. **技术知识产权板块不仅包含专利**:还应包含软著(软件著作权)、省市级研发平台(如"广东省集成电路封测设备工程技术研究中心")、承担过的国家重大科技专项(如"02专项")。这些是"知识产权"维度的重要组成部分。4. **厂商CDN可能拦截curl**:部分企业官网(如华为 consumer-img.huawei.com)会拒绝无浏览器User-Agent的curl请求,返回HTML而非图片。应对策略:5. **SPA网站(Nuxt.js/Vue/React)没有服务端渲染图片URL**:拓维信息 talkweb.com.cn 使用 Nuxt.js,所有产品页/首页内容由 JS 动态渲染。fetch_images.py 的 `requests` + HTML regex 抓取不到任何图片URL。实战胜率极低。应对策略:- **Logo → 直接 curl favicon.ico + PIL 转 PNG**:`curl -sL https://www.{domain}/favicon.ico -o /tmp/favicon.ico; python3 -c "from PIL import Image; Image.open('/tmp/favicon.ico').convert('RGB').save('image/logo.png')"`。SPA 站点通常至少配了 favicon。- **产品图 → 生成彩色占位图**:所有图片源均失败时,用 PIL 生成 200×140 的色块 + 品名文字标注作为产品图。避免纯文字输出"图片待补充"降低报告观感。示例代码见 `references/spa-image-fallback.md`。- 优先从第三方源(百度百科、科技媒体)获取产品图- 如官网CDN不可达,使用 `-H "User-Agent: Mozilla/5.0 ..."` 重试- 产品图兜底:logo本身作为产品占位图,或留白标注"图片待补充"- 不编造、不使用侵权图片6. **境外图片源可能超时**:Wikimedia、GitHub等境外源可能不可达。优先使用国内CDN源(baidu.com、bcebos.com、jd.com等)。7. **PDF嵌入图片**:weasyprint渲染使用 `data:image/...;base64,...` 格式嵌入,不可使用外部URL。**关键坑**:Python生成HTML时,`<img>`的`src`属性必须用**单引号** `src='data:...'`,不能用双引号 `src="data:..."`。weasyprint解析 `src=\\"..."`(Python escaping产生的转义)会报 `File name too long` 错误。✅ 正确写法:`f"<img src='{b64data}'>"` ❌ 错误写法:`f'<img src="{b64data}">'`8. **数据时效性**:优先从最新年报(公司官网/证监会网站)获取经营数据。PCT/SEP数据在WIPO/3GPP网站可查。9. **并发搜集**:使用 delegate_task 并发3个子任务(经营数据、核心人物、技术专利),每个任务要求返回结构化带来源的数据。10. **灰度JPEG导致weasyprint渲染失败**:PIL mode L(灰度,1通道)的JPEG图片在weasyprint base64内嵌时显示为空白或报参数错误。所有JPEG图片入HTML前必须检查模式:`if im.mode == 'L': im = im.convert('RGB')`。`fetch_images.py` 的 `download()` 已自动处理,手动添加的图片需注意。11. **百度百科创始人照片体积过大**:百度百科下载的创始人照片原始分辨率可能很大(实测 4480×6720px,8+MB),直接 base64 嵌入导致PDF膨胀至8+MB。入HTML前必须压缩:```pythonfrom PIL import Imageimg = Image.open('founder.png')img.thumbnail((400, 500), Image.LANCZOS) # 缩小到合理尺寸if img.mode == 'RGBA': img = img.convert('RGB')img.save('founder_compressed.jpg', 'JPEG', quality=80, optimize=True)```压缩后约 15-30KB,视觉差异极小。此步骤应在 base64 嵌入之前执行。12. **两页PDF排版失衡**:当第二页仅包含产品展示区+数据源等少量内容时,不要直觉性地缩小字号试图"拉回"内容。应反向操作——增大的字号+行高+间距,让页1内容自然溢出到页2,同时单独放大页2各元素的视觉占位(blockquote字号+0.5pt、产品图面积翻倍等)。详细方法论见 `references/page-balance-technique.md`。13. **核心人物板块独立布局**:用户明确要求核心人物板块不应与其他维度(如技术与知识产权)分栏并排。核心人物应单独一栏全宽展示,创始人照片在右侧(flex-direction: row-reverse)。若内容少只保留创始人一人即可,不需要列出所有管理层。14. **中文排版偏好**:用户偏好自然语句叙述而非标签式列表。正文应使用 text-align: justify 两端对齐,line-height >= 1.8 保证中文可读性。blockquote 内用完整句子而非 **字段名**:值 · 值 · 值 格式。15. **字体与字号层级**:h1=20-22pt 品牌色,h2=13pt 加下边线 Medium字重,正文=10-10.5pt,blockquote=9.5-10pt,表格 >= 9pt。产品图标签 >= 8.5pt 副标签 >= 7.5pt。使用 :root { --brand: #2563EB; } 统一品牌色,body 文本色用 slate-800(#1e293b)而非纯黑。15. **@font-face 路径指向 /usr/share/fonts/opentype/noto/ 而非 truetype/noto/**:Ubuntu 22.04 的 Noto Sans CJK 字体文件在 `/usr/share/fonts/opentype/noto/` 目录下。`truetype/noto/` 只有 emoji 和 mono 字体,不含 CJK 字符集。路径写错(指向 truetype)时 WeasyPrint 不会报错,但会回退到系统默认字体渲染中文,导致字距凌乱、排版效果全失。**生成PDF前必须验证**:```bashls /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc```@font-face 的 src 值:```csssrc: url('file:///usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc') format('truetype');```16. **表格数字必须右对齐**:财务表格的数值列如果左对齐,不同位数的数字(如"4,496万" vs "31.54亿")无法纵向比较。CSS 方案:```csstable td:nth-child(2), table td:nth-child(3), table td:nth-child(4) { text-align: right; font-variant-numeric: tabular-nums; }table td:first-child { text-align: left; }```17. **表格负值用红色标识**:`-1.005亿`、`-22.79%` 等负值必须用 `<span class="neg">` 包裹并添加 CSS `.neg { color: #DC2626; }`。这是财务报告行业惯例。18. **表格必须闭合(顶边线+底边线)**:仅有行间横线但无顶底边框线的表格在页面中缺乏视觉边界。必须添加:```csstable { border-top: 2px solid var(--brand); }tr:last-child td { border-bottom: 2px solid var(--brand); }```19. **段落间距不足导致阅读疲劳**:`p { margin-bottom: 0.15em }` 在中文排版中过密,段落间几乎无视觉分割。最小值 `0.5em`。长段落应使用 `<p>` 标签分隔而非 `<br><br>`,利用自动 margin 形成均匀间距。20. **缺少 widows/orphans 控制导致版面凌乱**:WeasyPrint 默认不会避免 h2 标题位于页面底部而内容在下页、或表格在行中间断裂。必须添加:```cssh2, h3 { page-break-after: avoid; }table, .founder-row, .product-section, .bq { page-break-inside: avoid; }body { widows: 2; orphans: 2; }```21. **缺乏色彩层次导致"一片蓝"**:所有强调元素(h1/h2/h3/table th/.hl/.tag/border-left)使用同一蓝色 `#2563EB` 时,页面缺少视觉梯度。引入深蓝/浅蓝变体:```css:root {--brand-dark: #1D4ED8; /* 表头背景 */--brand-light: #DBEAFE; /* 标签背景/修饰 */}table th { background: var(--brand-dark); }.tag { background: var(--brand-light); color: var(--brand-dark); }```22. **justify对齐拉伸英文词组间距**:`text-align: justify` 在中文段落中对英文词组(如"GeForce RTX")之间的空格施加两端对齐拉伸,导致预期外的空白。`white-space: nowrap` 可防止换行但**不阻止 justify 拉伸内部普通空格**。修复方案分两层:① `.hl` 类添加 `white-space: nowrap` 防止整体换行;② 英文词组内部的空格替换为 ` `(如 `GeForce RTX`),非断行空格不受 justify 拉伸。