W weiserv
← 返回博客

把描摹 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