У меня была ваша точная проблема.Я возился с API, но в конце концов мне пришлось посмотреть на исходный код.Я придумал два решения.
Первое решение - изменить исходный код в соответствии с вашими потребностями (в конце концов, разве это не определение свободного программного обеспечения?).Исходный код можно извлечь из файла itextpdf-5.1.3-sources.jar (или любой имеющейся версии библиотеки).Строка, вызывающая проблему CMYK / RGB: строка 1650 файла PdfGraphics2D.java (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;
в начало файла. NB Ручки линии 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.Я лично использовал это для рисования черных шрифтов CMYK, используя метод drawGlyphVector.
Второе решение:
Если первое решение не работает для вас, вы всегда можете редактировать / анализировать PostScript напрямую,В своем методе создания PDF добавьте строку Document.compress = false;
после создания экземпляра PdfWriter.Теперь вы можете просмотреть файл PDF в текстовом редакторе.Осмотритесь вокруг, и вы найдете несколько строк, например 0 0 0 1 k
или 0 0 1 rg
. Эти строки задают цвета (черный CMYK и черный RGB соответственно).Строчные буквы после значений цвета (которые, кажется, являются плавающими) означают fill , а заглавные буквы - stroke .Таким образом, 0 0 0 1 K
будет черным штрихом CMYK и т. Д.
Вы можете читать PDF построчно и в основном выполнять поиск и замену (в Java, программно, конечно) для строк, заканчивающихсяв "рг".Надеюсь, что это имеет смысл.Не очень быстро, так как это требует дополнительного чтения и записи на диск ...
Надеюсь, это поможет.