PDF文件转换RGB颜色模式为CMYK颜色模式

背景

今天(8月2号)是AAAI2026截稿日,笔者在修改论文的时候发现AAAI有一个要求是论文中的图需要使用CMYK颜色模式,而不是RGB模式。

Using Color. Use of color is restricted to figures only. It must be WACG 2.0 compliant. (That is, the contrast ratio must be greater than 4.5:1 no matter the font size.) It must be CMYK, NOT RGB. It may never be used for any portion of the text of your paper. ——节选自AAAI AuthorKit26: AAAI Press Anonymous Submission Instructions for Authors Using LATEX

笔者论文中主要使用Mathcha进行绘图,然后使用其导出的Tikz代码块在Latex中进行微调和编译,最后得到PDF格式的文件放入论文中。Mathcha默认的颜色模式为RGB模式,导出的Tikz代码块中的颜色均使用RGB定义。为了能够批量将这些RGB定义的颜色转换为CMYK定义的颜色(以防万一因为这种事而被desk reject),笔者查阅了一些资料(见文章末尾),得到以下几种解决方案:编写程序匹配字符串批量转换RGB为CMYK(最复杂)、使用Adobe Acrobat对PDF文件进行直接转换(较方便)、利用网页工具转换PDF文件(可能会导致隐私泄露)

编写程序匹配字符串批量转换RGB为CMYK

作为学计算机的,笔者首先想到的是能不能直接在Latex代码上对其进行处理。然而在询问GPT无果后(GPT提供的方案无法成功编译),笔者准备通过程序批量将原本Latex代码中所有定义的RGB颜色转换为CMYK颜色。

Latex中常用的定义颜色方法为使用\definecolor{颜色名}{模式}{定义}在导言区定义颜色,然后可以在之后的地方使用颜色名来设置定义的颜色(见参考资料1、2)。Mathcha使用的是另一种方式,直接在Tikz代码块中使用{rgb, 255:red, [r]; green, [g]; blue, [b] }这种格式进行颜色定义,其中[r][g][b]分别为0-255的整数。而RGB模式和CMYK模式之间具有转换的公式(见参考资料3),因此可以首先利用正则表达式将源代码中的所有以上述格式定义的RGB颜色找出来,通过转换公式转换为CMYK模式定义后,再替换原本的颜色定义。这里使用参考资料1、2提供的方式定义CMYK模式的颜色并将这些定义输出在文件末尾,以供手动转移到导言区。Python代码见文章末尾

然而这种方式仅能够将使用Tikz绘制的图形的颜色转换为CMYK模式,无法将插入的图片颜色转换为CMYK模式。同时,笔者发现通过公式转换到的CMYK颜色与原本RGB颜色有差异。虽然这是正常现象,因为CMYK的色彩空间比RGB的色彩空间小,但是笔者发现这种方式最终得到的颜色差距过大,看起来像是给原本的图像加了一层比较浓的灰色滤镜。因此笔者尝试使用GPT推荐的使用Adobe Acrobat对PDF文件直接进行颜色转换。

使用Adobe Acrobat对PDF文件直接进行颜色转换

最开始GPT为笔者提供的方法即为使用Adobe Acrobat对PDF文件进行颜色转换,但由于笔者使用的Adobe Acrobat版本较老,并未找到GPT提到的颜色转换工具。在发现手动转换颜色偏差较大后,笔者去下载了比较新的Adobe Acrobat Pro DC,这个里面有专门对页面颜色进行转换的工具,也能够分析当前页面不同对象的颜色属于哪一种颜色模式(见参考资料4)。

使用Adobe Acrobat对颜色进行转换的方法很简单。在所有工具中找到Print Production(中文对应“使用印刷生产”),然后在这个工具栏中找到Convert Colors(中文对应“转换颜色”)。进入后,在Conversion Profile(中文对应“转换配置文件”)中选择U.S. Web Coated (SWOP) v2,然后点击确定,即可将所有页面转换为CMYK模式的颜色。左边还有一些细粒度的设置,具体可以见参考资料4。

屏幕截图
屏幕截图
屏幕截图

