【问题标题】:How can I change a specific RGB color into a specific CMYK color in a PDF file?如何在 PDF 文件中将特定的 RGB 颜色更改为特定的 CMYK 颜色?
【发布时间】:2011-01-02 14:25:32
【问题描述】:

如果我有一个包含特定 RGB 颜色的对象(文本、艺术线条)的 PDF 文件,并且我想将这些对象转换为具有特定 CMYK 颜色,有哪些可用的库可以让我这样做?

请注意,我不需要将任意 RGB 值“映射”到“合适的”CMYK 值的能力 - 这些值是预先确定的。

.NET/C# 是首选,但我几乎可以考虑任何事情。

显然我更喜欢免费/开放图书馆而不是付费图书馆,但根据许可模式,我也会考虑付费图书馆。

【问题讨论】:

标签: pdf


【解决方案1】:

说实话?这是非常重要的。

PDF 渲染是通过描述将按顺序渲染的内容的程序完成的。有一个图形状态,它会累积程序所做的更改并标记页面。

可以通过多种不同的方式设置颜色。希望您的 PDF 文档仅使用 RG 和 rg 运算符,它们为描边和非描边操作设置 RGB 颜色。这意味着颜色操作将采用以下形式:

rf gf bf RG

其中 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

这意味着将颜色空间设置为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

这适用于黄色,但会中断设置为绿色的尝试,因为 CS 命令现在需要 4 个通道。

您需要做的是解释内容流,跟踪当前的颜色空间是什么,当有您想要更改颜色的 CS 命令进入时,您需要将其替换为 /DeviceCMYK CS cmyk SC然后下一个 rgb SC 命令需要更改为 /DeviceRGB CS rgb SC。

这没有考虑如何处理基于 ICC 的颜色空间、灰色、LAB、n 通道、颜色映射、图案、形式等。

PDF 不是用于编辑的。

如果我的任务是让这件事发生,我会做以下事情:

  1. 如果文件少于 10 个,我会在 Illustrator 中打开它们,更改颜色并以 PDF 格式导出
  2. 如果是 10 人或更多但少于 1000 人,我会雇用一名临时工来完成我在第 1 步中所做的工作。
  3. 如果是 1000 或更多但小于 10000,我会编写一个程序来编写 Illustrator 脚本以进行这些更改(如果可能)。
  4. 如果是 10000 或更多并且正在进行中,我会与管理层就文档制作进行认真的讨论,因为如果需要对终端文件格式进行此类更改并且无法正确重新生成。李>

【讨论】:

  • @Mr. Hawley:我知道这很重要,这就是我寻找库的原因 :-) 那里有个库可以读取 PDF 并提供高级 API 来修改它(或者更确切地说,写出修改后的版本)。 iText 库就是一个例子,我经常使用它。不幸的是,这不能做我在这里寻找的那种操作。我看过的另一个是 PdfTron - 可以 做这种事情 - 但我不喜欢他们的许可模式(而且,它太重了;我只需要这个功能)。
  • 不过,感谢您抽出宝贵时间整理出这个经过深思熟虑的答案。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2011-01-26
相关资源
最近更新 更多