{
PDDocument document = null;
try
{
document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
// type 2 (exponential) function with attributes
// can be used by both shadings
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("0"));
c0.add(COSFloat.get("0"));
COSArray c1 = new COSArray();
c1.add(COSFloat.get("0.5"));
c1.add(COSFloat.get("1"));
c1.add(COSFloat.get("0.5"));
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);
// axial shading with attributes
PDShadingType2 axialShading = new PDShadingType2(new COSDictionary());
axialShading.setColorSpace(PDDeviceRGB.INSTANCE);
axialShading.setShadingType(PDShading.SHADING_TYPE2);
COSArray coords1 = new COSArray();
coords1.add(COSInteger.get(100));
coords1.add(COSInteger.get(400));
coords1.add(COSInteger.get(400));
coords1.add(COSInteger.get(600));
axialShading.setCoords(coords1);
axialShading.setFunction(func);
// 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(400));
coords2.add(COSInteger.get(600));
coords2.add(COSInteger.get(150)); // radius2
radialShading.setCoords(coords2);
radialShading.setFunction(func);
// create resources
PDResources resources = new PDResources();
page.setResources(resources);
// add shading to resources
// use put() if you want a specific name
resources.put(COSName.getPDFName("shax"), axialShading);