PDFBox пунктиром с градиентом - PullRequest
0 голосов
/ 06 марта 2019

Я уже могу добавить строку с помощью contentStream с методами:

setLineWidth (h) - установить толщину линии

setLineDashPattern (pattern, period) - шаблон создает необходимое пространство и точки, например, новый float [] {0.075,2}

setLineCapStyle (2) - установить все точки в виде прямоугольника

moveTo (x, y) - установить начальную точку

lineTo (x, y) - установить конечную точку

штрих () - строка печати

но теперь для меня нужно создать градиент от центра точки до края точки

Может кто-нибудь дать мне совет, как добавить градиент?

1 Ответ

2 голосов
/ 07 марта 2019

Это основано на примере CreateGradientShadingPDF.java в исходном коде.Два круга имеют одинаковую позицию, но второй пустой.В функции c0 - белый, а c1 - черный.

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

// type 2 (exponential) function with attributes
COSDictionary fdict = new COSDictionary();
fdict.setInt(COSName.FUNCTION_TYPE, 2);
COSArray domain = new COSArray();
domain.add(COSInteger.get(0));
domain.add(COSInteger.get(1));
COSArray c0 = new COSArray();
c0.add(COSFloat.get("1"));
c0.add(COSFloat.get("1"));
c0.add(COSFloat.get("1"));
COSArray c1 = new COSArray();
c1.add(COSFloat.get("0"));
c1.add(COSFloat.get("0"));
c1.add(COSFloat.get("0"));
fdict.setItem(COSName.DOMAIN, domain);
fdict.setItem(COSName.C0, c0);
fdict.setItem(COSName.C1, c1);
fdict.setInt(COSName.N, 1);
PDFunctionType2 func = new PDFunctionType2(fdict);

// radial shading with attributes
PDShadingType3 radialShading = new PDShadingType3(new COSDictionary());
radialShading.setColorSpace(PDDeviceRGB.INSTANCE);
radialShading.setShadingType(PDShading.SHADING_TYPE3);
COSArray coords2 = new COSArray();
coords2.add(COSInteger.get(100));
coords2.add(COSInteger.get(400));
coords2.add(COSInteger.get(50)); // radius1
coords2.add(COSInteger.get(100));
coords2.add(COSInteger.get(400));
coords2.add(COSInteger.get(0)); // radius2
radialShading.setCoords(coords2);
radialShading.setFunction(func);

// invoke shading from content stream
// compress parameter is set to false so that you can see the stream in a text editor
try (PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, false))
{
    contentStream.shadingFill(radialShading);
}

Дополнительную информацию о радиальном затенении можно найти в спецификации PDF 32000 .

...