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导出的图进行转换。由于这几张图是实验结果展示,并没有太多论文内容相关信息,因此笔者认为可以使用在线工具进行转换。但笔者不推荐使用在线工具对论文主要内容(例如模型架构图)进行转换,以防止论文泄露。
附录
参考资料
- LaTeX 定义颜色的几种方式
- Question: Can TeX specify a line color in CMYK?
- 维基百科:印刷四分色模式
- 颜色转换和油墨管理 (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}.")
本文来自博客园,作者:蓝莓夹心奥利奥,转载请注明原文链接:https://www.cnblogs.com/blueberryoreo/p/19019425

浙公网安备 33010602011771号