把描摹 SVG 封装成 Illustrator 原生 .ai:reportlab DeviceCMYK PDF + PyMuPDF 注入 XMP
一句话结论
vtracer 描摹产出的是 SVG,要交付给印刷/Illustrator 必须封装成 .ai 原生可编辑文件且保留 DeviceCMYK 分色。链路:解析 SVG 取 <path> 填充 → reportlab 生成 DeviceCMYK 矢量 PDF(300dpi 页面映射) → PyMuPDF 打开 PDF、注入 Illustrator 参考文件 XMP 元数据、另存 .ai。
场景与触发
- 源:vtracer 彩色描摹后的 SVG(已先转 RGB 的位图描摹所得)。
- 目标:Illustrator 可直接打开、可编辑路径、印刷用 CMYK。
- 页面映射:
1280px / 300dpi * 72 = 307.2pt ≈ 10.84cm。
精确报错 / 关键输出 ⭐
校验嵌入图色彩空间时写了 doc.get_images(full=True),直接炸(已复现原文):
AttributeError: 'Document' object has no attribute 'get_images'
Traceback (most recent call last):
File ".../_fitz_err.py", line 5, in <module>
imgs = doc.get_images(full=True)
^^^^^^^^^^^^^^
AttributeError: 'Document' object has no attribute 'get_images'
根因:本机 PyMuPDF 1.28.0 的 get_images 在页面级(page.get_images()),不在 Document 级。
解决过程与命令(可复制)
import fitz
# 1) 用 reportlab 把 SVG 的 path 填充以 DeviceCMYK 重绘到 307.2pt 页面(300dpi)
# reportlab: canvas.setFillColorCMYK(c, m, y, k); 逐 path 绘制
# 2) 打开 PDF,注入 Illustrator 参考文件 XMP 元数据,另存 .ai
doc = fitz.open(out_pdf)
# XMP 包需含 illustrator 参考文件标识,使 AI 识别为原生(具体写法见项目脚本 convert_yuantu_ai.py)
doc.save(out_ai)
# 校验:用页面级 API(非 doc.get_images)
imgs = doc[0].get_images(full=True) # 页面级,可用
验证结果(真实性自证)
| 校验项 | 结果 |
|---|---|
| 内容流色彩算子 | 纯 DeviceCMYK 算子,无 RGB 算子(grep 内容流验证) |
| XMP 注入 | 已注入 Illustrator 参考文件元数据(AI 原生识别) |
| 交付文件 | 羊年吉羊_原图_CMYK300dpi矢量印刷.ai(≈1.35 MB,可编辑矢量) |
| 色彩空间校验 API | doc[0].get_images() 可用(已修正为页面级) |
环境版本
- PyMuPDF 1.28.0、reportlab 5.0.0(venv
envs\default) - OS:Windows 11
广告位占位 · post-inline