2

如果我使用

PdfContentByte cb = writer.getDirectContent();
cb.setColorFill(new CMYKColor(c, m, y, k));

这很简单。但是我有一些 Swing 组件,它们在 Graphics2D 中绘制自我,使用这样的东西非常有说服力:

PdfContentByte cb = writer.getDirectContent();
Graphics2D g2 cb.createGraphics(w, h);
mySwingComponent.paint(g2);
g2.dispose();

它工作正常,但颜色由 iText 从 java 的 sRGB 转换为 CMYK。我想用 CMYK 颜色直接绘制。我正在尝试在我的 Swing 组件中这样做

MySwingComponent extends JComponenet {
    void paint(Graphics2D g2) {
        g.setColor(new com.lowagie.text.pdf.CMYKColor(0, 0, 0, 1));
    }
}

不幸的是,它只是不起作用。有什么方法可以准确地指定将绘制哪种 CMYK 颜色?

PS 我的问题的背景是,如果我以 garyscale 绘制东西,那么在 Adob​​e Illustrator 中,PDF 颜色不仅仅是(0、0、0、0.4 ) ,而是(0.1、0.15、0.2、0.4f)。

UPD:我现在有解决方案:只需使用 g2.setPaint(new CMYKColor(1f, 0.0f, 0.0f, 0.0f)); 在您的绘画中(Graphics2D g2)将强制 iText 生成 CMYK Pdf

4

1 回答 1

2

我有你的确切问题。我搞砸了 API,但最后不得不查看源代码。我想出了两个解决方案。

第一个解决方案是修改源代码以满足您的需求(毕竟,这不是自由软件的定义吗?)。可以从 itextpdf-5.1.3-sources.jar 文件(或您拥有的任何版本的库)中提取源代码。导致 CMYK/RGB 问题的PdfGraphics2D.java文件 (com/itextpdf/text/pdf/PdfGraphics2D.java) 的第 1650 行。你应该看到一行写着:

cb.setColorFill(new BaseColor(color));

如果您想要快速而肮脏的修复,只需将该行更改为:

cb.setColorFill(new CMYKColor(0f, 0f, 0f, 1f));

当然,这会将您限制为一种颜色,但现在您知道哪一行正在处理实际颜色,您可以修改类并添加一些功能/状态(如果需要)。您需要添加

import com.itextpdf.text.pdf.CMYKColor;

到文件的顶部。NB Line 1650 处理填充。如果你在做strokes,只需在 else 语句中修改相同的内容(查看文件时应该很清楚)。

编译源码:

javac -cp path/to/itextpdf-5.1.3.jar path/to/PdfGraphics2D.java

更改到 itextpdf-5.1.3-sources 文件夹的根目录并更新 jar:

jar uf path/to/itextpdf-5.1.3.jar com/itextpdf/text/pdf/PdfGraphics2D.class

就是这样!您的 PDF 文件现在将使用您指定的 CMYK 值呈现颜色。这对于简单的事情来说非常有用,但是如果您需要更多功能,则必须对 PdfGraphics2D 类进行更多修改。我个人使用它使用 drawGlyphVector 方法绘制 CMYK 黑色字体。

第二种解决方案:

如果第一个解决方案不适合您,您可以随时直接编辑/解析 PostScript。在创建 PDF 的方法中,Document.compress = false;在实例化 PdfWriter 之后添加该行。现在您可以在文本编辑器中查看 PDF 文件。搜索一下,你会发现一些类似 0 0 0 1 k0 0 1 rg的线条。这些线条正在设置颜色(分别为 CMYK 黑色和 RGB 黑色)。颜色值后的小写字母(看起来是浮点数)表示填充,大写字母是stroke0 0 0 1 KCMYK 黑色笔画也是如此。

您可以逐行阅读 PDF,并且基本上对以“rg”结尾的行进行“搜索和替换”(当然是在 Java 中,以编程方式)。希望这是有道理的。不是非常快,因为这需要额外的磁盘读写......

希望有帮助。

于 2012-01-21T11:16:57.480 回答