#java #pdf #pdfbox
#java #PDF #pdfbox ( pdf-файл)
Вопрос:
Я столкнулся с проблемой, заключающейся в том, что я пытаюсь нарисовать прямоугольник точечными цветами (PDSeparation), один для обводки и один для обводки (заливки).
Первые значения цвета: spotColorName = цвет штриха 6, R = 255, G = 153, B = 51
Вторые значения цвета: spotColorName = цвет заливки 6, R = 0, G = 0, B = 255
Это скриншот вывода в формате PDF
вот код, который создает разделение и цвет
private PDColor createSpotColorFromRGB(String spotColorName, int r,
int g, int b) throws IOException {
PDSeparation seperation = new PDSeparation();
COSDictionary dictionary = new COSDictionary();
COSArray C0 = new COSArray();
COSArray C1 = new COSArray();
COSArray range = new COSArray();
COSArray domain = new COSArray();
float[] components = null;
seperation.setColorantName(spotColorName);
components = new float[] { r / 255f, g / 255f, b / 255f };
seperation.setAlternateColorSpace(PDDeviceRGB.INSTANCE);
C0.add(COSInteger.ZERO);
C0.add(COSInteger.ZERO);
C0.add(COSInteger.ZERO);
range.add(COSInteger.ZERO);
range.add(COSInteger.ONE);
range.add(COSInteger.ZERO);
range.add(COSInteger.ONE);
range.add(COSInteger.ZERO);
range.add(COSInteger.ONE);
C1.add(COSInteger.ONE);
C1.add(COSInteger.ONE);
C1.add(COSInteger.ONE);
domain.add(COSInteger.ZERO);
domain.add(COSInteger.ONE);
dictionary.setItem(COSName.C0, C0);
dictionary.setItem(COSName.C1, C1);
dictionary.setItem(COSName.DOMAIN, domain);
dictionary.setItem(COSName.FUNCTION_TYPE, COSInteger.TWO);
dictionary.setItem(COSName.N, COSInteger.ONE);
dictionary.setItem(COSName.RANGE, range);
PDFunction functionTyp2 = new PDFunctionType2(dictionary);
seperation.setTintTransform(functionTyp2);
return new PDColor(components, seperation);
}
затем я устанавливаю сгенерированные цвета для потока содержимого страницы с помощью
outputPageContentStream.setNonStrokingColor(fillColor);
outputPageContentStream.setStrokingColor(strokeColor);
Отображается только один цвет из 2 цветов, отображается цвет с 1 scn / SCN.
Прикрепленный выходной PDF-файл: https: //docdro.id/0sVSuWE
Код для рисования таков:
outputPageContentStream.saveGraphicsState();
outputPageContentStream.setNonStrokingColor(fillingColorForDrawingPDColor);
outputPageContentStream.setStrokingColor(strokingColorForDrawingPDColor);
outputPageContentStream.moveTo(a, b);
outputPageContentStream.lineTo(a c, b);
outputPageContentStream.lineTo(a c, b - d);
outputPageContentStream.lineTo(a, b - d);
outputPageContentStream.closePath();
outputPageContentStream.fillAndStroke();
outputPageContentStream.restoreGraphicsState();
Кто-нибудь может помочь с этим?
Ответ №1:
Я просмотрел файл с помощью PDFBox PDFDebugger, и значение cs1 равно 0 («0 scn» на скриншоте), что означает, что он будет отображаться как белый. (Вы должны посмотреть на создание «fillingColorForDrawingPDColor»).
Это потому, что C0 (нижняя граница, значение 0) равно (1, 1, 1), которое является белым. C1 (верхняя граница, значение 1) равно (0, 0, 1), которое является синим. Цвета между ними вычисляются с помощью функции преобразования оттенков.
Обновить:
Этот код
components = new float[] { r / 255f, g / 255f, b / 255f };
...
return new PDColor(components, seperation);
показывает недоразумение. Для цвета разделения требуется только один цвет, который находится между 0 и 1. То, что конечный цвет «красочный», связано со значениями в C0 (минимальное) и C1 (максимальное) и функцией для создания цветов между ними.
RGB является «целевым» цветовым пространством для альтернативного цветового пространства. Цвета разделения предназначены для «специальных» цветов, например, золотого, блестящего, металлического, флуоресцентного и т. Д. Альтернативное цветовое пространство имитирует это для случаев, когда фактический цвет недоступен (например, дисплей).
В примере для PDSeparation в исходном коде (или здесь) есть это
PDColor color = new PDColor(new float[]{0.5f}, spotColorSpace);
Комментарии:
1. Приложив код для создания цвета в вопросе, не могли бы вы, пожалуйста, взглянуть на то, в чем может быть проблема?
2. Ничего не прикреплено. Код для создания «fillingColorForDrawingPDColor» не показан в вашем вопросе. SO призывает включать рабочие программы, но ваша — нет, так что можно только догадываться. Вероятно, при создании «fillingColorForDrawingPDColor» будет «0».
3. Я отредактировал вопрос, и вы можете увидеть функцию, которая создает цвет «createSpotColorFromRGB», не могли бы вы помочь?
4. Создание «fillingColorForDrawingPDColor» по-прежнему отсутствует. Кстати, компонентам нужен только 1 элемент, который имеет любое значение от 0 до 1. В примере для PDSeparation есть это: «Цвет PDColor = новый PDColor(новый float[]{0.5f}, spotColorSpace);»
5. Вы подразумеваете под созданием это заполнениеcolorfordrawingpdcolor = createSpotColorFromRGB(spotColorName, r, g, b); extendedGraphicsStateForDrawing.setNonStrokingAlphaConstant(1f); strokingColorForDrawingPDColor = createSpotColorFromRGB(spotColorName, r, g , b); extendedGraphicsStateForDrawing.setStrokingAlphaConstant(1f); Компоненты должны состоять из 3 компонентов, так как это RGB, верно?