2017-02-17 1 views
0

J'essaye de créer un pdf en utilisant la bibliothèque PDFBox en Java. Je dois créer un rectangle avec dégradé, mais je n'ai aucune idée de comment, et je ne trouve rien. Est-ce que quelqu'un peut m'aider avec cela?PDFBox - Rectangle avec dégradé

+2

Voir l'exemple CreateGradientShadingPDF.java du téléchargement du code source. Un extrait de ceci est dans la réponse :-) Il y a 7 différents types de gradients, mais habituellement le type 2 ou 3 sont ce que vous voulez. Prendre plaisir. –

+0

J'ai vu cela, mais je ne comprends pas. Avez-vous de la documentation sur la façon de créer des dégradés? –

+0

Il y a seulement la spécification PDF. http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf. Le problème est que vous devez savoir quel type de dégradé vous voulez créer (probablement axial), et à quoi il doit ressembler, c'est-à-dire quelles couleurs et où. –

Répondre

0

Trouvé cet exemple. Voir si cela fonctionne pour vous

COSDictionary fdict = new COSDictionary(); 

    fdict.setInt(COSName.FUNCTION_TYPE, 2); // still not understaning that... 

    COSArray domain = new COSArray(); 
    domain.add(COSInteger.get(0)); 
    domain.add(COSInteger.get(1)); 

    COSArray c0 = new COSArray(); 
    c0.add(COSFloat.get("0.64176")); 
    c0.add(COSFloat.get("0.72588")); 
    c0.add(COSFloat.get("0.78078")); 

    COSArray c1 = new COSArray(); 
    c1.add(COSFloat.get("0.57176")); 
    c1.add(COSFloat.get("0.62588")); 
    c1.add(COSFloat.get("0.70078")); 

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

    PDShadingType2 axialShading = new PDShadingType2(new COSDictionary()); 

    axialShading.setColorSpace(PDDeviceRGB.INSTANCE); 
    axialShading.setShadingType(PDShading.SHADING_TYPE2); 

    COSArray coords1 = new COSArray(); 
    coords1.add(COSInteger.get(0)); 
    coords1.add(COSInteger.get(0)); 
    coords1.add(COSInteger.get(850)); // size of my page 
    coords1.add(COSInteger.get(600)); 

    axialShading.setCoords(coords1); // so this sets the bounds of my gradient 
    axialShading.setFunction(func); // and this determines all the curves etc? 

    CStr.shadingFill(axialShading); // where CStr is a ContentStream for my PDDocument 
+0

Je l'ai vu, et je suis capable de créer un dégradé en arrière-plan - et cet exemple crée un triangle, pas un rectangle –

+0

S'il crée un triangle, cela signifie que vous avez déjà créé une forme de triangle. shadingFill() remplira toute région d'écrêtage et le chemin est actif à ce moment-là. –

+0

Je viens d'exécuter ce code, seulement je change les valeurs dans 'coords1' - mettre les valeurs 0,0,200,100. Quand je dessine un rect avant, il y avait un rectangle noir et un dégradé de triangle derrière ce rect. La même chose quand 'moveTo()' et 'lineTo()'. –