如果我有一个包含特定 RGB 颜色的对象(文本、艺术线条)的 PDF 文件,并且我想将这些对象转换为具有特定的 CMYK 颜色,有哪些可用的库可以让我这样做?
请注意,我不需要能够从任意 RGB 值“映射”到“合适的”CMYK 值——这些值是预先确定的。
.NET/C# 首选,但我会考虑几乎任何东西。
显然,我更喜欢免费/开放的图书馆而不是付费图书馆,但根据许可模式,我也会考虑付费图书馆。
诚实地?这是令人难以置信的非平凡。
PDF 渲染是通过描述将按顺序渲染的内容的程序完成的。有一个图形状态,它累积程序所做的更改并标记页面。
有多种不同的方式可以设置颜色。希望您的 PDF 文档仅使用运算符 RG 和 rg,它们为描边和非描边操作设置 RGB 颜色。这意味着颜色操作将采用以下形式:
rf gf bf RG
Run Code Online (Sandbox Code Playgroud)
其中 rf、gf 和 bf 是浮点数,表示从 0.0 到 1.0 的颜色通道强度。
需要重写所有 RG 和 rg 运算符以分别使用 K 和 k,这将使用 4 通道 CMYK。
这本身就具有挑战性,因为您必须阅读所需的文档/页面,解析内容流并重写一个将替换旧流的新流(同样,可能但并非微不足道 - PDF 允许您通过在文件中附加一个新的生成来替换单个对象,如内容流)。不要考虑使用 SED。PDF 依赖于文件布局,在不保持相同长度的情况下更改内联内容会破坏 PDF。
如果文件使用 CS 和 cs 运算符,则会出现真正的问题。考虑以下操作序列:
/DeviceRGB CS 1 0 0 SC 0 0 m 200 200 l S 200 200 m 200 0 l 0 1 0 SC S
Run Code Online (Sandbox Code Playgroud)
这意味着将颜色空间设置为 DeviceRGB,将颜色设置为红色,移动到 (0, 0),线到 (200, 200),描边(红色),移动到 (200, 200),线到 (200, 0),设置颜色为绿色和描边。
这不是那么简单 - 如果您想将 RGB 红色更改为 CMYK 黄色,您可以这样做:
/DeviceCMYK CS 0 0 1 0 SC 0 0 m 200 200 l S 200 200 m 200 0 l 0 1 0 SC S
Run Code Online (Sandbox Code Playgroud)
这将适用于黄色,但会中断设置为绿色的尝试,因为 CS 命令现在需要 4 个通道。
你需要做的是解释内容流,跟踪当前的色彩空间是什么,当一个 CS 命令进入你想要改变的颜色时,你需要用 /DeviceCMYK CS cmyk SC 替换它,然后下一个 rgb SC 命令需要更改为 /DeviceRGB CS rgb SC。
这没有考虑如何处理基于 ICC 的颜色空间、灰度、LAB、n 通道、颜色映射、图案、形式等。
PDF 不是为了编辑而制作的。
如果我的任务是实现这一目标,我会执行以下操作: