Рисование текста в JavaGraphics2D в CMYK - PullRequest
2 голосов
/ 21 декабря 2011

Если я использую

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();

Работает нормально, но цвета переводятся из sRGB Java в CMYK по iText. Я хочу рисовать прямо с цветами CMYK. Я пытаюсь сделать это в моем компоненте Swing

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

К сожалению, это просто не работает. Есть ли какой-то способ точно указать, какой цвет CMYK будет окрашен?

P.S. Исходная причина моей проблемы заключается в том, что если я рисую что-то в цветовой гамме, то в Adobe Illustrator цвет PDF не просто ( 0, 0, 0 , 0,4), а, например, ( 0,1, 0,15, 0,2 , 0,4f).

UPD: У меня есть решение: Просто используя g2.setPaint (новый CMYKColor (1f, 0.0f, 0.0f, 0.0f)); в твоей краске (Graphics2D g2) заставит iText производить CMYK Pdf

1 Ответ

2 голосов
/ 21 января 2012

У меня была ваша точная проблема.Я возился с 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, программно, конечно) для строк, заканчивающихсяв "рг".Надеюсь, что это имеет смысл.Не очень быстро, так как это требует дополнительного чтения и записи на диск ...

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...