在CMYK中使用JavaGraphics2D绘制iText

时间:2011-12-21 06:57:04

标签: java itext cmyk

如果我使用

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颜色?

P.S。我的问题的背景是,如果我用garyscale绘制一些东西,那么在Adobe 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

1 个答案:

答案 0 :(得分:2)

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

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

cb.setColorFill(new BaseColor(color));

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

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

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

import com.itextpdf.text.pdf.CMYKColor;

也是文件的顶部。 N.B。第1650行处理填充。如果你正在做笔画,只需在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的方法中,在实例化PdfWriter后添加行Document.compress = false;。现在,您可以在文本编辑器中查看PDF文件。搜索周围,你会发现一些像 0 0 0 1 k0 0 1 rg这些行设置颜色(分别为CMYK黑色和RGB黑色)。颜色值后面的小写字母(似乎是浮点数)表示填充,大​​写字母是描边。所以0 0 0 1 K将是CMYK黑色笔画等等。

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

希望有所帮助。