这种方式相对比较方便,并且不容易造成论文内容的泄露(是在本地完成的转换),转换后的颜色和原本的RGB模式的颜色相差没有特别大,因此较为适合对论文中的图进行颜色转换处理(笔者论文中大部分的图均用这种方式进行处理)。

利用网页工具对PDF文件进行颜色转换

Adobe Acrobat解决了Latex输出的PDF的文件颜色转换问题。但是笔者还有几张图是通过matplotlib绘制导出的PDF文件。笔者发现这几张图在使用Adobe Acrobat进行颜色转换后,其他部分都没什么问题,但是折线上的点变成了黑色。查找资料并没有相关解决方案。因此笔者选择查找网上的在线RGB转CMYK工具(pdf2cmyk)对这几张matplotlib导出的图进行转换。由于这几张图是实验结果展示,并没有太多论文内容相关信息,因此笔者认为可以使用在线工具进行转换。但笔者不推荐使用在线工具对论文主要内容(例如模型架构图)进行转换,以防止论文泄露。


附录

参考资料

  1. LaTeX 定义颜色的几种方式
  2. Question: Can TeX specify a line color in CMYK?
  3. 维基百科:印刷四分色模式
  4. 颜色转换和油墨管理 (Acrobat Pro)

批量转换代码

import re

def rgb_to_cmyk(rgb: tuple) -> tuple:
    r, g, b = rgb
    r, g, b = r / 255.0, g / 255.0, b / 255.0
    k = 1 - max(r, g, b)
    if k == 1:
        return (0, 0, 0, 1)
    c = (1 - r - k) / (1 - k)
    m = (1 - g - k) / (1 - k)
    y = (1 - b - k) / (1 - k)
    return (c, m, y, k)


def convert_rgb_to_cmykstyle(input_file: str, output_file: str):
    # {rgb, 255:red, 241; green, 241; blue, 241 }
    rgb_pattern = re.compile(r'\{\s*rgb,\s*(\d+):red,\s*(\d+);\s*green,\s*(\d+);\s*blue,\s*(\d+)\s*\}')
    colors = {} # k: (r, g, b) v: (color_name, cmyk_tuple)
    color_id = 0
    
    with open(output_file, 'wt', encoding='utf-8') as out_file:
        with open(input_file, 'r', encoding='utf-8') as in_file:
            for line in in_file:
                def replace_rgb(match):
                    # 提取RGB值
                    r = int(match.group(2))
                    g = int(match.group(3))
                    b = int(match.group(4))
                    
                    if (r, g, b) in colors:
                        # 如果颜色已存在,使用已有的颜色名称
                        color_name = colors[(r, g, b)][0]
                    else:
                        nonlocal color_id
                        # 如果颜色不存在,创建新的颜色名称并转换为CMYK格式
                        color_name = f'cmyk_color_{color_id}'
                        colors[(r, g, b)] = (color_name, rgb_to_cmyk((r, g, b)))
                        color_id += 1
                    
                    return color_name

                # 替换行中的所有rgb格式为cmyk格式
                new_line = rgb_pattern.sub(replace_rgb, line)
                out_file.write(new_line)
                    
    
    # 定义颜色的CMYK格式放在最后
    with open(output_file, 'a', encoding='utf-8') as out_file:
        out_file.write('\n% Define colors in CMYK format. You need to move them to the preamble.\n')
        out_file.write('% >>>\n')
        for (r, g, b), (color_name, cmyk) in colors.items():
            c, m, y, k = cmyk
            out_file.write(f'\\definecolor{{{color_name}}}{{cmyk}}{{{c:.3f}, {m:.3f}, {y:.3f}, {k:.3f}}}\n')
        out_file.write('% <<<\n')
        


if __name__ == "__main__":
    input_file = './input.tex'  # 输入文件路径
    output_file = './cmyk_output.tex'  # 输出文件路径
    convert_rgb_to_cmykstyle(input_file, output_file)
    print(f"Converted RGB values in {input_file} to CMYK format in {output_file}.")
posted @ 2025-08-03 00:02  蓝莓夹心奥利奥  阅读(238)  评论(0)    收藏  举报