非官方 iText 4.2.1:纯创建的洋红色包含 44% 的黄色

Unofficial iText 4.2.1: Purely created magenta color contains 44% of yellow

以下问题:我在pdf文档上画了一条洋红色的线。在此之前,我创建了一个新的颜色对象,例如:

CMYKColor magentaColor = new CMYKColor(0.f, 1.f, 0.f, 0.f);

然后我将 PDFContentByte 的颜色设置为:

PdfContentByte cb = pdfWriter.getDirectContent();
cb.setColorStroke(magentaColor);

将 pdfWriter 的构造函数作为参数来创建 class 的实例. 我不明白的是为什么 pdf 文档上的线条颜色不是 100% 洋红色而是包含大约 44% 的黄色。 Here 您可以找到包含所描述行的 pdf。

请看一下DrawingLines例子:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfContentByte canvas = writer.getDirectContent();
    CMYKColor magentaColor = new CMYKColor(0.f, 1.f, 0.f, 0.f);
    canvas.setColorStroke(magentaColor);
    canvas.moveTo(36, 36);
    canvas.lineTo(36, 806);
    canvas.lineTo(559, 36);
    canvas.lineTo(559, 806);
    canvas.closePathStroke();
    document.close();
}

生成文件 draw_lines.pdf:

颜色仅为洋红色:

当我查看您的 PDF 时,我看到了不同的值:

在我期望 0 1 0 0 K 的地方,我看到了 0 1 0.44 0 K。我还看到您正在使用标记为 /ITXT: 4.2.0 的内容。前缀 ITXT 由 iText Group NV 在 ISO 注册。只有 iText Group 被允许在其软件中使用此前缀。您正在使用版本号为 4.2.0 的软件。 iText Group NV 从未发布过 iText 4.2.0。是流氓版

请与那些强迫你使用这个非官方版本的人分享这个,并告诉他们应该升级。

这似乎是色彩管理问题。当绘制 100% 洋红色线条 CMYK(0,100,0,0) 并将文档来回转换为 RGB 时,线条不再只是 100% 洋红色。

原因是,RGB(和 CIELab)都是 3 维颜色 space,而 CMYK 有 4 维。只需要三个维度来描述颜色的视觉印象。

使用 CMYK 中的第 4 个维度,您可以管理颜色的配置。 RGB 和 CIELab 只为特定颜色提供一种配置,而 CMYK 提供大量配置来描述一种相同的视觉印象。

例如,30% 灰色的颜色代码是 RGB(74,74,75)。使用 CMYK,您可以使用 CMYK(0,0,0,30)(仅黑色)或 CMYK(25,18,17,0)(无黑色)来描述同一个点。两种 CMYK 配置具有相同的 视觉印象。此行为用于 UCR(底色移除)和 GCR(灰色组件替换)。

因此,请确保您的 PDF 不会在不必要的情况下来回转换为 RGB(或任何其他颜色 space)。